import 'package:flutter/material.dart';
import 'package:freezer/api/deezer.dart';
import 'package:freezer/api/definitions.dart';
import 'package:freezer/api/player.dart';
import 'package:freezer/ui/error.dart';
import 'package:freezer/ui/menu.dart';
import 'tiles.dart';
import 'details_screens.dart';
import '../settings.dart';

class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return SingleChildScrollView(
      child: Column(
        mainAxisSize: MainAxisSize.min,
        children: <Widget>[
          SafeArea(
            child: FreezerTitle(),
          ),
          Flexible(child: HomePageScreen(),)
        ],
      ),
    );
  }
}

class FreezerTitle extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: EdgeInsets.fromLTRB(0, 24, 0, 8),
      child: Row(
        mainAxisSize: MainAxisSize.max,
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Row(
            mainAxisSize: MainAxisSize.min,
            children: <Widget>[
              Image.asset('assets/icon.png', width: 64, height: 64),
              Text(
                'freezer',
                style: TextStyle(
                    fontSize: 56,
                    fontWeight: FontWeight.w900
                ),
              )
            ],
          )
        ],
      ),
    );
  }
}



class HomePageScreen extends StatefulWidget {

  final HomePage homePage;
  final DeezerChannel channel;
  HomePageScreen({this.homePage, this.channel, Key key}): super(key: key);

  @override
  _HomePageScreenState createState() => _HomePageScreenState();
}

class _HomePageScreenState extends State<HomePageScreen> {

  HomePage _homePage;
  bool _cancel = false;
  bool _error = false;

  void _loadChannel() async {
    HomePage _hp;
    //Fetch channel from api
    try {
      _hp = await deezerAPI.getChannel(widget.channel.target);
    } catch (e) {}
    if (_hp == null) {
      //On error
      setState(() => _error = true);
      return;
    }
    setState(() => _homePage = _hp);
  }
  void _loadHomePage() async {
    //Load local
    try {
      HomePage _hp = await HomePage().load();
      setState(() => _homePage = _hp);
    } catch (e) {}
    //On background load from API
    try {
      if (settings.offlineMode) await deezerAPI.authorize();
      HomePage _hp = await deezerAPI.homePage();
      if (_hp != null) {
        if (_cancel) return;
        if (_hp.sections.length == 0) return;
        setState(() => _homePage = _hp);
        //Save to cache
        await _homePage.save();
      }
    } catch (e) {}
  }

  void _load() {
    if (widget.channel != null) {
      _loadChannel();
      return;
    }
    if (widget.channel == null && widget.homePage == null) {
      _loadHomePage();
      return;
    }
    if (widget.homePage.sections == null || widget.homePage.sections.length == 0) {
      _loadHomePage();
      return;
    }
    //Already have data
    setState(() => _homePage = widget.homePage);
  }

  @override
  void initState() {
    super.initState();
    _load();
  }

  @override
  void dispose() {
    _cancel = true;
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    if (_homePage == null)
      return Center(child: Padding(
        padding: EdgeInsets.all(8.0),
        child: CircularProgressIndicator(),
      ));
    if (_error)
      return ErrorScreen();
    return ListView.builder(
      shrinkWrap: true,
      physics: NeverScrollableScrollPhysics(),
      itemCount: _homePage.sections.length,
      itemBuilder: (context, i) {
        HomePageSection section = _homePage.sections[i];
        return Column(
          mainAxisSize: MainAxisSize.min,
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Padding(
              child: Text(
                section.title,
                textAlign: TextAlign.left,
                maxLines: 2,
                overflow: TextOverflow.ellipsis,
                style: TextStyle(
                  fontSize: 20.0,
                  fontWeight: FontWeight.bold
                ),
              ),
              padding: EdgeInsets.symmetric(horizontal: 8.0, vertical: 8.0)
            ),

            SingleChildScrollView(
              scrollDirection: Axis.horizontal,
              child: Row(
                children: List.generate(section.items.length + 1, (i) {
                  //Has more items
                  if (i == section.items.length) {
                    if (section.hasMore??false) {
                      return FlatButton(
                        child: Text(
                          'Show more',
                          textAlign: TextAlign.center,
                          style: TextStyle(
                              fontSize: 20.0
                          ),
                        ),
                        onPressed: () => Navigator.of(context).push(MaterialPageRoute(
                            builder: (context) => Scaffold(
                              appBar: AppBar(
                                title: Text(section.title),
                              ),
                              body: SingleChildScrollView(
                                child: HomePageScreen(
                                  channel: DeezerChannel(target: section.pagePath)
                                )
                              ),
                            ),
                        )),
                      );
                    }
                    return Container(height: 0, width: 0);
                  }

                  //Show item
                  HomePageItem item = section.items[i];
                  return HomePageItemWidget(item);
                }),
              ),
            ),
          ],
        );
      },
    );
  }
}


class HomePageItemWidget extends StatelessWidget {

  HomePageItem item;
  HomePageItemWidget(this.item);

  @override
  Widget build(BuildContext context) {

    switch (item.type) {
      case HomePageItemType.SMARTTRACKLIST:
        return SmartTrackListTile(
          item.value,
          onTap: () {
            playerHelper.playFromSmartTrackList(item.value);
          },
        );
      case HomePageItemType.ALBUM:
        return AlbumCard(
          item.value,
          onTap: () {
            Navigator.of(context).push(MaterialPageRoute(
                builder: (context) => AlbumDetails(item.value)
            ));
          },
          onHold: () {
            MenuSheet m = MenuSheet(context);
            m.defaultAlbumMenu(item.value);
          },
        );
      case HomePageItemType.ARTIST:
        return ArtistTile(
          item.value,
          onTap: () {
            Navigator.of(context).push(MaterialPageRoute(
                builder: (context) => ArtistDetails(item.value)
            ));
          },
          onHold: () {
            MenuSheet m = MenuSheet(context);
            m.defaultArtistMenu(item.value);
          },
        );
      case HomePageItemType.PLAYLIST:
        return PlaylistCardTile(
          item.value,
          onTap: () {
            Navigator.of(context).push(MaterialPageRoute(
                builder: (context) => PlaylistDetails(item.value)
            ));
          },
          onHold: () {
            MenuSheet m = MenuSheet(context);
            m.defaultPlaylistMenu(item.value);
          },
        );
      case HomePageItemType.CHANNEL:
        return ChannelTile(
          item.value,
          onTap: () {
            Navigator.of(context).push(MaterialPageRoute(
                builder: (context) => Scaffold(
                  appBar: AppBar(title: Text(item.value.title.toString()),),
                  body: SingleChildScrollView(
                    child: HomePageScreen(channel: item.value,)
                  ),
                )
            ));
          },
        );
    }
    return Container(height: 0, width: 0);
  }
}
