import 'dart:core';

import 'package:fis_common/event/event_type.dart';
import 'package:fis_jsonrpc/rpc.dart';
import 'package:fis_measure/interfaces/enums/annotation.dart';
import 'package:fis_measure/interfaces/enums/operate.dart';
import 'package:fis_measure/view/measure/operate_type_change_button.dart';
import 'package:fis_measure/view/measure/measure_panel_head.dart';

class ChangeImageInfo {
  /// 图片地址
  final String? imageUrl;

  /// 图像编码
  final String? remedicalCode;
  ChangeImageInfo(
    this.imageUrl,
    this.remedicalCode,
  );
}

class MeasureModeSelection {
  /// 应用名称:读取Vid获取应用
  final String? applicationName;

  /// 分类名称:读取Vid获取应用分类名称
  final String? categoryName;

  /// 测量模式集合:读取Vid获取应用的模式集合,返回对应测量数据
  final List<String>? measureModes;
  MeasureModeSelection(
    this.applicationName,
    this.categoryName,
    this.measureModes,
  );
}

class MeasureModeSubmit {
  /// 版本号
  final String? version;

  /// 应用名称,读取Vid获取应用
  final String? applicationName;

  /// 分类名称:读取Vid获取应用分类名称
  final String? categoryName;

  ///  测量模式
  final UserDefinedMeasureModeDTO? workingMode;
  MeasureModeSubmit(
    this.version,
    this.applicationName,
    this.categoryName,
    this.workingMode,
  );
}

abstract class IMeasureHandler {
  /// 测量切换图片事件
  late FEventHandler<ChangeImageInfo> onImageChanged;

  /// 测量方式选择
  late FEventHandler<MeasureModeSelection> onMeasureModeSelectionChanged;

  /// 测量方式提交
  late FEventHandler<MeasureModeSubmit> onMeasureModeSubmitChanged;

  /// 测量还是注释tab
  late FEventHandler<MeasureOperateType> onOperateTypeChanged;

  /// 注释箭头还是标签
  late FEventHandler<AnnotationType> onChangedAnnotationType;

  /// 拖拽状态发生改变
  late FEventHandler<bool> onDragStateChanged;

  /// 鼠标右键取消测量
  late FEventHandler<bool> onRightClickFinishMeasure;

  /// 图片加载loadding
  late FEventHandler<bool> onChangeImageLoaded;

  /// 通过 remedicalCode 切换图片
  late FEventHandler<String> changeImageByRemedicalCode;

  /// 更新图片列表
  late FEventHandler<List<RemedicalInfoDTO>> changeImageList;

  late FEventHandler<bool> onChangeFullScreenState;

  late FEventHandler<bool> onToolPanelStateChanged;

  late FEventHandler<void> annotationsLoaded;

  /// 切换图像传递数据
  ChangeImageInfo get imageChanged;
  set imageChanged(ChangeImageInfo value);

  /// 切换图像测量方式变更数据
  MeasureModeSelection get measureModeChanged;
  set measureModeChanged(MeasureModeSelection value);

  /// 测量方式变更提交
  MeasureModeSubmit get measureModeSubmitChanged;
  set measureModeSubmitChanged(MeasureModeSubmit value);

  /// 切换Tab
  MeasureOperateType get currOperateType;
  set currOperateType(MeasureOperateType value);

  /// 切换注释
  AnnotationType get changedAnnotationType;
  set changedAnnotationType(AnnotationType value);

  /// 切换图片
  bool get changeImageLoaded;
  set changeImageLoaded(bool value);

  /// 全屏状态
  bool get fullScreenState;
  set fullScreenState(bool value);

  /// 工具面板状态
  bool get toolPanelState;
  set toolPanelState(bool value);
}

class MeasureHandler implements IMeasureHandler {
  ChangeImageInfo _imageChanged = ChangeImageInfo(null, null);
  MeasureModeSelection _measureModeChanged =
      MeasureModeSelection(null, null, null);

  MeasureModeSubmit _measureModeSubmitChanged =
      MeasureModeSubmit(null, null, null, null);

  MeasureOperateType _currOperateType = MeasureOperateType.measure;

  bool _changeImageLoaded = true;

  bool _fullScreenState = false;

  bool _toolPanelState = true;

