import 'dart:convert' as convert;
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:zhiying_base_widget/pages/main_page/notifier/main_page_notifier.dart';
import 'package:zhiying_base_widget/widgets/custom/goods/category_goods/category_goods_callback.dart';
import 'package:zhiying_base_widget/widgets/home/home_goods/bloc/home_goods_bloc.dart';
import 'package:zhiying_base_widget/widgets/home/home_goods/home_goods_item.dart';
import 'package:zhiying_base_widget/widgets/home/home_goods/home_goods_item_single.dart';
import 'package:zhiying_base_widget/widgets/home/home_goods/models/home_goods_model.dart';
import 'package:zhiying_base_widget/widgets/home/home_goods/models/home_goods_style_model.dart';
import 'package:zhiying_comm/util/base_bloc.dart';
import 'package:zhiying_comm/zhiying_comm.dart';

class CustomGoods extends StatefulWidget implements CategoryGoodsOnClickCallBack {
  final Map<String, dynamic> data;
  HomeGoodsBloc bloc;

  CustomGoods(this.data, {this.bloc, Key key,}) : super(key: key);

  @override
  _CustomGoodsState createState() => _CustomGoodsState();

  @override
  void onTap(int index, String providerType) {
    Logger.warn('onCallBack : index = $index, providerType = $providerType');
  }
}

class _CustomGoodsState extends State<CustomGoods> {
  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return BlocProvider<HomeGoodsBloc>(
      bloc: widget?.bloc ?? HomeGoodsBloc(),
      child: CustomGoodsContainer(widget.data),
    );
  }

  @override
  void dispose() {
    widget?.bloc?.dispose();
    super.dispose();
  }
}

class CustomGoodsContainer extends StatefulWidget {
  final Map<String, dynamic> data;

  CustomGoodsContainer(this.data, {Key key}) : super(key: key);

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

class _CustomGoodsContainerState extends State<CustomGoodsContainer> {
  HomeGoodsBloc _bloc;
  String _provider = '';
  HomeGoodsStyleModel _style;
  bool _isFirstLoading = true;

  @override
  void initState() {
    _bloc = BlocProvider.of<HomeGoodsBloc>(context);

    String d = widget.data['data'];
    dynamic json = convert.jsonDecode(d);
    _style = HomeGoodsStyleModel.fromJson(Map<String, dynamic>.from(json));

    // widget.eventBus.on<HomeGoodsHeaderEvent>().listen((data) {
    //   // if (!_isFirstLoading) {
    //   //   // 老板说打开app的时候，第一次加载不要显示loading
    //   //   Loading.show(context);
    //   // }
    //   _isFirstLoading = false;
    //   _provider = data.provider;
    //   _bloc.loadMore(_provider);
    // });

    // TODO

    super.initState();
  }

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    print('didChangeDependencies');
    bool isNeedLoadMore = Provider.of<MainPageNotifier>(context).scrollEnd;
    if (isNeedLoadMore && _provider != '') {
      changeProviderOrLoadMore(_provider);
    }
  }

  @override
  Widget build(BuildContext context) {
    return StreamBuilder<List<HomeGoodsModel>>(
      stream: _bloc.outData,
      builder: (BuildContext context, AsyncSnapshot snapshot) {
        // if (snapshot.data == null) {
        //   return SliverToBoxAdapter(
        //     child: HomeGoodsSkeleton(),
        //   );
        // }
        // Loading.dismiss();
        List<HomeGoodsModel> goods = snapshot.data;
        int column = int.tryParse(_style.listColumn ?? '1');
        column = column <= 0 ? 1 : column;
        int count = ((goods?.length ?? 0) / column).ceil();
        return SliverList(
          delegate: SliverChildBuilderDelegate((context, index) {
            if (column == 1) {
              return HomeGoodsItemSingle(
                goods[index],
                _style,
                data: widget.data,
              );
            } else {
              // return Container(color: Colors.red, height: 126,margin: EdgeInsets.all(10),);
              return Padding(
                padding: const EdgeInsets.only(left: 5, right: 5),
                child: Row(
                  children: List.generate(column, (c) {
                    int i = index * column + c;
                    return Expanded(
                      child: i < goods.length
                          ? HomeGoodsItem(
                              goods[i],
                              _style,
                              data: widget.data,
                            )
                          : Container(),
                    );
                  }).toList(),
                ),
              );
            }
          }, childCount: count),
        );
      },
    );
  }


  // Global Key
  void changeProviderOrLoadMore(String provider){
    _bloc.loadMore(_bloc.providerss);
  }


}
