import 'dart:ui';

import 'package:dio/dio.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_baidu_mapapi_map/flutter_baidu_mapapi_map.dart';
import 'package:flutter_baidu_mapapi_utils/flutter_baidu_mapapi_utils.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:huixiang/generated/l10n.dart';
import 'package:huixiang/main.dart';
import 'package:huixiang/retrofit/data/base_data.dart';
import 'package:huixiang/retrofit/data/store.dart';
import 'package:huixiang/retrofit/retrofit_api.dart';
import 'package:huixiang/store/scan.dart';
import 'package:huixiang/utils/event_type.dart';
import 'package:huixiang/utils/location.dart';
import 'package:huixiang/view_widget/classic_header.dart';
import 'package:huixiang/view_widget/custom_image.dart';
import 'package:huixiang/view_widget/icon_text.dart';
import 'package:huixiang/view_widget/item_title.dart';
import 'package:huixiang/view_widget/my_appbar.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_baidu_mapapi_base/flutter_baidu_mapapi_base.dart';

class UnionPage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _UnionPage();
  }
}

class _UnionPage extends State<UnionPage>
    with AutomaticKeepAliveClientMixin, WidgetsBindingObserver {
  final RefreshController refreshController =
      RefreshController(initialRefresh: false);
  ApiService apiService;
  bool isKeyBoardShow = false;
  BMFCoordinate latLng;

  @override
  void dispose() {
    super.dispose();
    WidgetsBinding.instance.removeObserver(this);
    if (Location.getInstance() != null &&
        Location.getInstance().aMapFlutterLocation != null)
      Location.getInstance().aMapFlutterLocation.stopLocation();

    if (refreshController != null) refreshController.dispose();
  }

  @override
  void didChangeMetrics() {
    super.didChangeMetrics();
    WidgetsBinding.instance.addPostFrameCallback((_) {
      setState(() {
        print("object: ${MediaQuery.of(context).viewInsets.bottom}");
        if (MediaQuery.of(context).viewInsets.bottom == 0) {
          if (isKeyBoardShow) {
            isKeyBoardShow = false;
            //关闭键盘 软键盘关闭了, 清除输入控件的焦点, 否则重新进入页面会导致软键盘再弹出问题
            FocusScope.of(context).requestFocus(FocusNode());
          }
        } else {
          isKeyBoardShow = true;
        }
      });
    });
  }

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);

    eventBus.on<EventType>().listen((event) {
      if (event.type < 3) {
        setState(() {});
      }
    });

    getLatLng();
    startLocation();
  }

  startLocation() async {
    EasyLoading.show(status: S.current.zhengzaijiazai);

    Location.getInstance()
        .aMapFlutterLocation
        .onResultCallback()
        .listen((event) {
      if (event != null &&
          event["latitude"] != null &&
          event["longitude"] != null) {
        print("location: $event");
        if (event["latitude"] is String && event["longitude"] is String) {
          latLng = BMFCoordinate(double.tryParse(event["latitude"]),
              double.tryParse(event["longitude"]));
        } else {
          latLng = BMFCoordinate(event["latitude"], event["longitude"]);
        }
        BMFCalculateUtils.coordConvert(
                coordinate: latLng,
                fromType: BMF_COORD_TYPE.BD09LL,
                toType: BMF_COORD_TYPE.COMMON)
            .then((value) {
          this.latLng = value;
          saveLatLng(
              value, event["province"], event["city"], event["district"]);
          print("union: Location result ${value.latitude}  "
              "${value.longitude}");
          Location.getInstance().stopLocation();
          queryStore(
              "${value.latitude}",
              "${value.longitude}",
              event["province"],
              event["city"],
              event["district"],
              editingController.text);
          if (_mapController != null)
            _mapController.updateMapOptions(BMFMapOptions(
              center: value,
              zoomLevel: 15,
            ));
        });
      } else {
        EasyLoading.dismiss();
      }
    });

    Location.getInstance().prepareLoc();
    Location.getInstance().startLocation(context).then((value) {
      if (!value) {
        EasyLoading.dismiss();
        refreshController.refreshFailed();
      }
    });
  }

  saveLatLng(BMFCoordinate latLng, province, city, district) async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    await prefs.setString("latitude", "${latLng.latitude}");
    await prefs.setString("longitude", "${latLng.longitude}");
    if (province != null) await prefs.setString("province", province);
    if (city != null) await prefs.setString("city", city);
    if (district != null) await prefs.setString("district", district);
  }

  getLatLng() async {
    SharedPreferences.getInstance().then(
      (value) => {
        apiService = ApiService(Dio(),
            context: context,
            token: value.getString('token'),
            showLoading: false),
        if (value.containsKey("latitude") &&
            value.containsKey("longitude") &&
            value.containsKey("province") &&
            value.containsKey("city") &&
            value.containsKey("district"))
          {
            latLng = BMFCoordinate(double.tryParse(value.getString("latitude")),
                double.tryParse(value.getString("longitude"))),
            queryStore(
              value.getString("latitude"),
              value.getString("longitude"),
              value.getString("province"),
              value.getString("city"),
              value.getString("district"),
              editingController.text,
            ),
            setState(() {
              if (_mapController != null) {
                _mapController.updateMapOptions(BMFMapOptions(
                  center: latLng,
                  zoomLevel: 15,
                ));
              }
            })
          }
        else
          {
            queryStore("", "", "", "", "", editingController.text),
          }
      },
    );
  }

  List<Store> storeList;

  queryStore(latitude, longitude, province, city, district, searchKey) async {
    BaseData<List<Store>> baseData = await apiService.queryStore({
      // "city": city,
      // "district": district,
      // "province": province,
      "latitude": latitude,
      "longitude": longitude,
      "searchKey": searchKey
    }).catchError((error) {
      refreshController.refreshFailed();
    });
    if (baseData != null && baseData.isSuccess) {
      storeList = baseData.data;
      refreshController.refreshCompleted();
    } else {
      refreshController.refreshFailed();
    }
    EasyLoading.dismiss();
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    super.build(context);
    return GestureDetector(
      onTap: () {
        FocusScope.of(context).requestFocus(FocusNode());
      },
      child: Scaffold(
        resizeToAvoidBottomInset: false,
        appBar: MyAppBar(
          titleChild: buildSearchItem(),
          leading: false,
          brightness: Brightness.light,
        ),
        body: Column(
          children: [
            PreferredSize(
              preferredSize: Size(double.infinity, 52.h),
              child: Container(
                padding: EdgeInsets.only(top: 20.h),
                color: Color(0xFFFAFAFA),
                child: ItemTitle(
                  text: S.of(context).jingbilianmenghuiyuandian,
                  imgPath: "assets/image/icon_union_store.png",
                ),
              ),
            ),
            buildItem(),
          ],
        ),
      ),
    );
  }

  Widget buildItem() {
    return Container(
      height: MediaQuery.of(context).size.height -
          103.h -
          MediaQuery.of(context).padding.top,
      child: SmartRefresher(
        controller: refreshController,
        enablePullUp: false,
        enablePullDown: true,
        physics: BouncingScrollPhysics(),
        header: MyHeader(),
        onRefresh: () {
          startLocation();
        },
        child: ListView.builder(
            itemCount: storeList == null ? 0 : storeList.length,
            padding: EdgeInsets.only(
              top: 8.h,
              bottom: 84.h, /* + (375.h - 88.h) + 4.h*/
            ),
            physics: NeverScrollableScrollPhysics(),
            itemBuilder: (context, position) {
              return InkWell(
                onTap: () {
                  if (storeList[position].posType.code == "NORMALSTORE") {
                    Scan.toScan(
                      context,
                      storeList[position].id,
                      storeList[position].tenantCode,
                      storeList[position].storeName,
                    );
                  } else {
                    Navigator.of(context).pushNamed(
                      '/router/store_order',
                      arguments: {
                        "id": storeList[position].id,
                        "tenant": storeList[position].tenantCode,
                        "storeName": storeList[position].storeName
                      },
                    );
                  }
                },
                child: buildStoreItem(storeList[position], position),
              );
            }),
      ),
    );
  }

  BMFMapController _mapController;
  final TextEditingController editingController = TextEditingController();

  void onMapCreated(BMFMapController controller) {
    _mapController = controller;
  }

  Widget buildSearchItem() {
    return Container(
      height: 36.h,
      margin: EdgeInsets.fromLTRB(6.w, 0, 14.w, 0),
      padding: EdgeInsets.fromLTRB(0, 6.h, 0, 6.h),
      decoration: BoxDecoration(
        color: Colors.white,
        borderRadius: BorderRadius.circular(4),
        boxShadow: [
          BoxShadow(
            color: Colors.black.withAlpha(12),
            offset: Offset(0, 3),
            blurRadius: 14,
            spreadRadius: 0,
          ),
        ],
      ),
      child: TextField(
        textInputAction: TextInputAction.search,
        onEditingComplete: () {
          startLocation();
        },
        controller: editingController,
        cursorHeight: 30.h,
        decoration: InputDecoration(
          contentPadding: EdgeInsets.symmetric(
            vertical: 12.h,
          ),
          prefixIcon: Icon(
            Icons.search,
            size: 24,
            color: Colors.black,
          ),
          suffixIcon: InkWell(
            onTap: () {
              editingController.clear();
            },
            child: Icon(
              Icons.close,
              size: 19,
              color: Colors.grey,
            ),
          ),
          border: InputBorder.none,
        ),
      ),
    );
  }

  // Widget buildSliverAppBar(BMFMapWidget map) {
  //   return SliverAppBar(
  //     // 滑上去时搜索隐藏
  //     // floating: true,
  //     // snap: true,
  //     pinned: true,
  //     backgroundColor: Color(0xFFFAFAFA),
  //     elevation: 0,
  //     automaticallyImplyLeading: false,
  //     title: Container(
  //       height: 36.h,
  //       margin: EdgeInsets.fromLTRB(16.w, 0, 16.w, 0),
  //       padding: EdgeInsets.fromLTRB(0, 6.h, 0, 6.h),
  //       decoration: BoxDecoration(
  //           color: Colors.white,
  //           borderRadius: BorderRadius.all(Radius.circular(4)),
  //           boxShadow: [
  //             BoxShadow(
  //               color: Colors.black.withAlpha(12),
  //               offset: Offset(0, 3),
  //               blurRadius: 14,
  //               spreadRadius: 0,
  //             )
  //           ]),
  //       child: TextField(
  //         textInputAction: TextInputAction.search,
  //         onEditingComplete: () {
  //           startLocation();
  //         },
  //         controller: editingController,
  //         cursorHeight: 30.h,
  //         decoration: InputDecoration(
  //           contentPadding: EdgeInsets.symmetric(vertical: 12.h),
  //           prefixIcon: Icon(
  //             Icons.search,
  //             size: 24,
  //             color: Colors.black,
  //           ),
  //           suffixIcon: InkWell(
  //             onTap: () {
  //               editingController.clear();
  //             },
  //             child: Icon(
  //               Icons.close,
  //               size: 19,
  //               color: Colors.grey,
  //             ),
  //           ),
  //           border: InputBorder.none,
  //         ),
  //       ),
  //     ),
  //     flexibleSpace: FlexibleSpaceBar(
  //       background: Container(
  //         child: map,
  //       ),
  //     ),
  //     expandedHeight: 375.h,
  //     bottom: PreferredSize(
  //       preferredSize: Size(double.infinity, 52.h),
  //       child: Container(
  //         padding: EdgeInsets.only(top: 6.h),
  //         color: Color(0xFFFAFAFA),
  //         child: ItemTitle(
  //           text: S.of(context).jingbilianmenghuiyuandian,
  //           imgPath: "assets/image/icon_union_store.png",
  //         ),
  //       ),
  //     ),
  //   );
  // }

  Widget buildStoreItem(Store store, position) {
    return Container(
      margin: EdgeInsets.fromLTRB(16.w, 8.h, 16.w, 8.h),
      padding: EdgeInsets.fromLTRB(20.w, 20.h, 20.w, 20.h),
      decoration: BoxDecoration(
          color: Colors.white,
          borderRadius: BorderRadius.all(Radius.circular(8)),
          boxShadow: [
            BoxShadow(
              color: Colors.black.withAlpha(25),
              offset: Offset(0, 1),
              blurRadius: 12,
              spreadRadius: 0,
            )
          ]),
      child: Row(
        mainAxisAlignment: MainAxisAlignment.start,
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          MImage(
            store.logo,
            width: 100,
            height: 100,
            fit: BoxFit.cover,
            errorSrc: "assets/image/default_1.png",
            fadeSrc: "assets/image/default_1.png",
          ),
          SizedBox(
            width: 8.w,
          ),
          Expanded(
            flex: 1,
            child: Container(
              height: 100.h,
              child: Column(
                mainAxisAlignment: MainAxisAlignment.spaceAround,
                crossAxisAlignment: CrossAxisAlignment.end,
                children: [
                  Row(
                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
                    crossAxisAlignment: CrossAxisAlignment.center,
                    children: [
                      Expanded(
                        child: Text(
                          store.storeName,
                          overflow: TextOverflow.ellipsis,
                          style: TextStyle(
                            color: Colors.black,
                            fontSize: 14.sp,
                            fontWeight: FontWeight.bold,
                          ),
                        ),
                        flex: 1,
                      ),
                      Text(
                        store.businessType,
                        overflow: TextOverflow.ellipsis,
                        textAlign: TextAlign.end,
                        style: TextStyle(
                          color: Color(0xFFEDB12F),
                          fontWeight: FontWeight.w400,
                          fontSize: 14.sp,
                        ),
                      ),
                    ],
                  ),
                  Row(
                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
                    crossAxisAlignment: CrossAxisAlignment.center,
                    children: [
                      Expanded(
                        child: Container(
                          child: Text(
                            store.couponVO == null
                                ? ""
                                : store.couponVO.bizType == 1
                                    ? S.of(context).manlijiandaijinquan(
                                        double.tryParse(
                                                store.couponVO.fullAmount)
                                            .toInt(),
                                        double.tryParse(
                                                store.couponVO.discountAmount)
                                            .toInt())
                                    : S.of(context).quanchangzhe(
                                        store.couponVO.discountPercent),
                            style: TextStyle(
                              color: Color(0xFFFF7A1A),
                              fontWeight: FontWeight.w500,
                              fontSize: 12.sp,
                            ),
                          ),
                        ),
                      ),
                      Text(
                        S.of(context).ren(
                            store == null ? "" : store.perCapitaConsumption),
                        style: TextStyle(
                          color: Color(0xFF353535),
                          fontWeight: FontWeight.w400,
                          fontSize: 12.sp,
                        ),
                      ),
                    ],
                  ),
                  SizedBox(
                    height: 4.h,
                  ),
                  Row(
                    mainAxisAlignment: MainAxisAlignment.spaceAround,
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: [
                      Container(
                        padding: EdgeInsets.only(top: 3.h, left: 2, right: 2),
                        child: Image.asset(
                          "assets/image/icon_union_location_black.png",
                          width: 14,
                          height: 14,
                        ),
                      ),
                      Expanded(
                        flex: 1,
                        child: Container(
                          padding: EdgeInsets.only(top: 2.h),
                          child: Text(
                            store.address,
                            overflow: TextOverflow.ellipsis,
                            maxLines: 2,
                            style: TextStyle(
                              color: Color(0xFF727272),
                              fontWeight: FontWeight.w400,
                              fontSize: 12.sp,
                              // height: 1.3.h,
                            ),
                          ),
                        ),
                      ),
                    ],
                  ),
                  Row(
                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
                    crossAxisAlignment: CrossAxisAlignment.center,
                    children: [
                      IconText(
                        (store.openStartTime == null &&
                                store.openEndTime == null)
                            ? S.of(context).quantian
                            : "${store.openStartTime.substring(0, store.openStartTime.lastIndexOf(":"))} - ${store.openEndTime.substring(0, store.openEndTime.lastIndexOf(":"))}",
                        textStyle: TextStyle(
                          color: Color(0xFF727272),
                          fontSize: 12.sp,
                        ),
                        leftImage: "assets/image/icon_union_time.png",
                        iconSize: 14.w,
                      ),
                      Visibility(
                        child: Text(
                          (store.distance ?? 0) > 1000
                              ? S.of(context).gongli(
                                  ((store.distance ?? 0) / 1000 * 100).toInt() /
                                      100.0)
                              : S.of(context).mi(
                                  ((store.distance ?? 0) * 100).toInt() /
                                      100.0),
                          style: TextStyle(
                            color: Color(0xFF4C4C4C),
                            fontSize: 12.sp,
                          ),
                        ),
                        visible: store.distance != null,
                      ),
                    ],
                  ),
                ],
              ),
            ),
          )
        ],
      ),
    );
  }

  @override
  bool get wantKeepAlive => true;
}