  AnnotationType _changedAnnotationType = AnnotationType.label;
  @override
  var onImageChanged = FEventHandler<ChangeImageInfo>();

  @override
  var onMeasureModeSelectionChanged = FEventHandler<MeasureModeSelection>();

  @override
  var onMeasureModeSubmitChanged = FEventHandler<MeasureModeSubmit>();
  @override
  var onOperateTypeChanged = FEventHandler<MeasureOperateType>();

  @override
  var onChangedAnnotationType = FEventHandler<AnnotationType>();
  @override
  var onDragStateChanged = FEventHandler<bool>();
  @override
  var onRightClickFinishMeasure = FEventHandler<bool>();

  @override
  FEventHandler<bool> onChangeImageLoaded = FEventHandler<bool>();

  @override
  FEventHandler<String> changeImageByRemedicalCode = FEventHandler<String>();
  @override
  FEventHandler<List<RemedicalInfoDTO>> changeImageList =
      FEventHandler<List<RemedicalInfoDTO>>();

  @override
  FEventHandler<bool> onChangeFullScreenState = FEventHandler<bool>();

  @override
  FEventHandler<bool> onToolPanelStateChanged = FEventHandler<bool>();

  @override
  var annotationsLoaded = FEventHandler<void>();

  @override
  ChangeImageInfo get imageChanged => _imageChanged;

  @override
  MeasureModeSelection get measureModeChanged => _measureModeChanged;

  @override
  MeasureModeSubmit get measureModeSubmitChanged => _measureModeSubmitChanged;

  @override
  MeasureOperateType get currOperateType => _currOperateType;

  @override
  AnnotationType get changedAnnotationType => _changedAnnotationType;

  @override
  bool get changeImageLoaded => _changeImageLoaded;

  @override
  bool get fullScreenState => _fullScreenState;
  @override
  set fullScreenState(bool value) {
    if (value != _fullScreenState) {
      _fullScreenState = value;
      _onChangeFullScreenState();
    }
  }

  @override
  bool get toolPanelState => _toolPanelState;
  @override
  set toolPanelState(bool value) {
    if (value != _toolPanelState) {
      _toolPanelState = value;
      _onToolPanelStateChanged();
    }
  }

  @override
  set changeImageLoaded(bool value) {
    if (value != _changeImageLoaded) {
      _changeImageLoaded = value;
      _onChangeImageLoaded();
    }
  }

  @override
  set currOperateType(MeasureOperateType value) {
    if (value != _currOperateType) {
      _currOperateType = value;
      _onOperateTypeChanged();
    }
  }

  @override
  set changedAnnotationType(AnnotationType value) {
    if (value != _changedAnnotationType) {
      _changedAnnotationType = value;
      _onChangedAnnotation();
    }
  }

  @override
  set imageChanged(ChangeImageInfo value) {
    if (value != _imageChanged) {
      _imageChanged = value;
      _onImageChanged();
    }
  }

  @override
  set measureModeChanged(MeasureModeSelection value) {
    if (value != _measureModeChanged) {
      _measureModeChanged = value;
      _onMeasureModeSelectionChanged();
    }
  }

  @override
  set measureModeSubmitChanged(MeasureModeSubmit value) {
    if (value != _measureModeSubmitChanged) {
      _measureModeSubmitChanged = value;
      _onMeasureModeSubmitChanged();
    }
  }

  void _onImageChanged() {
    onImageChanged.emit(this, imageChanged);
  }

  void _onMeasureModeSelectionChanged() {
    onMeasureModeSelectionChanged.emit(this, measureModeChanged);
  }

  void _onMeasureModeSubmitChanged() {
    onMeasureModeSubmitChanged.emit(this, measureModeSubmitChanged);
  }

  void _onOperateTypeChanged() {
    onOperateTypeChanged.emit(this, currOperateType);
  }

  void _onChangeImageLoaded() {
    onChangeImageLoaded.emit(this, changeImageLoaded);
  }

  void _onChangeFullScreenState() {
    onChangeFullScreenState.emit(this, fullScreenState);
  }

  void _onToolPanelStateChanged() {
    onToolPanelStateChanged.emit(this, toolPanelState);
  }

  void _onChangedAnnotation() {
    onChangedAnnotationType.emit(this, changedAnnotationType);
  }

  void onAnnotationsLoaded() {
    annotationsLoaded.emit(this, null);
  }
}