import 'package:fis_jsonrpc/rpc.dart';
import 'package:get/get.dart';
import 'package:vitalapp/architecture/defines.dart';
import 'package:vitalapp/architecture/utils/prompt_box.dart';
import 'package:vitalapp/managers/interfaces/device.dart';
import 'package:vitalapp/managers/interfaces/models/device.dart';
import 'package:vitalapp/managers/interfaces/patient.dart';
import 'package:vitalapp/pages/controllers/crowd_labels.dart';
import 'package:vitalapp/pages/controllers/home_nav_mixin.dart';
import 'package:vitalapp/pages/facial_recognition/view.dart';
import 'package:vitalapp/pages/patient/bluetooth_card_reader/view.dart';
import 'package:vitalapp/pages/patient/card_reader/index.dart';
import 'package:vitalapp/pages/patient/create/state.dart';
import 'package:vitalapp/pages/patient/list/controller.dart';
import 'package:vitalapp/routes/nav_ids.dart';
import 'package:vnote_device_plugin/consts/types.dart';

import '../../facial_recognition/index.dart';
import '../../id_card_scan/index.dart';

class CreatePatientController extends FControllerBase with HomeNavMixin {
  final _patientManager = Get.find<IPatientManager>();
  final crowdLabelsController = Get.find<CrowdLabelsController>();
  final _patientListController = Get.find<PatientListController>();
  final _deviceManager = Get.find<IDeviceManager>();

  final state = CreatePatientState();

  @override
  Future<void> onLoad() {
    final params = Get.parameters;
    if (params.containsKey("from")) {
      if (params["from"] == "list") {
        state.isCreateOnly = true;
      }
    }
    return super.onLoad();
  }

  /// 保存档案，调整签约
  void gotoSignContract() async {
    setBusy("正在保存...");
    String? code;
    try {
      code = await _submitForm();
      if (code == null) {
        busy = false;
        PromptBox.toast("保存失败");
        return;
      }

      // final code = "13B95A2B2790464BBFD9B30A71F15C95";
      busy = false;
      Future.delayed(
        const Duration(milliseconds: 800),
        () {
          state.reset(); // 重置状态
        },
      );
    } finally {
      if (code != null) {
        Get.toNamed(
          "/contract/package_list",
          parameters: {"patientCode": code},
        );
      }
    }
    // Get.find<HomeController>().switchNavByName("/patient/list");
    // Future.delayed(
    //   const Duration(milliseconds: 800),
    //   () {
    //     // TODO:
    //     Get.find<PatientListController>().gotoDetail(code);
    //     busy = false;
    //   },
    // );
  }

  /// 存为档案，调整到档案详情
  void gotoPatientDetail() async {
    setBusy("正在保存...");
    final code = await _submitForm();
    if (code == null) {
      busy = false;
      PromptBox.toast("保存失败");
      return;
    } else {
      Future.delayed(
        const Duration(milliseconds: 800),
        () {
          state.reset(); // 重置状态
          busy = false;
          PromptBox.toast("保存成功");
          _patientListController.reloadList();
        },
      );
    }

    ///不跳转到详情页
    // Get.find<HomeController>().switchNavByName("/patient/list");
    // Get.put(PatientListController());
    Future.delayed(
      const Duration(milliseconds: 800),
      () {
        Get.find<PatientListController>().gotoDetail(code);
        busy = false;
      },
    );
  }

  /// 保存并返回
  void saveAndBack() async {
    setBusy("正在保存...");
    final code = await _submitForm();
    busy = false;

    if (code == null) {
      busy = false;
      return;
    }

    Get.back(result: code, id: NavIds.HOME);
  }

  Future<DeviceModel?> getDevice(String type) async {
    List<DeviceModel> devices = await _deviceManager.getDeviceList();

    return devices.firstWhereOrNull((element) => element.type == type);
  }

  /// 点击读卡事件
  void onReadCardClicked() async {
    final DeviceModel? device = await getDevice(DeviceTypes.IC_READER);
    final CardReaderResult? result;
    if (device != null) {
      // return;
      result = await Get.dialog<CardReaderResult>(
        const BluetoothCardReaderDialog(),
      );
    } else {
      result = await Get.dialog<CardReaderResult>(
        const CardReaderDialog(),
      );
    }

    if (result != null && result.success) {
      PromptBox.toast("读取成功");
      state.cardNo = result.cardNo; // 回填身份证号
      state.name = result.name; // 回填姓名
      state.gender = result.gender; // 回填性别
      state.nation = result.nation; // 回填民族
      state.birthday = result.birthday; // 回填出生日期
      state.censusRegister = result.address; // 回填户籍地址
      if (state.isSyncAddresses) {
        state.address = result.address; // 回填现住地址
      }
    } else {
      print("读卡取消");
    }
  }

  /// 点击身份识别建档（拍摄扫描身份证）
  void onIdCardScanClicked() async {
    final IdCardScanResult? result = await Get.to<IdCardScanResult>(
      () => const IdCardScanPage(),
    );
    if (result != null && result.success) {
      PromptBox.toast("录入成功");
      state.cardNo = result.cardNo; // 回填身份证号
      state.name = result.name; // 回填姓名
      state.gender = result.gender; // 回填性别
      state.nation = result.nation; // 回填民族
      state.birthday = result.birthday; // 回填出生日期
      state.censusRegister = result.address; // 回填户籍地址
      if (state.isSyncAddresses) {
        state.address = result.address; // 回填现住地址
      }
    } else {
      print("识别取消");
    }
  }

