import 'package:fis_i18n/i18n.dart';
import 'package:fis_measure/interfaces/enums/annotation.dart';
import 'package:fis_measure/interfaces/enums/operate.dart';
import 'package:fis_measure/interfaces/process/player/play_controller.dart';
import 'package:fis_measure/interfaces/process/workspace/application.dart';
import 'package:fis_measure/interfaces/process/workspace/measure_3d_view_controller.dart';
import 'package:fis_measure/process/workspace/measure_data_controller.dart';
import 'package:fis_measure/process/workspace/measure_handler.dart';
import 'package:fis_measure/process/workspace/measure_3d_view_controller.dart';
import 'package:fis_measure/view/measure/arrow_annotation_button.dart';
import 'package:fis_measure/view/measure/drag_delete_area.dart';
import 'package:fis_measure/view/measure/measure_left_annotation.dart';
import 'package:fis_measure/view/measure/measure_search_input.dart';
import 'package:fis_measure/view/measure/measure_tool.dart';
import 'package:fis_measure/view/measure/carotid_measure_tool.dart';
import 'package:fis_measure/view/measure/measure_tools_title.dart';
import 'package:fis_measure/view/measure/measure_view_controller.dart';
import 'package:fis_measure/view/measure/operate_type_change_button.dart';
import 'package:fis_measure/view/measure/measure_panel_head.dart';
import 'package:fis_ui/index.dart';
import 'package:fis_ui/interface/interactive_container.dart';
import 'package:fis_ui/widgets/layout/offstage.dart';

import 'package:flutter/material.dart';
import 'package:get/get.dart';

/// 测量左侧工具面板
class MeasureToolPanel extends StatefulWidget implements FInteractiveContainer {
  const MeasureToolPanel({Key? key}) : super(key: key);
  @override
  final String pageName = 'MeasureLeftBoard';
  @override
  State<MeasureToolPanel> createState() => MeasureToolPanelState();
}

class MeasureToolPanelState extends State<MeasureToolPanel> {
  final measureHandler = Get.find<MeasureHandler>();
  final playerController = Get.find<IPlayerController>();
  final measure3DViewController = Get.find<Measure3DViewController>();

  /// 数据
  late final measureData = Get.find<MeasureDataController>();

  /// 测量项控制器
  final measureMetaController = Get.find<MeasureMetaController>();

  /// 是否显示颈动脉2D指定的测量项
  bool showCarotid2DSelectMeasure = false;

  /// 是否为魔盒的Vid
  bool isThirdPart = Get.find<IApplication>().isThirdPart;

  /// 是否显示测量项
  bool hideMeasureItems = false;

  /// 是否正在拖拽
  bool isDragging = false;

  bool isMeasureTool = true;

  double _width = 300;

  bool get isArrowMeasureAnnotationType =>
      measureHandler.changedAnnotationType == AnnotationType.arrow;
  MeasureOperateType currOperateType = MeasureOperateType.measure;
  void _onOperateTypeChanged(
    Object sender,
    MeasureOperateType e,
  ) {
    setState(() {
      currOperateType = e;
    });
  }

  void _onCurItemMetaListChanged(sender, e) {
    if (mounted) {
      setState(() {});
    }
  }

  ///图像发生变化
  void _onChangeImage(sender, e) {
    final application = Get.find<IApplication>();
    setState(() {
      isThirdPart = application.isThirdPart;
    });
  }

  /// 拖拽状态发生改变
  _onDragStateChanged(Object sender, bool e) {
    setState(() {
      isDragging = e;
    });
  }

  @override
  void initState() {
    measureHandler.onOperateTypeChanged.addListener(_onOperateTypeChanged);
    measure3DViewController.updatePlayerMode.addListener(_onModeChanged);
    measureData.curItemMetaListChanged.addListener(_onCurItemMetaListChanged);
    measureHandler.onChangeImageLoaded.addListener(_onChangeImage);
    measureHandler.onDragStateChanged.addListener(_onDragStateChanged);

    super.initState();
  }

