export type EntityTypeGroupId = | "split" | "route" | "area_polygon" | "area_circle" | "point"; export type EntityGeometryPreset = "line" | "polygon" | "circle-area" | "point"; export type EntityTypeGroup = { id: EntityTypeGroupId; label: string; geometryLabel: string; description: string; }; export type EntityTypeOption = { value: string; label: string; groupId: EntityTypeGroupId; groupLabel: string; geometryPreset: EntityGeometryPreset; }; export const ENTITY_TYPE_GROUPS: EntityTypeGroup[] = [ { id: "split", label: "Split", geometryLabel: "Line", description: "Tuyến chia cắt/phòng thủ.", }, { id: "route", label: "Route", geometryLabel: "Line", description: "Các tuyến di chuyển theo hướng.", }, { id: "area_polygon", label: "Area - Đa giác", geometryLabel: "Polygon", description: "Vùng lãnh thổ dạng đa giác.", }, { id: "area_circle", label: "Area - Tròn", geometryLabel: "Polygon tròn", description: "Vùng sự kiện theo bán kính ảnh hưởng.", }, { id: "point", label: "Point", geometryLabel: "Point", description: "Địa điểm đơn lẻ.", }, ]; const GROUP_BY_ID: Record = { split: ENTITY_TYPE_GROUPS[0], route: ENTITY_TYPE_GROUPS[1], area_polygon: ENTITY_TYPE_GROUPS[2], area_circle: ENTITY_TYPE_GROUPS[3], point: ENTITY_TYPE_GROUPS[4], }; const RAW_ENTITY_TYPE_OPTIONS: Array<{ value: string; label: string; groupId: EntityTypeGroupId; geometryPreset: EntityGeometryPreset; }> = [ { value: "defense_line", label: "Defense Line", groupId: "split", geometryPreset: "line" }, { value: "attack_route", label: "Attack Route", groupId: "route", geometryPreset: "line" }, { value: "retreat_route", label: "Retreat Route", groupId: "route", geometryPreset: "line" }, { value: "invasion_route", label: "Invasion Route", groupId: "route", geometryPreset: "line" }, { value: "migration_route", label: "Migration Route", groupId: "route", geometryPreset: "line" }, { value: "refugee_route", label: "Refugee Route", groupId: "route", geometryPreset: "line" }, { value: "trade_route", label: "Trade Route", groupId: "route", geometryPreset: "line" }, { value: "shipping_route", label: "Shipping Route", groupId: "route", geometryPreset: "line" }, { value: "country", label: "Country", groupId: "area_polygon", geometryPreset: "polygon" }, { value: "state", label: "State", groupId: "area_polygon", geometryPreset: "polygon" }, { value: "empire", label: "Empire", groupId: "area_polygon", geometryPreset: "polygon" }, { value: "kingdom", label: "Kingdom", groupId: "area_polygon", geometryPreset: "polygon" }, { value: "war", label: "War", groupId: "area_circle", geometryPreset: "circle-area" }, { value: "battle", label: "Battle", groupId: "area_circle", geometryPreset: "circle-area" }, { value: "civilization", label: "Civilization", groupId: "area_circle", geometryPreset: "circle-area" }, { value: "rebellion_zone", label: "Rebellion Zone", groupId: "area_circle", geometryPreset: "circle-area" }, { value: "person_deathplace", label: "Person Deathplace", groupId: "point", geometryPreset: "point" }, { value: "person_birthplace", label: "Person Birthplace", groupId: "point", geometryPreset: "point" }, { value: "person_activity", label: "Person Activity", groupId: "point", geometryPreset: "point" }, { value: "temple", label: "Temple", groupId: "point", geometryPreset: "point" }, { value: "capital", label: "Capital", groupId: "point", geometryPreset: "point" }, { value: "city", label: "City", groupId: "point", geometryPreset: "point" }, { value: "fortress", label: "Fortress", groupId: "point", geometryPreset: "point" }, { value: "castle", label: "Castle", groupId: "point", geometryPreset: "point" }, { value: "ruin", label: "Ruin", groupId: "point", geometryPreset: "point" }, { value: "port", label: "Port", groupId: "point", geometryPreset: "point" }, { value: "bridge", label: "Bridge", groupId: "point", geometryPreset: "point" }, ]; export const ENTITY_TYPE_OPTIONS: EntityTypeOption[] = RAW_ENTITY_TYPE_OPTIONS.map((item) => ({ ...item, groupLabel: GROUP_BY_ID[item.groupId].label, })); export const DEFAULT_ENTITY_TYPE_ID = "country"; export function groupEntityTypeOptions(options: EntityTypeOption[] = ENTITY_TYPE_OPTIONS): Array<{ id: EntityTypeGroupId; label: string; geometryLabel: string; description: string; options: EntityTypeOption[]; }> { return ENTITY_TYPE_GROUPS.map((group) => ({ ...group, options: options.filter((option) => option.groupId === group.id), })).filter((group) => group.options.length > 0); } export function findEntityTypeOption(typeId: string | null | undefined): EntityTypeOption | null { if (!typeId) return null; return ENTITY_TYPE_OPTIONS.find((option) => option.value === typeId) || null; }