import 'package:fis_measure/interfaces/enums/items.dart';
import 'package:fis_measure/interfaces/process/items/item.dart';
import 'package:fis_measure/interfaces/process/items/item_metas.dart';
import 'package:fis_measure/interfaces/process/workspace/point_info.dart';
import 'package:fis_measure/process/primitives/location.dart';
import 'package:fis_measure/utils/prompt_box.dart';

class URMLoaction extends Location {
  URMLoaction(ItemMeta meta, IMeasureItem? parent) : super(meta, parent);

  static URMLoaction createURMLocation(
    ItemMeta meta, [
    IMeasureItem? parent,
  ]) {
    URMLoaction location = URMLoaction(meta, parent);
    // location.calculator = URMLocationCal(location);
    return location;
  }

  @override
  bool onExecuteMouse(PointInfo args) {
    if (waitingResult) return false;
    if (state == ItemStates.finished || state == ItemStates.waiting) {
      if (args.pointType == PointInfoType.mouseMove) {
        handleMouseMoveWhileFinish(args);
      }
    }
    if (state == ItemStates.running) {
      if (args.pointType == PointInfoType.mouseUp) return false;

      feature?.point = args;
      if (args.pointType == PointInfoType.mouseDown) {
        handleFinish();
      }
    }
    return true;
  }

  bool waitingResult = false;

  void handleFinish() async {
    feature!.isActive = false;
    waitingResult = true;
    await doCalculateAsync();
    doFeatureFinish();
    doFeatureUpdate(); // 若不执行,子测量将无法自动切换
    PromptBox.dismiss();
    waitingResult = false;
  }

  @override
  bool onExecuteTouch(PointInfo args) {
    if (state == ItemStates.finished || state == ItemStates.waiting) {
      if (args.pointType == PointInfoType.touchDown) {
        handleMouseMoveWhileFinish(args);
      }
    }
    if (state == ItemStates.running) {
      if (args.pointType == PointInfoType.touchDown) {
        feature?.point = args;
        doCalculate();
        doFeatureFinish();
      }
    }
    return true;
  }
}