/*
 * @author lsy
 * @date   2020/6/30
 **/
import 'package:flutter/foundation.dart';
import 'package:flutter_common/commonModel/live/BaseModel.dart';
import 'package:flutter_common/commonModel/live/LiveData.dart';
import 'package:flutter_common/commonModel/toast/NativeToast.dart';
import 'package:gm_flutter/ClueModel/page/plan/PlanTest.dart';
import 'package:gm_flutter/ClueModel/server/api/ClueApi.serv.dart';
import 'package:gm_flutter/ClueModel/server/entity/PlanBean.dart';
import 'package:gm_flutter/ClueModel/server/entity/PlanFeedBean.dart';
import 'package:gm_flutter/commonModel/GMBase.dart';
import 'package:gm_flutter/commonModel/bean/Pair.dart';
import 'package:gm_flutter/commonModel/rx/RxDispose.dart';
import 'package:gm_flutter/commonModel/util/PrintUtil.dart';

class PlanModel extends BaseModel {
  LiveData<List> managerLive = new LiveData();
  LiveData<List<double>> posLive = new LiveData();
  LiveData<List<double>> backLive = new LiveData();
  LiveData<List<Ranks>> picLive = LiveData();
  LiveData<int> stateLive = LiveData();

  double menuBottom;
  int menuIndex = -1;
  bool needChangBack = true;
  LiveData<Pair<int, List<Plans>>> feedsLive = LiveData();
  List<Plans> feedDatas = [];

  List<Tags> projectData = [];
  List<Orders> sortList = [];
  RxDispose rxDispose = RxDispose();

  String tag_id = "";
  String order_by = "";
  String current_city_id = "";
  String min_price = "";
  String max_price = "";
  String rank_type = "";
  int page = 1;
  int sortPos = 0;

  void init() {
    ClueApiImpl.getInstance()
        .getPlan(DioUtil.getInstance().getDio())
        .listen((event) {
          if (event.error == 0) {
            projectData = event.data.tags;
            sortList = event.data.orders;
            picLive.notifyView(event.data.ranks);
            stateLive.notifyView(ENDLOADING);
            refreshFeed(true);
          } else {
            stateLive.notifyView(FAIL);
            NativeToast.showNativeToast(event.message);
          }
        })
        .addToDispose(rxDispose)
        .onError((err) {
          PrintUtil.printBug(err);
          stateLive.notifyView(FAIL);
        });
  }

  void projectClick(String id) {
    if (tag_id == id) {
      return;
    }
    tag_id = id;
    feedsLive.notifyView(Pair(LOADING, null));
    refreshFeed(true);
  }

  void refreshFeed(bool clear) {
    if (clear) {
      feedDatas.clear();
    }
    ClueApiImpl.getInstance()
        .getPlanFeed(DioUtil.getInstance().getDio(), tag_id, order_by,
            current_city_id, min_price, max_price, rank_type, page)
        .listen((event) {
          if (event.error == 0) {
            if (event.data.plans == null || event.data.plans.isEmpty) {
              feedsLive.notifyView(Pair(ENDLOADING, []));
            } else {
              feedDatas.addAll(event.data.plans);
              feedsLive.notifyView(Pair(ENDLOADING, feedDatas));
            }
          } else {
            NativeToast.showNativeToast(event.message);
            feedsLive.notifyView(Pair(FAIL, null));
          }
        })
        .addToDispose(rxDispose)
        .onError((err) {
          PrintUtil.printBug(err);
          feedsLive.notifyView(Pair(FAIL, null));
        });
  }

  @override
  void dispose() {
    stateLive.dispost();
    picLive.dispost();
    rxDispose.dispose();
    managerLive.dispost();
    posLive.dispost();
    backLive.dispost();
    feedsLive.dispost();
  }

  void backProgress(double pro, int index) {
    if (needChangBack || menuIndex == -1) {
      backLive.notifyView([0.0, menuBottom, pro]);
    }
  }

  void loadMore() {
    page++;
    refreshFeed(false);
  }

  void sortClick(int index) {
    if (index == sortPos) {
      return;
    }
    sortPos = index;
    order_by = sortList[index].id.toString();
    refreshFeed(true);
  }

  void filterClick(int max, int min) {
    if (max_price == max.toString() && min_price == min.toString()) {
      return;
    }
    max_price = max.toString();
    min_price = min.toString();
    refreshFeed(true);
  }
}