import 'package:fis_measure/interfaces/date_types/int_size.dart';
import 'package:fis_measure/interfaces/process/workspace/point_info.dart';
import 'package:fis_measure/process/items/item.dart';
import 'package:fis_measure/process/items/item_feature.dart';
import 'package:fis_measure/process/workspace/measure_data_controller.dart';
import 'package:flutter/services.dart';
import 'package:get/get.dart';

mixin AutoSnapMixin<T extends MeasureItemFeature> on MeasureItem<T> {
  final measureData = Get.find<MeasureDataController>();
  bool _isSmartMove = false;
  bool _isAutoSnap = true;
  double _snapThreshold = 10.0;
  bool snapState = false;

  /// 是否启动智能定位
  bool get isSmartMove => _isSmartMove;
  set isSmartMove(bool value) {
    if (value != _isSmartMove) {
      _isSmartMove = value;
    }
  }

  bool get isAutoSnap => _isAutoSnap;
  set isAutoSnap(bool val) {
    if (val != _isAutoSnap) {
      _isAutoSnap = val;
    }
  }

  /// 自动结束阈值 pixel
  double get snapThreshold => measureData.getAutoSnapDistance();
  set snapThreshold(double val) {
    if (val != _snapThreshold) {
      _snapThreshold = val;
    }
  }

  /// 自动结束检测
  bool checkAutoSnap(PointInfo current, [bool autoFinishFeature = true]) {
    if (feature == null || feature!.innerPoints.length < 3) {
      isSmartMove = false;
      return _syncState(false);
    }

    // final viewport = feature!.hostVisualArea!.viewport!;

    if (isAutoSnap == false) return false;
    final pixelSize = application.displaySize;

    final p1 = feature!.innerPoints.first.scale2Size(pixelSize);
    final p2 = current.scale2Size(pixelSize);
    final length = (p1 - p2).length;
    if (length > snapThreshold * 2.0 && !isSmartMove) {
      isSmartMove = true;
    }
    if (length < snapThreshold && isSmartMove) {
      feature!.innerPoints.last = feature!.innerPoints.first.clone();

      /// 此处的最后一个点,方便计算,但是绘制时要剔除
      // feature!.innerPoints.removeLast();

      HapticFeedback.heavyImpact();
      if (autoFinishFeature) {
        doCalculate();
        doFeatureFinish();
      }
      isSmartMove = false;
      return _syncState(true);
    } else {
      return _syncState(false);
    }
  }

  bool _syncState(bool isSnap) {
    snapState = isSnap;
    return snapState;
  }
}