// ============================================================
// 채번규칙 설정 - 번호기준 관리
// ============================================================

// 기본 채번규칙 목록 - 2025년 개정 번호체계 적용
export const defaultNumberRules = [
  // 문서번호
  { id: 1, name: '견적번호 기준', target: '견적번호', prefix: 'KD-PR', dateFormat: 'YYMMDD', seqDigits: 2, separator: '-', resetCycle: 'daily', status: '활성', example: 'KD-PR-251209-01', description: '견적서 발행 시 자동 생성' },
  { id: 2, name: '수주번호 기준 (스크린)', target: '수주번호(스크린)', prefix: 'KD-TS', dateFormat: 'YYMMDD', seqDigits: 2, separator: '-', resetCycle: 'daily', status: '활성', example: 'KD-TS-251209-01', description: '스크린 모델 수주 시 (TS=스크린)' },
  { id: 3, name: '수주번호 기준 (슬랫)', target: '수주번호(슬랫)', prefix: 'KD-SL', dateFormat: 'YYMMDD', seqDigits: 2, separator: '-', resetCycle: 'daily', status: '활성', example: 'KD-SL-251209-01', description: '슬랫 모델 수주 시' },
  { id: 4, name: '수주번호 기준 (절곡)', target: '수주번호(절곡)', prefix: 'KD-BD', dateFormat: 'YYMMDD', seqDigits: 2, separator: '-', resetCycle: 'daily', status: '활성', example: 'KD-BD-251209-01', description: '절곡 모델 수주 시' },
  { id: 5, name: '발주번호 기준', target: '발주번호', prefix: 'KD-SO', dateFormat: 'YYMMDD', seqDigits: 2, separator: '-', resetCycle: 'daily', status: '활성', example: 'KD-SO-251209-01', description: '외부 공급업체 발주 시' },
  // LOT 번호
  { id: 6, name: '생산 LOT 기준', target: '생산LOT', prefix: 'KD-PL', dateFormat: 'YYMMDD', seqDigits: 2, separator: '-', resetCycle: 'daily', status: '활성', example: 'KD-PL-251209-01', description: '생산지시 발행 시' },
  { id: 7, name: '완제품/부품 LOT 기준', target: '완제품LOT', prefix: '수주번호', dateFormat: 'NONE', seqDigits: 2, separator: '-', resetCycle: 'never', status: '활성', example: 'KD-TS-251209-01-01', description: '제품검사 직전 발급, 수주번호-순번 형태' },
  // 검사 LOT
  { id: 8, name: '입고검사 LOT 기준', target: '입고검사LOT', prefix: '', dateFormat: 'YYMMDD', seqDigits: 2, separator: '-', resetCycle: 'daily', status: '활성', example: '251209-01', description: '입고검사 등록 시' },
  { id: 9, name: '중간검사 LOT 기준', target: '중간검사LOT', prefix: 'KD-WE', dateFormat: 'YYMMDD', seqDigits: 2, separator: '-', resetCycle: 'daily', status: '활성', example: 'KD-WE-251209-01-(3)', description: 'WE=Work Execution, 공정단계 포함' },
  { id: 10, name: '제품검사 LOT 기준', target: '제품검사LOT', prefix: 'KD-SA', dateFormat: 'YYMMDD', seqDigits: 2, separator: '-', resetCycle: 'daily', status: '활성', example: 'KD-SA-251209-01', description: 'SA=모델명 약자 (KSS)' },
  { id: 11, name: '검사 LOT 기준 (일반)', target: '검사LOT', prefix: 'KD-QC', dateFormat: 'YYMMDD', seqDigits: 2, separator: '-', resetCycle: 'daily', status: '활성', example: 'KD-QC-251209-01', description: 'QC=Quality Control' },
  // 작업지시 번호
  { id: 12, name: '작업지시번호 기준', target: '작업지시번호', prefix: 'KD-WO', dateFormat: 'YYMMDD', seqDigits: 2, separator: '-', resetCycle: 'daily', status: '활성', example: 'KD-WO-251209-01', description: '작업지시 발행 시' },
  // 출하 번호
  { id: 13, name: '출하번호 기준', target: '출하번호', prefix: 'KD-SH', dateFormat: 'YYMMDD', seqDigits: 2, separator: '-', resetCycle: 'daily', status: '활성', example: 'KD-SH-251209-01', description: '출하 등록 시' },
  // 현장코드
  { id: 14, name: '현장코드 기준', target: '현장코드', prefix: 'PJ', dateFormat: 'YYMMDD', seqDigits: 2, separator: '-', resetCycle: 'daily', status: '활성', example: 'PJ-251217-01', description: '현장 등록 시 자동 생성' },
  // 출고번호
  { id: 15, name: '출고번호 기준', target: '출고번호', prefix: 'P', dateFormat: 'YYMMDD', seqDigits: 2, separator: '-', resetCycle: 'daily', status: '활성', example: '250710-P-03', description: '출고 등록 시 자동 생성 (날짜-P-순번)', format: 'date-prefix-seq' },
];

