/**
 * 测量面板 - 类型定义
 * 
 * 注意：
 * - 本次只实现 UI，不实现真实测量逻辑（拾取、画线、计算等）。
 * - 这里的类型以“可读性优先”为原则，尽量直观、易扩展。
 */

/**
 * 测量方式（8 种）
 * 
 * 说明：
 * - id 采用英文驼峰/小写，便于程序内部使用；
 * - 显示名称必须通过国际化 key 获取（见 locales）。
 */
export type MeasureMode =
  | 'distance'        // 距离
  | 'minDistance'     // 最小距离
  | 'angle'           // 角度
  | 'elevation'       // 标高
  | 'volume'          // 体积
  | 'laserDistance'   // 激光测距
  | 'slope'           // 坡度
  | 'spaceVolume';    // 空间体积

/**
 * 距离/标高等“长度类”单位
 */
export type MeasureUnit = 'm' | 'cm' | 'mm' | 'km';

/**
 * 精度（小数位数）
 * - 0   -> 0
 * - 1   -> 0.0
 * - 2   -> 0.00
 * - 3   -> 0.000
 */
export type MeasurePrecision = 0 | 1 | 2 | 3;

/**
 * 测量配置项（由组件内部维护默认值，并读取/写入缓存）
 */
export interface MeasureConfig {
  unit: MeasureUnit;
  precision: MeasurePrecision;
}

/**
 * 3D 坐标（可选展示）
 */
export interface MeasureXYZ {
  x: number;
  y: number;
  z: number;
}

/**
 * 测量结果数据
 * 
 * 说明：
 * - 真实测量未实现，因此结果由外部通过 setResult 传入。
 * - 不同测量方式对应不同字段；未传入则 UI 显示 “--”。
 */
export interface MeasureResult {
  /** 距离（单位：mm） */
  distanceMm?: number;
  /** 最小距离（单位：mm） */
  minDistanceMm?: number;
  /** 角度（单位：deg） */
  angleDeg?: number;
  /** 标高（单位：mm） */
  elevationMm?: number;
  /** 体积（单位：m³） */
  volumeM3?: number;
  /** 激光测距（单位：mm） */
  laserDistanceMm?: number;
  /** 坡度（单位：%） */
  slopePercent?: number;
  /** 空间体积（单位：m³） */
  spaceVolumeM3?: number;

  /** 可选：展示测量点/结果点坐标（单位由引擎侧定义，这里只负责显示） */
  xyz?: MeasureXYZ;
}

/**
 * MeasurePanel 组件配置
 */
export interface MeasurePanelOptions {
  /** 默认测量方式（不传则默认 distance） */
  defaultMode?: MeasureMode;
  /** 是否默认展开（不传则默认 false，即展示前 4 个） */
  defaultExpanded?: boolean;

  /**
   * 测量方式切换回调（只通知 UI 状态变化，不包含真实测量逻辑）
   * @param mode 当前选中的测量方式
   */
  onModeChange?: (mode: MeasureMode) => void;

  /**
   * “删除全部”回调
   */
  onClearAll?: () => void;

  /**
   * “设置”回调
   * 说明：设置按钮点击时会先在组件内部进入设置面板，再触发该回调（如果存在）
   */
  onSettings?: () => void;

  /**
   * 展开/收起状态变更回调
   * 说明：用于让外部（如 Dialog）重新计算尺寸。
   */
  onExpandedChange?: (expanded: boolean) => void;
}


