// ============================================================
// 공통코드관리 - 코드기준/채번규칙 설정
// ============================================================

// 품목유형별 코드 매핑
export const itemTypeCodeMapping = {
  '제품': { prefix: 'FG', description: '완제품 (Finished Goods)' },
  '부품': { prefix: 'BP', description: '부품류 (Parts)' },
  '부자재': { prefix: 'SM', description: '부자재 (Sub Materials)' },
  '원자재': { prefix: 'RM', description: '원자재 (Raw Materials)' },
  '소모품': { prefix: 'CS', description: '소모품 (Consumables)' },
};

// 부품 하위유형별 코드 매핑
export const partSubTypeCodeMapping = {
  '조립 부품': { prefix: 'AS', description: '조립 부품 (Assembly Parts)' },
  '절곡 부품': { prefix: 'BD', description: '절곡 부품 (Bending Parts)' },
  '구매 부품': { prefix: 'PP', description: '구매 부품 (Purchased Parts)' },
};

// 부자재 품목별 코드 매핑
export const subMaterialCodeMapping = {
  '스크린원단': { code: 'SCR', specs: ['0.3T', '0.4T', '0.5T', '0.6T'] },
  '슬랫': { code: 'SLT', specs: ['50mm', '75mm', '100mm'] },
  '가이드레일': { code: 'GR', specs: ['50×50', '60×60', '70×70', '80×80'] },
  '샤프트': { code: 'SFT', specs: ['4인치', '5인치', '6인치'] },
  '스프링': { code: 'SPR', specs: ['소형', '중형', '대형'] },
  '체인': { code: 'CHN', specs: ['#25', '#35', '#40'] },
};

// 원자재 품목별 코드 매핑
export const rawMaterialCodeMapping = {
  '철판': { code: 'STEEL', specs: ['1.0T', '1.2T', '1.6T', '2.0T', '2.3T', '3.0T'] },
  '아연도금강판': { code: 'EGI', specs: ['0.8T', '1.0T', '1.2T', '1.6T'] },
  '스테인리스': { code: 'SUS', specs: ['0.8T', '1.0T', '1.2T', '1.5T', '2.0T'] },
  '알루미늄판': { code: 'AL', specs: ['1.0T', '1.5T', '2.0T', '3.0T'] },
  '각파이프': { code: 'PIPE', specs: ['30×30', '40×40', '50×50', '60×60'] },
};

// 구매 부품 품목별 코드 매핑
export const purchasedPartCodeMapping = {
  '전동개폐기': { code: 'E', powers: ['220V', '380V'], capacities: ['300 KG', '500 KG', '1000 KG'] },
  '수동개폐기': { code: 'M', powers: [], capacities: ['소형', '중형', '대형'] },
  '제어반': { code: 'CTL', powers: ['단상', '3상'], capacities: ['5A', '10A', '15A', '20A'] },
  '연기감지기': { code: 'SMK', powers: ['DC24V'], capacities: ['1구', '2구', '4구'] },
  '열감지기': { code: 'HT', powers: ['DC24V'], capacities: ['정온식', '차동식'] },
  '비상스위치': { code: 'SW', powers: ['DC24V', 'AC220V'], capacities: [] },
};

