/**
 * SmartExcelUpload — 설정 기반 엑셀 업로드 공통 모듈 타입 정의
 */

/** 드롭다운 소스 설정 */
export interface DropdownConfig {
  /** 드롭다운 소스 유형 */
  source: "category" | "custom" | "reference" | "indirect";
  /** 카테고리 조회 시 테이블명 */
  tableName?: string;
  /** 카테고리 조회 시 컬럼명 */
  columnName?: string;
  /** 고정 값 목록 (source: "custom") */
  values?: string[];
  /** 참조시트 컬럼에서 가져올 때 (source: "reference") — VLOOKUP 기반 */
  referenceColumn?: string;
  /** INDIRECT 연동 시 참조할 컬럼 키 (source: "indirect") — 품목별 공정 등 */
  indirectKeyColumn?: string;
  /** INDIRECT 이름 범위 prefix (source: "indirect") — 예: "ACC_" → INDIRECT("ACC_" & 셀값) */
  indirectPrefix?: string;
}

/** 컬럼 정의 */
export interface SmartColumn {
  /** DB 컬럼명 */
  key: string;
  /** 엑셀 헤더 라벨 */
  label: string;
  /** 필수 여부 */
  required?: boolean;
  /** 데이터 타입 */
  type: "text" | "number" | "date" | "dropdown";
  /** 드롭다운 설정 */
  dropdown?: DropdownConfig;
  /** VLOOKUP 자동 입력 (참조시트에서 자동으로 값 가져옴, 사용자 입력 불가) */
  autoFill?: {
    /** 참조시트에서 lookup할 키 컬럼 (같은 시트의 어떤 컬럼 값을 기준으로) */
    lookupColumn: string;
    /** 참조시트에서 가져올 컬럼명 */
    referenceColumn: string;
  };
  /** 조건부 활성화 — 다른 컬럼 값이 일치할 때만 입력 가능 */
  enableWhen?: {
    /** 참조할 컬럼 키 */
    column: string;
    /** 해당 값일 때만 입력 가능 */
    equals: string;
  };
  /** 조건부 비활성화 — 다른 컬럼 값이 일치하면 입력 차단 */
  disableWhen?: {
    /** 참조할 컬럼 키 */
    column: string;
    /** 해당 값일 때 입력 차단 */
    equals: string;
  };
  /** 커스텀 수식 — {col:key} 형태로 같은 행의 다른 컬럼 셀 참조 가능 */
  customFormula?: string;
  /** 읽기전용 (자동채움 등) */
  readOnly?: boolean;
  /** 컬럼 너비 (기본 18) */
  width?: number;
}

/** 시트 정의 */
export interface SheetConfig {
  /** 시트명 (예: "수입검사") */
  name: string;
  /** DB 저장 시 타입 구분 값 (예: "수입검사") */
  typeKey?: string;
  /** 컬럼 정의 */
  columns: SmartColumn[];
}

/** 참조시트 정의 — 검사기준정보 등 lookup 데이터 */
export interface ReferenceSheetConfig {
  /** 시트명 */
  name: string;
  /** 컬럼 정의 */
  columns: { key: string; label: string }[];
  /** 참조 데이터 (런타임에 주입) */
  data?: Record<string, any>[];
}

/** 조건부 검증 규칙 */
export interface ConditionalRule {
  /** 조건: 어떤 컬럼이 어떤 값일 때 */
  when: { column: string; equals: string };
  /** 필수가 되는 컬럼들 */
  require: string[];
  /** 무시해도 되는 컬럼들 (비어있어도 OK) */
  ignore: string[];
}

/** 품목별 공정 매핑 (INDIRECT 동적 드롭다운용) */
export interface ItemProcessMapping {
  /** 품목코드 */
  itemCode: string;
  /** 품목명 */
  itemName: string;
  /** 해당 품목의 공정 목록 */
  processes: { code: string; name: string }[];
}

/** INDIRECT prefix(ACC_) 기반 동적 드롭다운 옵션 정의 */
export interface IndirectOptionsConfig {
  /** 참조시트에서 조건을 판단할 컬럼 키 (예: "judgment_criteria") */
  conditionColumn: string;
  /** 조건값→옵션 매핑 */
  optionsByCondition: Record<string, string[]>;
  /** 참조시트에서 선택옵션을 가져올 컬럼 키 (콤마 구분 문자열, 예: "selection_options") */
  selectionOptionsColumn?: string;
}

/** 전체 설정 */
export interface SmartExcelUploadConfig {
  /** 템플릿 파일명 (예: "품목검사정보") */
  templateName: string;
  /** 시트 정의 목록 */
  sheets: SheetConfig[];
  /** 참조시트 설정 (없으면 생략) */
  referenceSheet?: ReferenceSheetConfig;
  /** 조건부 검증 규칙 (없으면 단순 필수값 체크만) */
  conditionalRules?: ConditionalRule[];
  /** INDIRECT ACC_ 동적 드롭다운 옵션 설정 (없으면 ACC_ 시트 미생성) */
  indirectOptions?: IndirectOptionsConfig;
  /** 추가 메타 정보 (템플릿에 포함) */
  extraMeta?: Record<string, string>;
}

/** 파싱 결과 — 시트별 데이터 */
export interface ParsedSheetData {
  sheetName: string;
  typeKey?: string;
  rows: Record<string, any>[];
}

/** 검증 에러 */
export interface ValidationError {
  sheet: string;
  row: number;
  column: string;
  message: string;
}

/** 파싱 + 검증 결과 */
export interface ParseResult {
  success: boolean;
  data: ParsedSheetData[];
  errors: ValidationError[];
  warnings: string[];
}
