// ignore_for_file: constant_identifier_names

import 'dart:convert';
import 'package:fis_common/logger/logger.dart';
import 'package:fis_jsonrpc/rpc.dart';
import 'package:fis_measure/process/workspace/measure_handler.dart';
import 'package:fis_measure/process/workspace/rpc_bridge.dart';
import 'package:fis_i18n/i18n.dart';
import 'package:flutter/foundation.dart';

class MeasureDataHelper {
  // static VidImageSource source = VidImageSource.Remedical;
  static get source => RPCBridge.ins.source;
  // 获取图像列表
  static Future<List<RemedicalItemList>> getRemedicalList(
      String patientCode, String recordCode) async {
    try {
      // 初始化为空列表
      List<RemedicalItemList> remedicalItems = [];
      // 当数据来源是 Consultation 时
      if (source == VidImageSource.Consultation) {
        // 获取咨询图片
        var images = await getConsultationImages(recordCode);

        // 遍历图片列表,将非空的 imageInfos 添加到 remedicalItems 中
        for (var imageInfo in images) {
          var imageInfos = imageInfo.ultrasoundImageList ?? [];
          if (imageInfos.isNotEmpty) {
            remedicalItems.add(RemedicalItemList(
              remedicalList: imageInfos,
            ));
          }
        }
      }
      // 当数据来源是 Laboratory 时
      else if (source == VidImageSource.Laboratory) {
        // 获取患者的文件列表
        var getRecordsPage =
            await RPCBridge.ins.rpc.lab.getFileListByFolderAsync(
          GetFileListByFolderRequest(
            token: RPCBridge.ins.userToken,
            pageIndex: 1,
            pageSize: 100,
            folderCode: patientCode,
          ),
        );
        remedicalItems.add(RemedicalItemList(
          remedicalList: getRecordsPage.pageData,
        ));
      }
      // 当数据来源为ai结果编辑的
      else if (source == VidImageSource.AiResultModifier) {
        var result =
            await RPCBridge.ins.rpc.remedical.getPatientAISelectedInfosAsync(
          GetPatientAISelectedInfosRequest(
            token: RPCBridge.ins.userToken,
            recordCode: recordCode,
          ),
        );
        List<RemedicalInfoDTO> remedicalInfoList = [];
        for (var element in result) {
          remedicalInfoList.add(RemedicalInfoDTO(
            recordCode: element.recordCode,
            remedicalCode: element.remedicalAISelectedInfoCode,
            terminalImages: TerminalImageDTO(
              previewUrl: element.previewFileToken,
              imageUrl: element.cdnFileToken,
              coverImageUrl: element.previewFileToken,
              originImageUrl: element.orginalFileToken,
              recommendedDownloadMode: element.recommendedDownloadMode,
            ),
            diagnosisConclusion: element.diagnosisConclusion,
            diagnosisOrgans: element.diagnosisOrgans,
          ));
        }

        remedicalItems.add(RemedicalItemList(
          remedicalList: remedicalInfoList,
        ));
      } else if (source == VidImageSource.RemoteUS) {
        // 获取患者的病历记录
        PageResult<RemedicalListResult> result =
            PageResult<RemedicalListResult>();
        result.pageData = [];
        try {
          result = await RPCBridge.ins.rpc.remoteUltrasound
              .vitalGetRemedicalListPagesAsync(
            GetRecordsPageRequest(
              token: RPCBridge.ins.userToken,
              pageIndex: 1,
              pageSize: 100,
              patientCode: patientCode,
            ),
          );
        } catch (e) {
          logger.e('MeasureDataHelper vitalGetRemedicalListPagesAsync ex:$e');
        }
        // 遍历病历记录列表,当某条记录的 recordCode 与传入的 recordCode 相同时,将其 remedicalItemList 添加到 remedicalItems 中
        if (result.pageData!.isNotEmpty) {
          var recordInfo = result.pageData!.firstWhere(
              (element) => element.recordCode == recordCode,
              orElse: () => RemedicalListResult());
          remedicalItems = recordInfo.remedicalItemList ?? [];
        }
      }
      // 当数据来源为其他情况时
      else {
        // 获取患者的病历记录
        PageResult<RemedicalListResult> result =
            PageResult<RemedicalListResult>();
        result.pageData = [];
        try {
          result = await RPCBridge.ins.rpc.remedical.getRemedicalListPagesAsync(
            GetRecordsPageRequest(
              token: RPCBridge.ins.userToken,
              pageIndex: 1,
              pageSize: 100,
              patientCode: patientCode,
            ),
          );
        } catch (e) {
          logger.e('MeasureDataHelper getRemedicalListPagesAsync ex:$e');
        }
        // 遍历病历记录列表,当某条记录的 recordCode 与传入的 recordCode 相同时,将其 remedicalItemList 添加到 remedicalItems 中
        if (result.pageData!.isNotEmpty) {
          var recordInfo = result.pageData!.firstWhere(
              (element) => element.recordCode == recordCode,
              orElse: () => RemedicalListResult());
          remedicalItems = recordInfo.remedicalItemList ?? [];
        }
      }
      // 返回最终的 remedicalItems 列表
      return remedicalItems;
    } catch (e) {
      logger.e('MeasureHomeController getRemedicalList ex:', e);
      // 出现异常时返回空列表
      return [];
    }
  }