  /// 点击人脸识别
  void onFaceIdLoginClicked() async {
    final FaceRecognitionResult? result = await Get.to<FaceRecognitionResult>(
      () => const FacialRecognitionPage(),
    );
    if (result != null && result.success) {
      PromptBox.toast("录入成功");
      state.cardNo = result.cardNo; // 回填身份证号
      state.name = result.name; // 回填姓名
      state.gender = result.gender; // 回填性别
      state.nation = result.nation; // 回填民族
      state.birthday = result.birthday; // 回填出生日期
      state.censusRegister = result.address; // 回填户籍地址
      if (state.isSyncAddresses) {
        state.address = result.address; // 回填现住地址
      }
    } else {
      print("识别取消");
    }
  }

  /// 处理 “同户籍地址” 勾选变更事件
  void onSyncAddressCheckChanged(bool isChecked) {
    state.isSyncAddresses = isChecked;
    if (isChecked) {
      // 同步户籍地址到现住地址
      state.address = state.censusRegister;
    } else {
      state.address = "";
    }
  }

  /// 处理户籍地址变更
  void onCensusRegisterChanged(String value) {
    state.censusRegister = value;
    if (state.isSyncAddresses) {
      state.address = value;
    }
  }

  Future<String?> _submitForm() async {
    final validateMsg = await _validateForm();
    if (validateMsg != null) {
      toast(validateMsg);
      return null;
    }

    final crowdLabelCodes = crowdLabelsController.state.selectedCodes;
    final request = CreatePatientRequest(
      patientName: state.name,
      phone: state.phoneNo,
      patientGender: state.gender,
      nationality: state.nation,
      birthday: state.birthday?.toUtc(),
      cardType: state.cardType,
      cardNo: state.cardNo,
      patientAddress: state.address,
      permanentResidenceAddress: state.censusRegister,
      crowdLabels: crowdLabelCodes,
    );
    final result = await _patientManager.create(request);
    return result;
  }

  bool validateIDCard(String idCard) {
    // 校验身份证号码长度
    if (idCard.length != 18) {
      return false;
    }

    // 校验前17位是否为数字
    String idCard17 = idCard.substring(0, 17);
    if (!isNumeric(idCard17)) {
      return false;
    }

    // 校验最后一位校验码
    String checkCode = getCheckCode(idCard17);
    if (idCard[17].toUpperCase() != checkCode) {
      return false;
    }

    return true;
  }

  bool isNumeric(String str) {
    if (str.isEmpty) {
      return false;
    }
    return double.tryParse(str) != null;
  }

  bool isAlphaNumeric(String str) {
    final RegExp alphaNumericRegExp = RegExp(r'^[a-zA-Z0-9]+$');
    return alphaNumericRegExp.hasMatch(str);
  }

  bool isAlphaNumericChineseWithSpace(String str) {
    final RegExp alphaNumericChineseWithSpaceRegExp =
        RegExp(r'^[a-zA-Z0-9\u4e00-\u9fa5\s]+$');
    return alphaNumericChineseWithSpaceRegExp.hasMatch(str);
  }

  String getCheckCode(String idCard17) {
    List<int> coefficients = [
      7,
      9,
      10,
      5,
      8,
      4,
      2,
      1,
      6,
      3,
      7,
      9,
      10,
      5,
      8,
      4,
      2
    ];
    List<String> checkCodes = [
      '1',
      '0',
      'X',
      '9',
      '8',
      '7',
      '6',
      '5',
      '4',
      '3',
      '2'
    ];

    int sum = 0;
    for (int i = 0; i < idCard17.length; i++) {
      int digit = int.parse(idCard17[i]);
      sum += digit * coefficients[i];
    }

    int remainder = sum % 11;
    return checkCodes[remainder];
  }

  Future<String?> _validateForm() async {
    if (state.name.isEmpty) {
      return "请填写姓名";
    }
    // else {
    //   if (!isAlphaNumericChineseWithSpace(state.name) ||
    //       state.name.length >= 20) {
    //     return "姓名只能由中文、字母或数字组成，并且小于20个字符";
    //   }
    // }
    if (state.cardNo.isEmpty) {
      return "请填写证件号";
    }

    if (state.phoneNo.isNotEmpty) {
      if (state.phoneNo.length != 11 || !isNumeric(state.phoneNo)) {
        return "请填写正确的手机号";
      }
    }
    if (state.cardType == CardTypeEnum.Identity) {
      bool isNotIDCard = validateIDCard(state.cardNo);
      if (!isNotIDCard) {
        return "请填写正确的证件号";
      }
    }

    if (state.cardType == CardTypeEnum.SocialInsurance) {
      if (state.cardNo.length != 18 || !isNumeric(state.cardNo)) {
        return "请填写正确的社保号";
      }
    }

    if (state.cardType == CardTypeEnum.Passport) {
      if (state.cardNo.length != 9 || !isAlphaNumeric(state.cardNo)) {
        return "请填写正确的护照号";
      }
    }

    /// TODO 需求变更暂时删除
    // final selectedNormalCodes = crowdLabelsController.state.selectedNormalCodes;

    // if (selectedNormalCodes.length > 1) {
    //   return "人群分类：一般人群、儿童、孕妇、老年人，只可选择其一！";
    // }
    // final crowdLabelCodes = crowdLabelsController.state.selectedCodes;
    // if (crowdLabelCodes.isEmpty) {
    //   return "请选择人群分类";
    // }
    // if (state.gender == GenderEnum.Male &&
    //     crowdLabelCodes.contains('RQFL_YF')) {
    //   return "当前居民性别为“男”，人群分类不可选择孕妇！";
    // }
    return null;
  }
}