// 품목코드 채번규칙 정의
export const itemCodeRules = [
  {
    id: 'ITEM_SUB_MATERIAL',
    name: '부자재 코드규칙',
    itemType: '부자재',
    pattern: '{품목명}-{규격}',
    example: '연동제어기-매립(유선)',
    description: '품목명-규격 형태로 연결',
    components: ['품목명', '규격'],
    separator: '-',
    status: '활성',
    priority: 1,
  },
  {
    id: 'ITEM_RAW_MATERIAL',
    name: '원자재 코드규칙',
    itemType: '원자재',
    pattern: '{품목명}-{규격}',
    example: '철판-SUS-1.2T',
    description: '품목명-규격 형태로 연결',
    components: ['품목명', '규격'],
    separator: '-',
    status: '활성',
    priority: 2,
  },
  {
    id: 'ITEM_CONSUMABLE',
    name: '소모품 코드규칙',
    itemType: '소모품',
    pattern: '{품목명}-{규격}',
    example: '용접봉-3.2MM',
    description: '품목명-규격 형태로 연결',
    components: ['품목명', '규격'],
    separator: '-',
    status: '활성',
    priority: 3,
  },
  {
    id: 'ITEM_PURCHASED_PART',
    name: '구매부품 코드규칙',
    itemType: '부품',
    subType: '구매 부품',
    pattern: '{품목명}-{규격}',
    example: '전동개폐기-220V300KG',
    description: '품목명-규격 (규격 = 전원 + 용량)',
    components: ['품목명', '전원', '용량'],
    separator: '-',
    status: '활성',
    priority: 4,
  },
  {
    id: 'ITEM_ASSEMBLY_PART',
    name: '조립부품 코드규칙',
    itemType: '부품',
    subType: '조립 부품',
    pattern: '{품목명} {설치유형}-{측면규격(가로)}*{측면규격(세로)}*{길이}',
    example: '가이드레일 벽면형-1211*1111*24',
    description: '품목명 + 설치유형 - 측면규격(가로)*측면규격(세로)*길이(앞2자리)',
    components: ['품목명', '설치유형', '측면규격(가로)', '측면규격(세로)', '길이'],
    separator: '-',
    status: '활성',
    priority: 5,
  },
  {
    id: 'ITEM_BENDING_PART',
    name: '절곡부품 코드규칙',
    itemType: '부품',
    subType: '절곡 부품',
    pattern: '{품목코드}{종류코드}{모양&길이코드}',
    example: 'RM24',
    description: '품목코드(R) + 종류코드(M) + 모양&길이(앞2자리, 24)',
    components: ['품목명', '종류', '모양&길이'],
    separator: '',
    status: '활성',
    priority: 6,
  },
  {
    id: 'ITEM_PRODUCT',
    name: '제품 코드규칙',
    itemType: '제품',
    pattern: '{품목명}',
    example: '방화셔터 W3000×H4000',
    description: '제품의 품목명이 곧 품목코드가 됨 (품목명 = 품목코드)',
    components: ['품목명'],
    separator: '',
    status: '활성',
    priority: 7,
    codeEqualsName: true, // 품목명 = 품목코드 플래그
  },
];

// 기타 코드기준 (거래처, 현장 등)
export const otherCodeRules = [
  {
    id: 'CODE_CUSTOMER',
    name: '거래처코드 기준',
    target: '거래처코드',
    codeType: 'simple',
    prefix: 'C',
    pattern: '{접두사}-{순번}',
    example: 'C-001',
    description: '거래처 식별코드',
    seqDigits: 3,
    separator: '-',
    status: '활성',
  },
  {
    id: 'CODE_SITE',
    name: '현장코드 기준',
    target: '현장코드',
    codeType: 'simple',
    prefix: 'S',
    pattern: '{접두사}-{순번}',
    example: 'S-001',
    description: '현장 식별코드',
    seqDigits: 3,
    separator: '-',
    status: '활성',
  },
];

// 제품 유형별 약어 매핑
export const productTypeAbbreviations = {
  '방화셔터': 'SH',
  '방화문': 'DR',
  '방연셔터': 'SS',
  '자동문': 'AD',
  '오버헤드도어': 'OH',
  '하이스피드도어': 'HS',
  '스틸셔터': 'ST',
  '그릴셔터': 'GS',
};

// 조립부품 유형별 약어 매핑
export const assemblyPartAbbreviations = {
  '셔터박스': 'RC',
  '슬랫조립체': 'SL',
  '가이드조립체': 'GD',
  '개폐기조립체': 'OP',
  '제어반조립체': 'CT',
};

// 절곡부품 유형별 약어 매핑
export const bendingPartAbbreviations = {
  '커버박스': 'CB',
  '가이드레일': 'GR',
  '바텀바': 'BB',
  '행거브라켓': 'HB',
  '중간가이드': 'MG',
};

// ============================================================
// Lot No 부여법 - 품목코드 체계
// ============================================================

