import { KeydownType, type Options } from '@meta2d/core';
import { invert } from 'lodash-es';

/**
 * 地图点位类型枚举
 * 定义了场景编辑器中所有支持的点位类型
 * 数值1-9为小点位，10以上为大点位（有特殊图标）
 */
//#region 点位
export enum MapPointType {
  /** 普通点 - 基础导航点，机器人可通过 */
  普通点 = 1,
  /** 等待点 - 机器人等待或暂停的位置 */
  等待点,
  /** 避让点 - 机器人主动避让其他机器人的点位 */
  避让点,
  /** 临时避让点 - 动态生成的临时避让位置，有特殊标记 */
  临时避让点,

  /** 电梯点 - 机器人乘坐电梯的专用点位 */
  电梯点 = 11,
  /** 自动门点 - 需要自动门控制的通行点位 */
  自动门点,
  /** 充电点 - 机器人充电的专用位置，可绑定特定机器人 */
  充电点,
  /** 停靠点 - 机器人停靠等待的位置，可绑定特定机器人 */
  停靠点,
  /** 动作点 - 机器人执行特定动作的位置（如取货、放货） */
  动作点,
  /** 禁行点 - 禁止机器人通过的点位 */
  禁行点,
}

/**
 * 点位类型映射数组，用于UI显示和选择
 * 过滤掉非数字类型的枚举项
 */
export const MAP_POINT_TYPES = Object.freeze(
  <[string, MapPointType][]>Object.entries(MapPointType).filter(([, v]) => typeof v === 'number'),
);
//#endregion

/**
 * 地图路线类型枚举
 * 定义了连接点位之间的路径类型
 */
//#region 线路
export enum MapRouteType {
  /** 直线 - 两点间直线连接 */
  直线 = 'line',
  /** 二阶贝塞尔曲线 - 带一个控制点的曲线 */
  二阶贝塞尔曲线 = 'bezier2',
  /** 三阶贝塞尔曲线 - 带两个控制点的曲线，更灵活 */
  三阶贝塞尔曲线 = 'bezier3',
}

/**
 * 路线类型反向映射，用于从字符串值获取枚举键
 */
export const MAP_ROUTE_TYPE = invert(MapRouteType);

/**
 * 路线类型映射数组，用于UI显示和选择
 */
export const MAP_ROUTE_TYPES = Object.freeze(<[string, MapRouteType][]>Object.entries(MapRouteType));

/**
 * 路线通行类型枚举
 * 定义了路线的通行权限和限制
 */
export enum MapRoutePassType {
  /** 无限制 - 所有机器人都可以通行 */
  无,
  /** 仅空载可通行 - 只有空载的机器人可以通过 */
  仅空载可通行,
  /** 仅载货可通行 - 只有载货的机器人可以通过 */
  仅载货可通行,
  /** 禁行 - 禁止所有机器人通行，显示为虚线 */
  禁行 = 10,
}

/**
 * 路线通行类型映射数组，用于UI显示和选择
 */
export const MAP_ROUTE_PASS_TYPES = Object.freeze(
  <[string, MapRoutePassType][]>Object.entries(MapRoutePassType).filter(([, v]) => typeof v === 'number'),
);
//#endregion

/**
 * 地图区域类型枚举
 * 定义了场景中不同功能的区域类型
 */
//#region 区域
export enum MapAreaType {
  /** 库区 - 仓储作业区域，包含动作点 */
  库区 = 1,

  /** 互斥区 - 同时只能有一个机器人进入的区域 */
  互斥区 = 11,
  /** 非互斥区 - 可以同时有多个机器人进入的区域 */
  非互斥区,
}

/**
 * 区域类型映射数组，用于UI显示和选择
 */
export const MAP_AREA_TYPES = Object.freeze(
  <[string, MapAreaType][]>Object.entries(MapAreaType).filter(([, v]) => typeof v === 'number'),
);
//#endregion

/**
 * 场景编辑器核心配置
 * 基于Meta2D引擎的编辑器配置参数
 */
export const EDITOR_CONFIG: Options = {
  /** 键盘事件类型 - 禁用所有键盘快捷键 */
  keydown: KeydownType.None,
  /** 严格作用域 - 限制编辑操作范围 */
  strictScope: true,
  /** 移动连接线 - 禁用拖动时自动移动连接的线条 */
  moveConnectedLine: false,
  /** 禁用输入 - 禁用文本输入功能 */
  disableInput: true,
  /** 禁用旋转 - 禁用图形旋转功能 */
  disableRotate: true,
  /** 禁用尺寸调整 - 禁用图形大小调整 */
  disableSize: true,
  /** 禁用锚点 - 禁用连接锚点显示 */
  disableAnchor: true,
  /** 禁用空线条 - 不允许创建没有连接点的线条 */
  disableEmptyLine: true,
  /** 禁用重复线条 - 不允许在同一对点之间创建多条线 */
  disableRepeatLine: true,
  /** 最小缩放比例 - 画布最小缩放到1% */
  minScale: 0.01,
  /** 最大缩放比例 - 画布最大缩放到401% */
  maxScale: 4.01,
  /** 缩放步长 - 每次滚轮滚动的缩放幅度（5%） */
  scaleOff: 0.05,
  /** 默认锚点 - 不设置默认锚点 */
  defaultAnchors: [],
  /** 全局透明度 - 普通状态下图形透明度（0为不透明） */
  globalAlpha: 0,
  /** 激活状态全局透明度 - 选中状态下图形透明度 */
  activeGlobalAlpha: 0,
  /** 默认字体大小 - 14像素 */
  fontSize: 14,
  /** 行高倍数 - 1.5倍行高 */
  lineHeight: 1.5,
  /** 字体族 - 使用系统默认字体 */
  fontFamily: 'system-ui',
  /** 文本旋转 - 禁用文本跟随图形旋转 */
  textRotate: false,
  /** 文本水平对齐 - 居中对齐 */
  textAlign: 'center',
  /** 文本垂直基线 - 顶部对齐 */
  textBaseline: 'top',
};