  ///获取会诊图像
  static Future<List<ConsultationImagesDTO>> getConsultationImages(
      String consultationCode) async {
    try {
      if (consultationCode.isEmpty) {
        return [];
      }
      var realTimeConsultationImageList =
          await RPCBridge.ins.rpc.liveConsultation.getConsultationFilesAsync(
        FindConsultationDetailRequest(
            consultationCode: consultationCode, token: RPCBridge.ins.userToken),
      );
      return realTimeConsultationImageList;
    } catch (e) {
      logger.e('RealTimeConsultationImageController getConsultationImages ex:' +
          e.toString());
    }
    return [];
  }

  ///获取图像详情
  static Future<RemedicalInfoDTO?> getImageInfo(
    String remedicalCode,
    String? remedicalAISelectedInfoCode,
  ) async {
    try {
      RemedicalInfoDTO result;
      print(source);
      if (source == VidImageSource.AiResultModifier) {
        final remedicalAISelectedInfo =
            await RPCBridge.ins.rpc.remedical.getRemedicalAISelectedInfoAsync(
          GetRemedicalAISelectedInfoRequest(
            token: RPCBridge.ins.userToken,
            code: remedicalAISelectedInfoCode,
          ),
        );

        result = RemedicalInfoDTO(
          diagnosisResult: jsonEncode(
            [
              {
                'DiagResultsForEachOrgan':
                    jsonDecode(remedicalAISelectedInfo.diagnosisData ?? '')[
                        'DiagResultsForEachOrgan'],
                'Index': jsonDecode(
                    remedicalAISelectedInfo.diagnosisData ?? '')['Index'],
                'PriorityScore':
                    jsonDecode(remedicalAISelectedInfo.diagnosisData ?? '')[
                        'PriorityScore'],
              }
            ],
          ),
          terminalImages: TerminalImageDTO(
            previewUrl: remedicalAISelectedInfo.previewFileToken,
            imageUrl: remedicalAISelectedInfo.cdnFileToken,
            coverImageUrl: remedicalAISelectedInfo.previewFileToken,
            originImageUrl: remedicalAISelectedInfo.orginalFileToken,
            recommendedDownloadMode:
                remedicalAISelectedInfo.recommendedDownloadMode,
          ),
          diagnosisConclusion: DiagnosisConclusionEnum.Benign,
        );
      } else if (source == VidImageSource.RemoteUS) {
        result = await RPCBridge.ins.rpc.remoteUltrasound
            .vitalFindRemedicalByCodeAsync(
          FindRemedicalByCodeRequest(
            token: RPCBridge.ins.userToken,
            remedicalCode: remedicalCode,
            existDiagnosisResult: true,
          ),
        );
      } else {
        result = await RPCBridge.ins.rpc.remedical.findRemedicalByCodeAsync(
          FindRemedicalByCodeRequest(
            token: RPCBridge.ins.userToken,
            remedicalCode: remedicalCode,
            existDiagnosisResult: true,
          ),
        );
      }

      return result;
    } catch (e) {
      logger.e('MeasureHomeController getRemedicalInfo ex:', e);
      return null;
    }
  }

  ///获取测量项
  static Future<MeasureApplicationDTO?> getMeasureApplication(
      MeasureModeSelection args) async {
    try {
      return await RPCBridge.ins.rpc.remedical.getMeasureApplicationAsync(
        GetMeasureApplicationRequest(
          token: RPCBridge.ins.userToken,
          applicationName: args.applicationName,
          categoryName: args.categoryName,
          measureModes: args.measureModes,
        ),
      );
    } catch (e) {
      print(e);
      logger.e('MeasureHomeController getMeasureApplication ex: ', e);
      return null;
    }
  }

  /// 保存测量的方法
  static Future<bool> saveUserDefinedMeasureApplicationAsync(
      MeasureModeSubmit args) async {
    var result = false;
    try {
      result = await RPCBridge.ins.rpc.remedical
          .saveUserDefinedMeasureApplicationAsync(
        SaveUserDefinedMeasureApplicationRequest(
          token: RPCBridge.ins.userToken,
          version: args.version,
          applicationName: args.applicationName,
          categoryName: args.categoryName,
          workingMode: args.workingMode,
        ),
      );
    } catch (e) {
      logger.e(
          'MeasureHomeController saveUserDefinedMeasureApplicationAsync ex: ',
          e);
    }
    return result;
  }