// 제품 코드 매핑 (Lot No Code 표 - 제품)
export const lotProductCodes = {
  '가이드레일(벽면형)': { code: 'R', description: '벽면 고정형 가이드레일' },
  '가이드레일(측면형)': { code: 'S', description: '측면 고정형 가이드레일' },
  '케이스': { code: 'C', description: '셔터 케이스' },
  '하단마감재(스크린)': { code: 'B', description: '스크린용 하단 마감재' },
  '하단마감재(철재)': { code: 'T', description: '철재 하단 마감재' },
  'L-Bar': { code: 'L', description: 'L자형 바' },
  '연기차단재': { code: 'G', description: '연기 차단용 자재' },
};

// 종류 코드 매핑 (Lot No Code 표 - 종류)
export const lotTypeCodes = {
  // 가이드레일(벽면형)
  '본체': { code: 'M', parentProduct: '가이드레일(벽면형)' },
  '본체(철재)': { code: 'T', parentProduct: '가이드레일(벽면형)' },
  'C형': { code: 'C', parentProduct: '가이드레일(벽면형)' },
  'D형': { code: 'D', parentProduct: '가이드레일(벽면형)' },
  'SUS마감재': { code: 'S', parentProduct: '가이드레일(벽면형)' },
  // 가이드레일(측면형)
  'SUS마감재①': { code: 'S', parentProduct: '가이드레일(측면형)' },
  'SUS마감재②': { code: 'U', parentProduct: '가이드레일(측면형)' },
  // 케이스
  '전면부': { code: 'F', parentProduct: '케이스' },
  '점검구': { code: 'P', parentProduct: '케이스' },
  '린텔부': { code: 'L', parentProduct: '케이스' },
  '후면코너부': { code: 'B', parentProduct: '케이스' },
  // 하단마감재
  'SUS': { code: 'S', parentProduct: '하단마감재' },
  'EGI': { code: 'E', parentProduct: '하단마감재' },
  // L-Bar
  '스크린용': { code: 'A', parentProduct: 'L-Bar' },
  // 연기차단재
  '화이바원단(W50)': { code: 'I', parentProduct: '연기차단재' },
  '화이바원단(W80)': { code: 'I', parentProduct: '연기차단재' },
};

// 날짜 코드 규칙
export const lotDateCodeRules = {
  // 년도: 끝자리 숫자 (XXX0년=0, XXX1년=1, ..., XXX9년=9)
  yearCodes: { 0: '0', 1: '1', 2: '2', 3: '3', 4: '4', 5: '5', 6: '6', 7: '7', 8: '8', 9: '9' },
  // 월: 1~9는 그대로, 10=A, 11=B, 12=C
  monthCodes: { 1: '1', 2: '2', 3: '3', 4: '4', 5: '5', 6: '6', 7: '7', 8: '8', 9: '9', 10: 'A', 11: 'B', 12: 'C' },
  // 일: 01~31 (2자리 숫자)
  dayFormat: '2digits',
};

// 모양&길이 코드 매핑
export const lotSizeCodes = {
  // 모양(W) × 길이 조합
  'W50×3000': '53',
  'W50×4000': '54',
  'W80×3000': '83',
  'W80×4000': '84',
  // 길이만 (앞 2자리)
  '1219': '12',
  '2438': '24',
  '3000': '30',
  '3500': '35',
  '4000': '40',
  '4150': '41',
  '4200': '42',
  '4300': '43',
};

// 품목코드 생성 함수 (RC24 형태)
export const generateBendingItemCode = (product, type, length) => {
  const productCode = lotProductCodes[product]?.code || '';
  const typeCode = lotTypeCodes[type]?.code || '';
  const lengthCode = lotSizeCodes[String(length)] || String(length).substring(0, 2);
  return `${productCode}${typeCode}${lengthCode}`;
};

// Lot No 생성 함수 (G-I-4A05-53 형태)
export const generateLotNo = (product, type, date, size) => {
  const productCode = lotProductCodes[product]?.code || '';
  const typeCode = lotTypeCodes[type]?.code || '';

  // 날짜 코드 생성
  const d = new Date(date);
  const yearCode = lotDateCodeRules.yearCodes[d.getFullYear() % 10];
  const monthCode = lotDateCodeRules.monthCodes[d.getMonth() + 1];
  const dayCode = String(d.getDate()).padStart(2, '0');
  const dateCode = `${yearCode}${monthCode}${dayCode}`;

  // 모양&길이 코드
  const sizeCode = lotSizeCodes[size] || size;

  return `${productCode}-${typeCode}-${dateCode}-${sizeCode}`;
};