// 날짜 형식 옵션
export const dateFormats = [
  { value: 'YYMMDD', label: 'YYMMDD (251205)', example: '251205' },
  { value: 'YYYYMMDD', label: 'YYYYMMDD (20251205)', example: '20251205' },
  { value: 'YYMM', label: 'YYMM (2512)', example: '2512' },
  { value: 'YYYYMM', label: 'YYYYMM (202512)', example: '202512' },
  { value: 'YY', label: 'YY (25)', example: '25' },
  { value: 'NONE', label: '사용안함', example: '' },
];

// 리셋 주기 옵션
export const resetCycleOptions = [
  { value: 'daily', label: '매일 (일자 바뀌면 01부터)' },
  { value: 'monthly', label: '매월 (월 바뀌면 01부터)' },
  { value: 'yearly', label: '매년 (년 바뀌면 01부터)' },
  { value: 'never', label: '리셋 안함 (계속 증가)' },
];

// 적용대상 목록 및 템플릿
export const targetTemplates = [
  // 문서번호
  { value: '견적번호', label: '견적번호', prefix: 'KD-PR', icon: '📋', category: '문서' },
  { value: '수주번호(스크린)', label: '수주번호 (스크린)', prefix: 'KD-TS', icon: '📦', category: '문서' },
  { value: '수주번호(슬랫)', label: '수주번호 (슬랫)', prefix: 'KD-SL', icon: '📦', category: '문서' },
  { value: '수주번호(절곡)', label: '수주번호 (절곡)', prefix: 'KD-BD', icon: '📦', category: '문서' },
  { value: '발주번호', label: '발주번호', prefix: 'KD-SO', icon: '🛒', category: '문서' },
  { value: '작업지시번호', label: '작업지시번호', prefix: 'KD-WO', icon: '📋', category: '문서' },
  { value: '출하번호', label: '출하번호', prefix: 'KD-SH', icon: '🚚', category: '문서' },
  // LOT 번호
  { value: '생산LOT', label: '생산 LOT', prefix: 'KD-PL', icon: '🏭', category: 'LOT' },
  { value: '완제품LOT', label: '완제품/부품 LOT', prefix: '수주번호', icon: '📦', category: 'LOT' },
  // 검사 LOT
  { value: '입고검사LOT', label: '입고검사 LOT', prefix: '', icon: '🔍', category: '검사' },
  { value: '중간검사LOT', label: '중간검사 LOT', prefix: 'KD-WE', icon: '🔧', category: '검사' },
  { value: '제품검사LOT', label: '제품검사 LOT', prefix: 'KD-SA', icon: '✅', category: '검사' },
  { value: '검사LOT', label: '검사 LOT (일반)', prefix: 'KD-QC', icon: '📊', category: '검사' },
  // 현장코드
  { value: '현장코드', label: '현장코드', prefix: 'PJ', icon: '🏗️', category: '기준정보' },
  // 출고번호
  { value: '출고번호', label: '출고번호', prefix: 'P', icon: '📤', category: '출하' },
];

// 날짜 문자열 생성 함수
export const formatDateCode = (date, format) => {
  const d = date || new Date();
  const yy = String(d.getFullYear()).slice(-2);
  const yyyy = String(d.getFullYear());
  const mm = String(d.getMonth() + 1).padStart(2, '0');
  const dd = String(d.getDate()).padStart(2, '0');

  switch(format) {
    case 'YYMMDD': return `${yy}${mm}${dd}`;
    case 'YYYYMMDD': return `${yyyy}${mm}${dd}`;
    case 'YYMM': return `${yy}${mm}`;
    case 'YYYYMM': return `${yyyy}${mm}`;
    case 'YY': return yy;
    case 'NONE': return '';
    default: return `${yy}${mm}${dd}`;
  }
};

