import 'package:EasyDartModule/EasyDartModule.dart';
import 'package:ef/ef.dart';
import 'package:flutter/material.dart';
import 'package:flutterflow_ui/flutterflow_ui.dart';
import 'package:fluwx/fluwx.dart';
import 'package:get_storage/get_storage.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:vbvs_app/common/color/ServiceConstant.dart';
import 'package:vbvs_app/common/util/MyUtils.dart';
import 'package:vbvs_app/common/util/requestWithLog.dart';
import 'package:vbvs_app/component/tool/TopSlideNotification.dart';
import 'package:vbvs_app/controller/time/countdown_controller.dart';
import 'package:vbvs_app/controller/user_info_controller.dart';
import 'package:vbvs_app/model/user_data.dart';
import 'package:vbvs_app/pages/mh_page/user/controller/mht_register_controller.dart';

part 'mht_login_controller.g.dart';

@JsonSerializable()
class LoginModel {
  //版本id
  int? loginStyle = 1; //1.密码登录 2.短信登录（登录类型: 1:手机号/邮箱+验证码 2:微信一键登录 3:手机号+密码）

  // String? account = '17649984946'; //账户
  // String? account = '13953240733'; //账户
  // String? password = '123wyf..'; //密码
  // String? account = '15255134931'; //账户
  // String? password = 'mht123,.'; //密码

  // String? account = '18607922869'; //账户
  // String? password = '373068'; //密码
  String? account = ''; //账户
  String? password = ''; //密码

  String? phone; //手机号
  String? code; //验证码

  String? register_code;

  bool? showPd = true;

  int? forceLogin = 0;

  bool? isIos; //是否为ios设备

  bool? isWeChatNotInstalled; //是否安装微信

  LoginModel();

  static LoginModel fromJson(Map<String, dynamic> json) =>
      _$LoginModelFromJson(json);
  Map<String, dynamic> toJson() => _$LoginModelToJson(this);
}

class MHTLoginController extends GetControllerEx<LoginModel> {
  // 初始化实例
  final Fluwx fluwx = Fluwx();
  // 微信监听返回值
  FluwxCancelable? fluwxCancelable;

  MHTLoginController() {
    attr = GetModel(LoginModel()).obs;
  }

  MHTRegisterController registerController = Get.find();

  //登录
  Future<String> login(BuildContext context) async {
    String message = '';
    String account = '';
    String password = '';
    if (model.loginStyle == null) {
      message = '请选择登录方式'.tr;
      TopSlideNotification.show(context,
          text: message, textColor: stringToColor("#FF7159"));
      return message;
    }
    if (model.loginStyle == 1) {
      //账号登录
      if (model.account == null || model.account!.isEmpty) {
        message = '账户不能为空'.tr;
        TopSlideNotification.show(context,
            text: message, textColor: stringToColor("#FF7159"));
        return message;
      }
      if (model.password == null || model.password!.isEmpty) {
        message = '密码不能为空'.tr;

        TopSlideNotification.show(context,
            text: message, textColor: stringToColor("#FF7159"));

        return message;
      }
      account = model.account!;
      password = model.password!;
    }
    if (model.loginStyle == 2) {
      //账号登录
      if (model.phone == null || model.phone!.isEmpty) {
        message = '请输入手机号'.tr;

        TopSlideNotification.show(context,
            text: message, textColor: stringToColor("#FF7159"));
        return message;
      }
      if (!MyUtils.isValidPhoneNumber(model.phone!)) {
        message = '请输入正确的手机号'.tr;

        TopSlideNotification.show(context,
            text: message, textColor: stringToColor("#FF7159"));
        return message;
      }
      if (model.code == null || model.code!.isEmpty) {
        message = '验证码不能为空'.tr;

        TopSlideNotification.show(context,
            text: message, textColor: stringToColor("#FF7159"));
        return message;
      }
      account = model.phone!;
      password = model.code!;
    }

    if (registerController.model.register_agree == null ||
        registerController.model.register_agree != true) {
      message = "需要同意协议".tr;
      TopSlideNotification.show(context,
          text: message, textColor: themeController.currentColor.sc9);
      return message;
    }
    int type = 1;
    if (model.loginStyle == 1) {
      type = 3;
    } else if (model.loginStyle == 2) {
      type = 1;
    }
    var data = {
      "type": type,
      "userName": account,
      "password": password,
    };
    String serviceAddress = ServiceConstant.service_address;
    String serviceName = ServiceConstant.server_service;
    String serviceApi = ServiceConstant.login;
    String queryUrl = "${serviceAddress}${serviceName}${serviceApi}";
    await requestWithLog(
      logTitle: "用户登录",
      method: MyHttpMethod.post,
      queryUrl: queryUrl,
      data: data,
      onSuccess: (res) {
        res.rawResponse;
        CountdownController countdownController = Get.find();
        countdownController.countdown.value = 0;
        UserInfoController userInfoController = Get.find();
        userInfoController.model.login = 1;
        userInfoController.model.user = UserModel.fromJson(res.data);
        String token = res.rawResponse.headers['token']!.first;
        EasyDartModule.dio.token = token;
        final box = GetStorage();
        box.write('token', token); // 存储 token
        box.write('user', userInfoController.model.user!.toJson()); // 存储用户信息
      },
      onFailure: (res) {
        message = res.msg!;
        TopSlideNotification.show(context,
            text: message, textColor: themeController.currentColor.sc9);
      },
    );
    model.forceLogin = 0;
    return message;
  }