  @override
  void dispose() {
    measureHandler.onOperateTypeChanged.removeListener(_onOperateTypeChanged);
    measure3DViewController.updatePlayerMode.removeListener(_onModeChanged);
    measureData.curItemMetaListChanged
        .removeListener(_onCurItemMetaListChanged);
    measureHandler.onChangeImageLoaded.removeListener(_onChangeImage);
    measureHandler.onDragStateChanged.removeListener(_onDragStateChanged);
    super.dispose();
  }

  /// 模式改变触发更新
  void _onModeChanged(Object s, MeasureMode mode) {
    switch (mode) {
      case MeasureMode.vidMode:
        final playerController = Get.find<IPlayerController>();
        // 通过帧加载完成事件通知,去更新测量项
        if (playerController.currentFrame != null) {
          playerController.firstFrameLoaded
              .emit(this, playerController.currentFrame!);
        }
        setState(() {
          showCarotid2DSelectMeasure = false;
          hideMeasureItems = false;
        });
        break;
      case MeasureMode.carotid2DMode:
        setState(() {
          showCarotid2DSelectMeasure = true;
          hideMeasureItems = false;
        });
        break;
      case MeasureMode.carotid3DMode:
        setState(() {
          showCarotid2DSelectMeasure = true;
          hideMeasureItems = true;
        });
        break;
    }
  }

  bool get hideMeasureTab => (currOperateType == MeasureOperateType.annotation);
  bool get hideCommentTab => !hideMeasureTab;
  @override
  FWidget build(BuildContext context) {
    final newPlayerController = Get.find<IPlayerController>();
    final mediaQuery = MediaQuery.of(context);

    ///屏幕缩放比例
    final devicePixelRatio = mediaQuery.devicePixelRatio;
    _width = 300 / devicePixelRatio;
    return FColumn(
      mainAxisSize: MainAxisSize.max,
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        FOffstage(
          offstage: hideMeasureItems,
          child: LeftSiderHold(
              ifHideConfig: showCarotid2DSelectMeasure || isThirdPart),
        ),
        FOffstage(
          offstage: hideMeasureItems || hideCommentTab,
          child: FContainer(
            width: _width,
            key: UniqueKey(),
            child: const LeftSelectInput(),
          ),
        ),
        FOffstage(
          offstage: hideMeasureItems || hideMeasureTab,
          child: const LeftMeasureTools(),
        ),
        FExpanded(
          child: FStack(
            fit: StackFit.passthrough,
            children: [
              FOffstage(
                offstage: hideMeasureItems || hideMeasureTab,
                child: FContainer(
                  width: _width,
                  child: showCarotid2DSelectMeasure
                      ? const CarotidLeftSiderSelectMeasure()
                      : FContainer(
                          key: Key(newPlayerController.url),
                          child: const LeftSiderSelectMeasure()),
                ),
              ),
              FOffstage(
                offstage: hideMeasureItems || hideCommentTab,
                child: FContainer(
                  width: _width,
                  key: UniqueKey(),
                  child: const MeasureLeftAnnotation(),
                ),
              ),
            ],
          ),
        ),
        FOffstage(
          offstage: hideMeasureItems || hideCommentTab || !isDragging,
          child: const DragDeleteArea(),
        ),
        FOffstage(
            offstage: hideMeasureItems || hideCommentTab || isDragging,
            child: const ArrowAnnotationButton()),
        FOffstage(
          offstage: !hideMeasureItems,
          child: FContainer(
            width: _width,
            child: FCenter(
              child: FElevatedButton(
                name: "backToVidMode",
                businessParent: widget,
                onPressed: () => measure3DViewController.backToVidMode(),
                child: FText(
                  i18nBook.measure.videoMode.t,
                  style: const TextStyle(color: Colors.white),
                ),
              ),
            ),
          ),
        ),
      ],
    );
  }
}