// 채번규칙에 따른 번호 생성 함수
export const generateNumberByRule = (rule, existingNumbers = [], date = null) => {
  if (!rule || rule.status !== '활성') {
    return null;
  }

  const d = date || new Date();
  const dateCode = formatDateCode(d, rule.dateFormat);
  const sep = rule.separator;
  const prefix = rule.prefix;

  // 오늘/이번달/이번년도에 해당하는 기존 번호들 필터링
  let filteredNumbers = existingNumbers;
  if (rule.resetCycle === 'daily' && dateCode) {
    filteredNumbers = existingNumbers.filter(n => n.includes(dateCode));
  } else if (rule.resetCycle === 'monthly' && rule.dateFormat.includes('MM')) {
    const monthCode = formatDateCode(d, 'YYMM');
    filteredNumbers = existingNumbers.filter(n => n.includes(monthCode));
  } else if (rule.resetCycle === 'yearly') {
    const yearCode = formatDateCode(d, 'YY');
    filteredNumbers = existingNumbers.filter(n => n.includes(yearCode));
  }

  // 다음 순번 계산
  let maxSeq = 0;
  filteredNumbers.forEach(num => {
    const parts = num.split(sep);
    const lastPart = parts[parts.length - 1];
    const seq = parseInt(lastPart, 10);
    if (!isNaN(seq) && seq > maxSeq) {
      maxSeq = seq;
    }
  });

  const nextSeq = String(maxSeq + 1).padStart(rule.seqDigits, '0');

  // 번호 조합
  if (rule.dateFormat === 'NONE') {
    return prefix ? `${prefix}${sep}${nextSeq}` : nextSeq;
  }

  // format 필드에 따른 조합 순서 지원
  if (rule.format === 'date-prefix-seq') {
    // 날짜-접두사-순번 형식 (예: 250710-P-03)
    return prefix ? `${dateCode}${sep}${prefix}${sep}${nextSeq}` : `${dateCode}${sep}${nextSeq}`;
  }

  // 기본: 접두사-날짜-순번 형식 (예: KD-PR-251209-01)
  return prefix ? `${prefix}${sep}${dateCode}${sep}${nextSeq}` : `${dateCode}${sep}${nextSeq}`;
};

// 타겟별 채번규칙 찾기
export const findRuleByTarget = (rules, target) => {
  return rules.find(r => r.target === target && r.status === '활성');
};

// 수주 유형에 따른 타겟 선택 (스크린/슬랫/절곡)
export const getOrderTarget = (productType) => {
  if (productType?.includes('스크린') || productType?.includes('방화셔터')) {
    return '수주번호(스크린)';
  } else if (productType?.includes('슬랫')) {
    return '수주번호(슬랫)';
  } else if (productType?.includes('절곡')) {
    return '수주번호(절곡)';
  }
  return '수주번호(스크린)'; // 기본값
};

// localStorage 키
export const NUMBER_RULES_STORAGE_KEY = 'numberRules';
export const NUMBER_SEQUENCES_STORAGE_KEY = 'numberSequences';

// localStorage에서 채번규칙 불러오기
export const loadNumberRules = () => {
  try {
    const saved = localStorage.getItem(NUMBER_RULES_STORAGE_KEY);
    if (saved) {
      return JSON.parse(saved);
    }
  } catch (e) {
    console.error('Failed to load number rules:', e);
  }
  return defaultNumberRules;
};

// localStorage에 채번규칙 저장
export const saveNumberRules = (rules) => {
  try {
    localStorage.setItem(NUMBER_RULES_STORAGE_KEY, JSON.stringify(rules));
  } catch (e) {
    console.error('Failed to save number rules:', e);
  }
};

// 시퀀스 정보 저장/불러오기 (날짜별 순번 관리)
export const loadNumberSequences = () => {
  try {
    const saved = localStorage.getItem(NUMBER_SEQUENCES_STORAGE_KEY);
    if (saved) {
      return JSON.parse(saved);
    }
  } catch (e) {
    console.error('Failed to load number sequences:', e);
  }
  return {};
};

export const saveNumberSequences = (sequences) => {
  try {
    localStorage.setItem(NUMBER_SEQUENCES_STORAGE_KEY, JSON.stringify(sequences));
  } catch (e) {
    console.error('Failed to save number sequences:', e);
  }
};

// 다음 시퀀스 번호 가져오기 및 증가
export const getNextSequence = (target, dateCode = null) => {
  const sequences = loadNumberSequences();
  const key = dateCode ? `${target}_${dateCode}` : target;

  const current = sequences[key] || 0;
  const next = current + 1;

  sequences[key] = next;
  saveNumberSequences(sequences);

  return next;
};

// 채번 생성 통합 함수 (실제 사용)
export const generateNumber = (target, productType = null, existingNumbers = [], date = null) => {
  const rules = loadNumberRules();

  // 수주번호인 경우 제품 유형에 따라 타겟 선택
  let actualTarget = target;
  if (target === '수주번호' && productType) {
    actualTarget = getOrderTarget(productType);
  }

  const rule = findRuleByTarget(rules, actualTarget);
  if (!rule) {
    // 기본 규칙이 없으면 기본 형식 사용
    const d = date || new Date();
    const dateCode = formatDateCode(d, 'YYMMDD');
    const seq = String(getNextSequence(target, dateCode)).padStart(2, '0');
    return `KD-${target.slice(0, 2).toUpperCase()}-${dateCode}-${seq}`;
  }

  return generateNumberByRule(rule, existingNumbers, date);
};

export default {
  defaultNumberRules,
  dateFormats,
  resetCycleOptions,
  targetTemplates,
  formatDateCode,
  generateNumberByRule,
  findRuleByTarget,
  getOrderTarget,
  loadNumberRules,
  saveNumberRules,
  loadNumberSequences,
  saveNumberSequences,
  getNextSequence,
  generateNumber,
};