  Future<String> getCode(BuildContext context) async {
    String message = "";
    // if (registerController.model.register_agree == null ||
    //     registerController.model.register_agree != true) {
    //   message = "需要同意协议".tr;
    //   TopSlideNotification.show(context,
    //       text: message, textColor: themeController.currentColor.sc9);
    //   return message;
    // }
    if (model.phone == null || model.phone!.isEmpty) {
      message = "请输入手机号".tr;
      TopSlideNotification.show(context,
          text: message, textColor: themeController.currentColor.sc9);
      return message;
    }
    if (!MyUtils.isValidPhoneNumber(model.phone!)) {
      message = '请输入正确的手机号'.tr;
      TopSlideNotification.show(context,
          text: message, textColor: themeController.currentColor.sc9);
      return message;
    }
    String serviceAddress = ServiceConstant.service_address;
    String serviceName = ServiceConstant.server_service;
    String serviceApi = ServiceConstant.send_code;
    String queryUrl = "${serviceAddress}${serviceName}${serviceApi}";
    var data = {"userName": model.phone, "type": 1};
    await requestWithLog(
      data: data,
      logTitle: "发送验证码",
      method: MyHttpMethod.post,
      queryUrl: queryUrl,
      onSuccess: (res) {
        TopSlideNotification.show(context, text: "发送验证码成功".tr);
      },
      onFailure: (res) {
        message = res.msg!;
        TopSlideNotification.show(context,
            text: message, textColor: themeController.currentColor.sc9);
      },
    );
    return message;
  }

  //微信登录
  Future<void> wxLoginSendAuth() async {
    /*
    1、目前移动应用上微信登录只提供原生的登录方式，需要用户安装微信客户端才能配合使用。
    2、对于Android应用，建议总是显示微信登录按钮，当用户手机没有安装微信客户端时，请引导用户下载安装微信客户端。
    3、对于iOS应用，考虑到iOS应用商店审核指南中的相关规定，建议开发者接入微信登录时，先检测用户手机是否已安装微信客户端
    （使用sdk中isWXAppInstalled函数 ），对未安装的用户隐藏微信登录按钮，只提供其他登录方式（比如手机号注册登录、游客登录等）
    */
    if (isAndroid) {
      bool isWeChatInstalled = await fluwx.isWeChatInstalled;
      debugPrint('is wechat installed: $isWeChatInstalled');
      if (!isWeChatInstalled) {
        showToast("请先安装微信APP，再使用微信登录");
        return;
      }
    }
    fluwx
        .authBy(
            which: NormalAuth(
      scope: 'snsapi_userinfo',
      state: 'wechat_sdk_zhmht_wxlogin',
    ))
        .then((data) {
      //返回true表示成功或者false表示失败，这边没有意义从login_controller页面构造函数监听中去处理
      debugPrint('msg:$data');
    });
  }

  //退出登录
  Future<void> logout() async {
    // await repository.logout();
  }

  loginByWechatCode(String code) async {
    // return await repository.loginByWechatCode(code);
  }

  //注销账号
  deletedAccount() async {
    // return await repository.deletedAccount();
  }
}