// 날짜 코드 파싱 함수 (역변환)
export const parseLotDateCode = (dateCode) => {
  if (dateCode.length !== 4) return null;
  const yearCode = dateCode[0];
  const monthCode = dateCode[1];
  const dayCode = dateCode.substring(2);

  const currentYear = new Date().getFullYear();
  const baseYear = Math.floor(currentYear / 10) * 10;
  const year = baseYear + parseInt(yearCode);

  const monthMap = { '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9, 'A': 10, 'B': 11, 'C': 12 };
  const month = monthMap[monthCode] || 1;
  const day = parseInt(dayCode);

  return { year, month, day };
};

// 전체 Lot No 코드 규칙 목록 (공통코드관리 표시용)
export const getLotCodeRules = () => {
  return {
    productCodes: Object.entries(lotProductCodes).map(([name, data]) => ({
      name,
      code: data.code,
      description: data.description,
    })),
    typeCodes: Object.entries(lotTypeCodes).map(([name, data]) => ({
      name,
      code: data.code,
      parentProduct: data.parentProduct,
    })),
    sizeCodes: Object.entries(lotSizeCodes).map(([size, code]) => ({
      size,
      code,
    })),
    dateCodeRules: lotDateCodeRules,
  };
};

// 품목코드 자동생성 함수 (등록페이지에서 사용)
export const generateItemCode = (itemType, formData) => {
  switch (itemType) {
    case '부자재': {
      // 새 규칙: 품목명-규격
      // 예: 연동제어기-매립(유선)
      const itemName = formData.subMaterialItemName || formData.itemName || '';
      const spec = formData.subMaterialSpec || formData.spec || '';
      // 패턴: 품목명-규격
      return spec ? `${itemName}-${spec}` : itemName;
    }

    case '원자재': {
      // 새 규칙: 품목명-규격
      // 예: 철판-SUS-1.2T
      const itemName = formData.rawMaterialItemName || formData.itemName || '';
      const spec = formData.rawMaterialSpec || formData.spec || '';
      // 패턴: 품목명-규격
      return spec ? `${itemName}-${spec}` : itemName;
    }

    case '소모품': {
      // 새 규칙: 품목명-규격
      // 예: 용접봉-3.2MM, 장갑-면장갑
      const itemName = formData.consumableItemName || formData.itemName || '';
      const spec = formData.consumableSpec || formData.spec || '';
      // 패턴: 품목명-규격
      return spec ? `${itemName}-${spec}` : itemName;
    }

    case '부품': {
      const subType = formData.partSubType;

      if (subType === '구매 부품') {
        // 새 규칙: 품목명-규격 (규격 = 전원 + 용량)
        // 예: 전동개폐기-220V300KG
        const itemName = formData.purchasedPartItemName || formData.itemName || '';
        const power = formData.power || '';
        const capacity = formData.capacity || '';
        // 규격 = 전원 + 용량 (공백 없이 연결)
        const spec = `${power}${capacity}`.replace(/\s/g, '');
        // 패턴: 품목명-규격
        if (itemName && spec) {
          return `${itemName}-${spec}`;
        }
        // 부분 코드 반환
        return itemName || '';
      }

      if (subType === '조립 부품') {
        // 새 규칙: 품목명 설치유형-측면규격(가로)*측면규격(세로)*길이(앞2자리)
        // 예: 가이드레일 벽면형-1211*1111*24
        const itemName = formData.assemblyPartItemName || formData.itemName || '';
        const installType = formData.installType || ''; // 설치유형 (벽면형, 측면형 등)
        // App.jsx에서는 sideWidth, sideHeight를 사용
        const sideSpecWidth = formData.sideSpecWidth || formData.sideWidth || ''; // 측면규격 (가로)
        const sideSpecHeight = formData.sideSpecHeight || formData.sideHeight || ''; // 측면규격 (세로)
        const length = formData.length || ''; // 길이

        // 길이는 앞 2자리만 사용 (예: 2438 → 24)
        const lengthCode = length ? String(length).substring(0, 2) : '';

        // 패턴: 품목명 설치유형-측면규격(가로)*측면규격(세로)*길이(앞2자리)
        if (itemName && installType && sideSpecWidth && sideSpecHeight && lengthCode) {
          return `${itemName} ${installType}-${sideSpecWidth}*${sideSpecHeight}*${lengthCode}`;
        }

        // 필수 필드가 없으면 부분 코드 반환
        const parts = [];
        if (itemName) parts.push(itemName);
        if (installType) parts.push(installType);
        const specs = [sideSpecWidth, sideSpecHeight, lengthCode].filter(Boolean).join('*');
        if (parts.length > 0) {
          return specs ? `${parts.join(' ')}-${specs}` : parts.join(' ');
        }
        return '';
      }

      if (subType === '절곡 부품') {
        // 새 규칙: 품목코드 + 종류코드 + 모양&길이코드
        // 예: 가이드레일(벽면형)(R) + 본체(M) + 2438(24) = RM24
        const itemName = formData.bendingPartItemName || formData.itemName || ''; // 품목명 (가이드레일(벽면형) 등)
        const partType = formData.bendingPartType || ''; // 종류 (본체, C형 등)
        const sizeLength = formData.bendingSizeLength || formData.length || ''; // 모양&길이

        // 품목코드 (lotProductCodes에서 조회)
        const productCode = lotProductCodes[itemName]?.code || '';
        // 종류코드 (lotTypeCodes에서 조회)
        const typeCode = lotTypeCodes[partType]?.code || '';
        // 모양&길이코드 (lotSizeCodes에서 조회하거나 앞 2자리)
        const sizeCode = lotSizeCodes[String(sizeLength)] || (sizeLength ? String(sizeLength).substring(0, 2) : '');

        // 패턴: 품목코드 + 종류코드 + 모양&길이코드
        if (productCode && typeCode && sizeCode) {
          return `${productCode}${typeCode}${sizeCode}`;
        }

        // 부분 코드 반환
        return `${productCode}${typeCode}${sizeCode}`;
      }

      return '';
    }

    case '제품': {
      // 제품의 경우 품목명 = 품목코드 규칙 적용
      // 품목명을 그대로 품목코드로 사용
      const itemName = formData.itemName || formData.productName || '';
      return itemName;
    }

    default:
      return '';
  }
};

// 코드규칙 설명 텍스트 생성
export const getCodeRuleDescription = (rule) => {
  return `패턴: ${rule.pattern} | 예시: ${rule.example}`;
};

// 품목유형에 해당하는 코드규칙 찾기
export const findItemCodeRule = (itemType, subType = null) => {
  return itemCodeRules.find(rule => {
    if (rule.itemType !== itemType) return false;
    if (rule.subType && rule.subType !== subType) return false;
    return true;
  });
};

// 전체 코드규칙 목록 (공통코드관리용)
export const getAllCodeRules = () => {
  const itemRules = itemCodeRules.map(rule => ({
    ...rule,
    category: '품목코드',
    target: `품목코드 - ${rule.itemType}${rule.subType ? ` (${rule.subType})` : ''}`,
  }));

  const otherRules = otherCodeRules.map(rule => ({
    ...rule,
    category: '기타코드',
  }));

  return [...itemRules, ...otherRules];
};

export default {
  itemTypeCodeMapping,
  partSubTypeCodeMapping,
  subMaterialCodeMapping,
  rawMaterialCodeMapping,
  purchasedPartCodeMapping,
  itemCodeRules,
  otherCodeRules,
  productTypeAbbreviations,
  assemblyPartAbbreviations,
  bendingPartAbbreviations,
  generateItemCode,
  getCodeRuleDescription,
  findItemCodeRule,
  getAllCodeRules,
  // Lot No 부여법 관련
  lotProductCodes,
  lotTypeCodes,
  lotDateCodeRules,
  lotSizeCodes,
  generateBendingItemCode,
  generateLotNo,
  parseLotDateCode,
  getLotCodeRules,
};
