/**
 * 렉 구조 컴포넌트 기본 설정
 */

import {
  RackStructureComponentConfig,
  FormatSegment,
  FormatSegmentType,
  LocationFormatConfig,
} from "./types";

// 세그먼트 타입별 한글 표시명
export const SEGMENT_TYPE_LABELS: Record<FormatSegmentType, string> = {
  warehouseCode: "창고코드",
  floor: "층",
  zone: "구역",
  row: "열",
  level: "단",
};

// 위치코드 기본 세그먼트 (현재 하드코딩과 동일한 결과)
export const defaultCodeSegments: FormatSegment[] = [
  { type: "warehouseCode", enabled: true, showLabel: false, label: "",    separatorAfter: "-", pad: 0 },
  { type: "floor",         enabled: true, showLabel: true,  label: "층",  separatorAfter: "",  pad: 0 },
  { type: "zone",          enabled: true, showLabel: true,  label: "구역", separatorAfter: "-", pad: 0 },
  { type: "row",           enabled: true, showLabel: false, label: "",    separatorAfter: "-", pad: 2 },
  { type: "level",         enabled: true, showLabel: false, label: "",    separatorAfter: "",  pad: 0 },
];

// 위치명 기본 세그먼트 (현재 하드코딩과 동일한 결과)
export const defaultNameSegments: FormatSegment[] = [
  { type: "zone",  enabled: true, showLabel: true, label: "구역", separatorAfter: "-", pad: 0 },
  { type: "row",   enabled: true, showLabel: true, label: "열",   separatorAfter: "-", pad: 2 },
  { type: "level", enabled: true, showLabel: true, label: "단",   separatorAfter: "",  pad: 0 },
];

export const defaultFormatConfig: LocationFormatConfig = {
  codeSegments: defaultCodeSegments,
  nameSegments: defaultNameSegments,
};

// 세그먼트 타입별 기본 한글 접미사 (context 값에 포함되어 있는 한글)
const KNOWN_SUFFIXES: Partial<Record<FormatSegmentType, string>> = {
  floor: "층",
  zone: "구역",
};

// 값에서 알려진 한글 접미사를 제거하여 순수 값만 추출
function stripKnownSuffix(type: FormatSegmentType, val: string): string {
  const suffix = KNOWN_SUFFIXES[type];
  if (suffix && val.endsWith(suffix)) {
    return val.slice(0, -suffix.length);
  }
  return val;
}

// 세그먼트 배열로 포맷된 문자열 생성
export function buildFormattedString(
  segments: FormatSegment[],
  values: Record<string, string>,
): string {
  const activeSegments = segments.filter(
    (seg) => seg.enabled && values[seg.type],
  );

  return activeSegments
    .map((seg, idx) => {
      // 1) 원본 값에서 한글 접미사를 먼저 벗겨냄 ("A구역" → "A", "1층" → "1")
      let val = stripKnownSuffix(seg.type, values[seg.type]);

      // 2) showLabel이 켜져 있고 label이 있으면 붙임
      if (seg.showLabel && seg.label) {
        val += seg.label;
      }

      if (seg.pad > 0 && !isNaN(Number(val))) {
        val = val.padStart(seg.pad, "0");
      }

      if (idx < activeSegments.length - 1) {
        val += seg.separatorAfter;
      }
      return val;
    })
    .join("");
}

// 미리보기용 샘플 값
export const SAMPLE_VALUES: Record<string, string> = {
  warehouseCode: "WH001",
  floor: "1층",
  zone: "A구역",
  row: "1",
  level: "1",
};

export const defaultConfig: RackStructureComponentConfig = {
  maxConditions: 10,
  maxRows: 99,
  maxLevels: 20,
  codePattern: "{warehouseCode}-{floor}{zone}-{row:02d}-{level}",
  namePattern: "{zone}구역-{row:02d}열-{level}단",
  showTemplates: true,
  showPreview: true,
  showStatistics: true,
  readonly: false,
  initialConditions: [],
};