  /// 保存样式
  static Future<void> saveMeasureSystemSettingAsync(
    MeasureSystemSettingDTO measureSystemSetting,
  ) async {
    await RPCBridge.ins.rpc.remedical.saveMeasureSystemSettingAsync(
      SaveMeasureSystemSettingRequest(
        systemSetting: measureSystemSetting,
        token: RPCBridge.ins.userToken,
      ),
    );
  }

  /// 获取样式
  static Future<MeasureSystemSettingDTO> getMeasureSystemSettingAsync() async {
    final result =
        await RPCBridge.ins.rpc.remedical.getMeasureSystemSettingAsync(
      GetMeasureSystemSettingRequest(
        token: RPCBridge.ins.userToken,
      ),
    );
    return result;
  }

  /// 分享vid
  static Future<String> shareImage(
    String examFile,
  ) async {
    try {
      final result = await RPCBridge.ins.rpc.remedical.queryShareExamPageAsync(
        QueryShareExamPageRequest(
          examFileToken: examFile,
          token: RPCBridge.ins.userToken,
          languageCode: i18nBook.locale.toCodeString('-'),
        ),
      );
      return result.shareExamPageUrl ?? '';
    } catch (e) {
      logger.e("queryShareExamPageAsync exception:", e);
    }
    return '';
  }

  /// 获取注释
  static Future<CommentItemResultDTO?> getCommentsByApplicationAsync(
      String applicationName, String categoryName) async {
    try {
      if (RPCBridge.ins.source == VidImageSource.RemoteUS) {
        final result = await RPCBridge.ins.rpc.remoteUltrasound
            .vitalGetCommentsByApplicationAsync(
          GetCommentsByApplicationRequest(
            token: RPCBridge.ins.userToken,
            applicationName: applicationName,
            categoryName: categoryName,
            languageCode: i18nBook.locale.toCodeString('-'),
          ),
        );
        return result;
      } else {
        final result =
            await RPCBridge.ins.rpc.remedical.getCommentsByApplicationAsync(
          GetCommentsByApplicationRequest(
            token: RPCBridge.ins.userToken,
            applicationName: applicationName,
            categoryName: categoryName,
            languageCode: i18nBook.locale.toCodeString('-'),
          ),
        );
        return result;
      }
    } catch (e) {
      logger.e('MeasureHomeController getCommentsByApplicationAsync ex: ', e);
      return null;
    }
  }

  /// 保存注释
  static Future<bool?> saveUserDefinedCommentsAsync(
    String applicationName,
    String categoryName,
    List<CommentItemDTO>? addCommentItems,
    List<CommentItemDTO>? deleteCommentItems,
    List<UpdateCommentItemDTO>? updateCommentItems,
  ) async {
    try {
      final result =
          await RPCBridge.ins.rpc.remedical.saveUserDefinedCommentsAsync(
        SaveUserDefinedCommentsRequest(
            token: RPCBridge.ins.userToken,
            applicationName: applicationName,
            categoryName: categoryName,
            languageCode: i18nBook.locale.toCodeString('-'),
            // Store.app.systemLocale.languageCode.toLowerCase(),
            addCommentItems: addCommentItems,
            deletedCommentItems: deleteCommentItems,
            updateCommentItems: updateCommentItems),
      );
      return result;
    } catch (e) {
      logger.e('MeasureHomeController getCommentsByApplicationAsync ex: ', e);
      return null;
    }
  }

  /// 重置注释
  static Future<bool?> resetUserCommentsAsync(
    String applicationName,
    String categoryName,
  ) async {
    try {
      final result = await RPCBridge.ins.rpc.remedical.resetUserCommentsAsync(
        ResetUserCommentsRequest(
          token: RPCBridge.ins.userToken,
          applicationName: applicationName,
          categoryName: categoryName,
        ),
      );
      return result;
    } catch (e) {
      logger.e('MeasureHomeController resetUserCommentsAsync ex: ', e);
      return null;
    }
  }

  /// 获取预置的注释项
  static Future<PresetCommentItemResultDTO?> getPresetCommentsAsync() async {
    try {
      final result = await RPCBridge.ins.rpc.remedical.getPresetCommentsAsync(
        GetPresetCommentsRequest(
          token: RPCBridge.ins.userToken,
          languageCode: i18nBook.locale.toCodeString('-'),
          // Store.app.systemLocale.languageCode.toLowerCase(),
        ),
      );
      return result;
    } catch (e) {
      logger.e('MeasureHomeController getPresetCommentsAsync ex: ', e);
      return null;
    }
  }

  static Future<RemedicalInfoDTO?> getImageInfoByIndex(
      String recordCode, String token, String patientCode, int index) async {
    var imageList = await getRemedicalList(patientCode, recordCode);
    int imageIndex = 0;
    for (RemedicalItemList r in imageList) {
      for (RemedicalInfoDTO i in r.remedicalList ?? []) {
        imageIndex++;
        if (imageIndex == index) {
          return i;
        }
      }
    }
    return null;
  }
}