// ============================================================
// MES 통합 유틸리티 함수
// 채번관리, 견적수식→BOM 자동계산, 공정관리 연동
// ============================================================

import documentTemplateConfig from '../configs/documentTemplateConfig';
import {
  generateItemCode,
  generateLotNo,
  lotProductCodes,
  lotTypeCodes,
  lotSizeCodes,
} from '../configs/codeRuleConfig';

// ============================================================
// 1. 채번관리 - 문서번호 자동생성
// ============================================================

/**
 * 채번 시퀀스 관리 (localStorage 기반)
 * 실제 운영에서는 서버 DB로 대체 필요
 */
const getSequenceStorage = () => {
  const stored = localStorage.getItem('mes_numbering_sequences');
  return stored ? JSON.parse(stored) : {};
};

const setSequenceStorage = (data) => {
  localStorage.setItem('mes_numbering_sequences', JSON.stringify(data));
};

/**
 * 다음 시퀀스 번호 조회 및 증가
 * @param {string} docType - 문서유형 (QT, SO, WO 등)
 * @param {Date} date - 기준일자
 * @returns {number} 시퀀스 번호
 */
const getNextSequence = (docType, date = new Date()) => {
  const dateKey = `${date.getFullYear()}${String(date.getMonth() + 1).padStart(2, '0')}${String(date.getDate()).padStart(2, '0')}`;
  const storageKey = `${docType}_${dateKey}`;

  const sequences = getSequenceStorage();
  const currentSeq = (sequences[storageKey] || 0) + 1;
  sequences[storageKey] = currentSeq;
  setSequenceStorage(sequences);

  return currentSeq;
};

/**
 * 현재 시퀀스 조회 (증가 없이)
 * @param {string} docType - 문서유형
 * @param {Date} date - 기준일자
 * @returns {number} 현재 시퀀스 번호
 */
const getCurrentSequence = (docType, date = new Date()) => {
  const dateKey = `${date.getFullYear()}${String(date.getMonth() + 1).padStart(2, '0')}${String(date.getDate()).padStart(2, '0')}`;
  const storageKey = `${docType}_${dateKey}`;

  const sequences = getSequenceStorage();
  return sequences[storageKey] || 0;
};

/**
 * 문서번호 자동 생성
 * documentTemplateConfig.numberingRules.patterns 규칙 적용
 *
 * @param {string} docType - 문서유형 코드 (QT, SO, SL, WO, WO-SCR, IQC, PQC, FQC, NCR 등)
 * @param {Date} date - 기준일자 (기본: 오늘)
 * @param {object} options - 추가 옵션
 * @param {boolean} options.preview - true면 시퀀스 증가 없이 미리보기
 * @returns {string} 생성된 문서번호
 */
export const generateDocumentNumber = (docType, date = new Date(), options = {}) => {
  // 채번 규칙 조회
  const numberingRules = documentTemplateConfig?.numberingRules?.patterns || {};
  const rule = numberingRules[docType];

  if (!rule) {
    console.warn(`채번 규칙 없음: ${docType}, 기본 패턴 사용`);
    // 기본 패턴: {TYPE}-YYMMDD-##
    const yy = String(date.getFullYear()).slice(-2);
    const mm = String(date.getMonth() + 1).padStart(2, '0');
    const dd = String(date.getDate()).padStart(2, '0');
    const seq = options.preview ? getCurrentSequence(docType, date) + 1 : getNextSequence(docType, date);
    return `${docType}-${yy}${mm}${dd}-${String(seq).padStart(2, '0')}`;
  }

  // 날짜 코드 생성
  const yy = String(date.getFullYear()).slice(-2);
  const yyyy = String(date.getFullYear());
  const mm = String(date.getMonth() + 1).padStart(2, '0');
  const dd = String(date.getDate()).padStart(2, '0');

  // 시퀀스 번호
  const seq = options.preview ? getCurrentSequence(docType, date) + 1 : getNextSequence(docType, date);
  const seq2 = String(seq).padStart(2, '0');
  const seq3 = String(seq).padStart(3, '0');

  // 패턴 변환
  let result = rule.prefix || '';
  let format = rule.format || '';

  // 변수 치환
  format = format.replace('{TYPE}', docType);
  format = format.replace('YYYY', yyyy);
  format = format.replace('YY', yy);
  format = format.replace('MM', mm);
  format = format.replace('DD', dd);
  format = format.replace('###', seq3);
  format = format.replace('##', seq2);

  result += format;

  return result;
};

/**
 * 문서번호 미리보기 (시퀀스 증가 없이)
 */
export const previewDocumentNumber = (docType, date = new Date()) => {
  return generateDocumentNumber(docType, date, { preview: true });
};

/**
 * 채번 규칙 목록 조회
 */
export const getNumberingRules = () => {
  return documentTemplateConfig?.numberingRules || { patterns: {}, variables: {} };
};

// ============================================================
// 2. 견적수식 → BOM 자동계산
// ============================================================

/**
 * 모터 용량 조회 테이블 (샤프트인치 + 중량 → 모터용량)
 */
const motorCapacityTable = {
  '스크린': {
    '4': { maxWeight: 100, capacity: 150 },
    '5': { maxWeight: 200, capacity: 300 },
    '6': { maxWeight: 350, capacity: 400 },
    '8': { maxWeight: 500, capacity: 500 },
  },
  '철재': {
    '4': { maxWeight: 80, capacity: 150 },
    '5': { maxWeight: 150, capacity: 300 },
    '6': { maxWeight: 300, capacity: 400 },
    '8': { maxWeight: 450, capacity: 500 },
  }
};

/**
 * 브라켓 규격 조회 테이블
 */
const bracketTable = {
  150: '380×180',
  300: '380×180',
  400: '530×320',
  500: '600×350',
};

/**
 * 받침용앵글 규격 조회 테이블
 */
const angleTable = {
  150: '40×40×380',
  300: '40×40×380',
  400: '50×50×530',
  500: '50×50×600',
};

/**
 * 가이드레일 자재길이 조회 테이블
 */
const guideRailLengthTable = [
  { maxG: 2438, length: 2438 },
  { maxG: 3000, length: 3000 },
  { maxG: 3500, length: 3500 },
  { maxG: 4000, length: 4000 },
  { maxG: 4300, length: 4300 },
  { maxG: 999999, length: 4300 }, // 초과 시 최대값
];

/**
 * 케이스 자재길이 조회 테이블
 */
const caseLengthTable = [
  { maxS: 1219, length: 1219, qty: 1 },
  { maxS: 2438, length: 2438, qty: 1 },
  { maxS: 3657, length: 1219, qty: 3 },
  { maxS: 4000, length: 4000, qty: 1 },
  { maxS: 4150, length: 4150, qty: 1 },
  { maxS: 999999, length: 4150, qty: 2 },
];

/**
 * 샤프트 자재길이 조회 테이블
 */
const shaftLengthTable = [
  { maxW: 3000, length: 3000 },
  { maxW: 4500, length: 4500 },
  { maxW: 6000, length: 6000 },
  { maxW: 7000, length: 7000 },
  { maxW: 8000, length: 8000 },
  { maxW: 8200, length: 8200 },
  { maxW: 999999, length: 8200 },
];

/**
 * 오픈사이즈 → 제작사이즈 변환
 * @param {number} openWidth - 오픈사이즈 가로 (W0)
 * @param {number} openHeight - 오픈사이즈 세로 (H0)
 * @param {string} productType - 제품구분 (스크린/철재)
 * @returns {object} { productionWidth, productionHeight }
 */
export const calculateProductionSize = (openWidth, openHeight, productType = '스크린') => {
  if (productType === '철재') {
    return {
      productionWidth: openWidth + 110,  // W1 = W0 + 110
      productionHeight: openHeight + 350, // H1 = H0 + 350
    };
  }
  // 스크린 기본
  return {
    productionWidth: openWidth + 140,   // W1 = W0 + 140
    productionHeight: openHeight + 350,  // H1 = H0 + 350
  };
};

/**
 * 면적 및 중량 계산
 * @param {number} W1 - 제작가로 (mm)
 * @param {number} H1 - 제작세로 (mm)
 * @param {number} W0 - 오픈가로 (mm)
 * @param {string} productType - 제품구분
 * @returns {object} { area, weight }
 */
export const calculateAreaWeight = (W1, H1, W0, productType = '스크린') => {
  // 면적 M = W1 × H1 ÷ 1,000,000 (㎡)
  const area = (W1 * H1) / 1000000;

  // 중량 계산
  let weight;
  if (productType === '철재') {
    // 철재: K = M × 25
    weight = area * 25;
  } else {
    // 스크린: K = (M × 2) + (W0 × 14.17 ÷ 1000)
    weight = (area * 2) + (W0 * 14.17 / 1000);
  }

  return {
    area: Math.round(area * 100) / 100,
    weight: Math.round(weight * 10) / 10,
  };
};

/**
 * 모터 용량 조회
 * @param {string} shaftInch - 샤프트 인치 (4/5/6/8)
 * @param {number} weight - 산출중량 (K)
 * @param {string} productType - 제품구분
 * @returns {number} 모터용량 (KG)
 */
export const lookupMotorCapacity = (shaftInch, weight, productType = '스크린') => {
  const table = motorCapacityTable[productType] || motorCapacityTable['스크린'];

  // 샤프트 인치별로 최대 중량 체크
  for (const inch of ['4', '5', '6', '8']) {
    const spec = table[inch];
    if (spec && weight <= spec.maxWeight) {
      // 요청된 샤프트 인치가 충분한지 확인
      if (parseInt(shaftInch) >= parseInt(inch)) {
        return table[shaftInch]?.capacity || 300;
      }
    }
  }

  // 기본값: 요청된 샤프트 용량
  return table[shaftInch]?.capacity || 300;
};

/**
 * 견적 입력값 기반 BOM 자동 계산
 * @param {object} input - 견적 입력값
 * @param {number} input.openWidth - 오픈사이즈 가로 (W0)
 * @param {number} input.openHeight - 오픈사이즈 세로 (H0)
 * @param {string} input.productType - 제품구분 (스크린/철재)
 * @param {string} input.shaftInch - 샤프트 규격 (4/5/6/8)
 * @param {string} input.installType - 설치유형 (벽면형/측면형/혼합형)
 * @param {string} input.motorPower - 모터 전원 (220/380)
 * @param {string} input.wireType - 유선/무선
 * @param {string} input.controllerType - 연동제어기 타입 (매립/노출)
 * @param {number} input.qty - 수량 (SET)
 * @returns {object} BOM 계산 결과
 */
export const calculateBOM = (input) => {
  const {
    openWidth = 3000,
    openHeight = 3000,
    productType = '스크린',
    shaftInch = '5',
    installType = '벽면형',
    motorPower = '380',
    wireType = '유선',
    controllerType = '매립',
    qty = 1,
  } = input;

  // 1. 제작사이즈 산출
  const { productionWidth: W1, productionHeight: H1 } = calculateProductionSize(openWidth, openHeight, productType);

  // 2. 면적 & 중량 산출
  const { area: M, weight: K } = calculateAreaWeight(W1, H1, openWidth, productType);

  // 3. 모터용량 산출
  const motorCapacity = lookupMotorCapacity(shaftInch, K, productType);

  // 4. 브라켓/앵글 규격 조회
  const bracketSpec = bracketTable[motorCapacity] || bracketTable[300];
  const angleSpec = angleTable[motorCapacity] || angleTable[300];

  // 5. 가이드레일 제작길이 (G = H0 + 250)
  const G = openHeight + 250;
  const grLength = guideRailLengthTable.find(r => G <= r.maxG)?.length || 4300;

  // 6. 케이스 자재길이 (S = W1)
  const S = W1;
  const caseSpec = caseLengthTable.find(r => S <= r.maxS) || caseLengthTable[caseLengthTable.length - 1];

  // 7. 샤프트 자재길이
  const shaftLength = shaftLengthTable.find(r => W1 <= r.maxW)?.length || 8200;

  // 8. 연기차단재 수량 (스크린: 4개/SET, 철재: 2개/SET)
  const smokeBlockQty = productType === '철재' ? qty * 2 : qty * 4;

  // 9. 케이스 연기차단재 수량
  const caseSmokeQty = Math.ceil(S / 3000) * 2 * qty;

  // BOM 결과 생성
  const bom = {
    // 계산된 변수들
    variables: {
      W0: openWidth,
      H0: openHeight,
      W1,
      H1,
      M,
      K,
      G,
      S,
      motorCapacity,
      shaftInch,
      productType,
      installType,
    },

    // BOM 품목 목록
    items: [
      // 구매부품
      {
        category: '구매부품',
        itemCode: `전동개폐기-${motorPower}V${motorCapacity}KG`,
        itemName: '전동개폐기',
        spec: `${motorCapacity}KG ${motorPower}V`,
        unit: 'EA',
        qty: qty,
        unitPrice: motorCapacity >= 400 ? 450000 : (motorCapacity >= 300 ? 350000 : 280000),
      },
      {
        category: '구매부품',
        itemCode: `연동제어기-${controllerType}(${wireType})`,
        itemName: '연동제어기',
        spec: `${controllerType}(${wireType})`,
        unit: 'EA',
        qty: qty,
        unitPrice: wireType === '무선' ? 85000 : 65000,
      },
      {
        category: '구매부품',
        itemCode: `브라켓-${bracketSpec}`,
        itemName: '브라켓',
        spec: bracketSpec,
        unit: 'SET',
        qty: qty,
        unitPrice: motorCapacity >= 400 ? 35000 : 25000,
      },
      {
        category: '구매부품',
        itemCode: `받침용앵글-${angleSpec}`,
        itemName: '받침용앵글',
        spec: angleSpec,
        unit: 'SET',
        qty: qty,
        unitPrice: motorCapacity >= 400 ? 28000 : 18000,
      },
      {
        category: '구매부품',
        itemCode: `감기샤프트-${shaftInch}인치-${shaftLength}`,
        itemName: '감기샤프트(메인)',
        spec: `${shaftInch}인치 L${shaftLength}`,
        unit: 'EA',
        qty: qty,
        unitPrice: shaftLength >= 6000 ? 180000 : 120000,
      },

      // 절곡부품
      {
        category: '절곡부품',
        itemCode: generateBendingItemCode('가이드레일(벽면형)', '본체', grLength),
        itemName: '가이드레일(본체)',
        spec: `L${grLength}`,
        unit: 'EA',
        qty: qty * 2,
        unitPrice: 45000,
      },
      {
        category: '절곡부품',
        itemCode: `하부BASE-${installType === '벽면형' ? '130×80' : '130×130'}`,
        itemName: '하부BASE1',
        spec: installType === '벽면형' ? '130×80' : '130×130',
        unit: 'SET',
        qty: qty * 2,
        unitPrice: 15000,
      },
      {
        category: '절곡부품',
        itemCode: generateBendingItemCode('케이스', '전면부', caseSpec.length),
        itemName: '케이스판재',
        spec: `L${caseSpec.length}`,
        unit: 'EA',
        qty: caseSpec.qty * qty,
        unitPrice: 85000,
      },

      // 부자재
      {
        category: '부자재',
        itemCode: '연기차단재-W80',
        itemName: '연기차단재',
        spec: `W80 L${grLength}`,
        unit: 'EA',
        qty: smokeBlockQty,
        unitPrice: 12000,
      },
      {
        category: '부자재',
        itemCode: '연기차단재-케이스용',
        itemName: '케이스용연기차단재',
        spec: 'W80 L3000',
        unit: 'EA',
        qty: caseSmokeQty,
        unitPrice: 10000,
      },
      {
        category: '부자재',
        itemCode: '마구리-표준',
        itemName: '마구리',
        spec: '1SET=2EA',
        unit: 'SET',
        qty: qty,
        unitPrice: 25000,
      },
      {
        category: '부자재',
        itemCode: '상부덮개-EGI1.5T',
        itemName: '상부덮개',
        spec: `L${caseSpec.length}`,
        unit: 'EA',
        qty: caseSpec.qty * qty,
        unitPrice: 35000,
      },
    ],

    // 총 금액 계산
    summary: {
      totalItemCount: 0,
      totalAmount: 0,
    },
  };

  // 총계 계산
  bom.summary.totalItemCount = bom.items.length;
  bom.summary.totalAmount = bom.items.reduce((sum, item) => sum + (item.qty * (item.unitPrice || 0)), 0);

  return bom;
};

/**
 * 절곡부품 품목코드 생성 (lotProductCodes 연동)
 */
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}`;
};

// ============================================================
// 3. 공정관리 연동 - 작업지시 자동생성
// ============================================================

/**
 * 공정별 작업단계 정의
 */
export const processSteps = {
  '스크린': ['원단절단', '미싱', '앤드락작업', '중간검사', '포장'],
  '슬랫': ['코일절단', '중간검사', '미미작업', '포장'],
  '절곡': ['절단', '절곡', '중간검사', '포장'],
  '재고생산': ['포밍', '절단', '검사', '적재'],
  '전기': ['배선', '검사', '포장'],
};

/**
 * 공정별 기본 담당자
 */
export const processAssignees = {
  '스크린': { team: '스크린팀', members: ['김스크린', '이스크린', '박스크린'] },
  '슬랫': { team: '슬랫팀', members: ['김슬랫', '이슬랫', '박슬랫'] },
  '절곡': { team: '절곡팀', members: ['김절곡', '이절곡'] },
  '재고생산': { team: '포밍팀', members: ['김생산'] },
  '전기': { team: '전기팀', members: ['김전기', '이전기'] },
};

/**
 * 작업단계별 상태 초기화
 */
export const initializeStepStatus = (processType) => {
  const steps = processSteps[processType] || [];
  const stepStatus = {};
  steps.forEach(step => {
    stepStatus[step] = { status: '대기', startTime: null, endTime: null };
  });
  return stepStatus;
};

/**
 * 수주 데이터로부터 작업지시 자동 생성
 * @param {object} order - 수주 데이터
 * @param {object} options - 옵션
 * @param {string} options.processType - 공정유형 (스크린/슬랫/절곡)
 * @param {Date} options.workDate - 작업일자
 * @returns {object} 생성된 작업지시 데이터
 */
export const createWorkOrderFromOrder = (order, options = {}) => {
  const {
    processType = '스크린',
    workDate = new Date(),
    splitNo = null,
  } = options;

  // 공정별 작업지시 채번 유형 결정
  const woDocType = processType === '스크린' ? 'WO-SCR'
                  : processType === '슬랫' ? 'WO-SLT'
                  : processType === '절곡' ? 'WO-FLD'
                  : 'WO';

  // 작업지시번호 채번
  const workOrderNo = generateDocumentNumber(woDocType, workDate);

  // LOT번호 생성
  const lotNo = `${order.orderNo}-${String(splitNo || 1).padStart(2, '0')}`;

  // 작업단계 상태 초기화
  const stepStatus = initializeStepStatus(processType);

  // 기본 담당자 배정
  const assigneeInfo = processAssignees[processType] || processAssignees['스크린'];

  return {
    id: Date.now(),
    workOrderNo,
    workOrderDate: workDate.toISOString().split('T')[0],
    status: '대기',
    processType,

    // 수주 연결
    orderId: order.id,
    orderNo: order.orderNo,
    splitNo,

    // 고객/현장 정보
    customerName: order.customerName,
    siteName: order.siteName,
    siteCode: order.siteCode,

    // 제품 정보
    productName: order.productName || order.items?.[0]?.productName,
    productSpec: order.productSpec || `${order.items?.[0]?.width}×${order.items?.[0]?.height}`,

    // 수량 정보
    totalQty: order.totalQty || order.items?.reduce((sum, item) => sum + item.qty, 0) || 0,
    completedQty: 0,
    defectQty: 0,

    // LOT 정보
    lotNo,

    // 납기/일정
    dueDate: order.dueDate,
    shipRequestDate: order.shipRequestDate,

    // 작업단계 상태
    stepStatus,
    currentStep: processSteps[processType]?.[0] || '대기',

    // 담당자
    assignee: assigneeInfo.team,
    assignees: assigneeInfo.members,

    // 비고
    remarks: order.remarks || '',

    // 메타데이터
    createdAt: new Date().toISOString(),
    createdBy: '시스템',
  };
};

/**
 * 수주 품목 분석하여 필요 공정 목록 추출
 * @param {object} order - 수주 데이터
 * @returns {string[]} 필요 공정 목록
 */
export const analyzeRequiredProcesses = (order) => {
  const processes = new Set();

  // 품목명/카테고리 기반 공정 판단
  const items = order.items || [];
  items.forEach(item => {
    const name = (item.productName || item.itemName || '').toLowerCase();
    const category = (item.category || '').toLowerCase();

    if (name.includes('스크린') || category.includes('스크린')) {
      processes.add('스크린');
    }
    if (name.includes('슬랫') || name.includes('철재') || category.includes('슬랫')) {
      processes.add('슬랫');
    }
    if (name.includes('절곡') || name.includes('가이드레일') || name.includes('케이스')) {
      processes.add('절곡');
    }
  });

  // 기본: 스크린 공정
  if (processes.size === 0) {
    processes.add('스크린');
  }

  return Array.from(processes);
};

/**
 * 수주에서 전체 작업지시 자동 생성 (다중 공정)
 * @param {object} order - 수주 데이터
 * @param {object} options - 옵션
 * @returns {object[]} 생성된 작업지시 목록
 */
export const createAllWorkOrdersFromOrder = (order, options = {}) => {
  const processes = analyzeRequiredProcesses(order);
  const workOrders = [];

  processes.forEach(processType => {
    const wo = createWorkOrderFromOrder(order, {
      ...options,
      processType,
    });
    workOrders.push(wo);
  });

  return workOrders;
};

// ============================================================
// 4. 품질검사 자동생성
// ============================================================

/**
 * 작업지시로부터 검사 데이터 자동 생성
 * @param {object} workOrder - 작업지시 데이터
 * @param {string} inspectionType - 검사유형 (IQC/PQC/FQC)
 * @returns {object} 생성된 검사 데이터
 */
export const createInspectionFromWorkOrder = (workOrder, inspectionType = 'PQC') => {
  const inspectionNo = generateDocumentNumber(inspectionType, new Date());

  return {
    id: Date.now(),
    inspectionNo,
    inspectionType,
    inspectionDate: new Date().toISOString().split('T')[0],
    status: '검사대기',

    // 작업지시 연결
    workOrderId: workOrder.id,
    workOrderNo: workOrder.workOrderNo,

    // 수주 연결
    orderId: workOrder.orderId,
    orderNo: workOrder.orderNo,

    // 제품 정보
    productName: workOrder.productName,
    productSpec: workOrder.productSpec,
    lotNo: workOrder.lotNo,

    // 수량 정보
    inspectionQty: workOrder.totalQty,
    passQty: 0,
    failQty: 0,

    // 검사 결과
    result: '미검사',
    inspectorName: '',

    // 검사 항목 (공정별 기본 항목)
    checkItems: getDefaultCheckItems(workOrder.processType, inspectionType),

    // 메타데이터
    createdAt: new Date().toISOString(),
  };
};

/**
 * 공정/검사유형별 기본 검사항목
 */
const getDefaultCheckItems = (processType, inspectionType) => {
  const baseItems = [
    { name: '외관검사', spec: '흠집, 변형, 이물질 없음', result: '', status: '미검사' },
    { name: '치수검사', spec: '도면 규격 ±3mm', result: '', status: '미검사' },
  ];

  if (processType === '스크린') {
    baseItems.push(
      { name: '원단상태', spec: '찢김, 얼룩 없음', result: '', status: '미검사' },
      { name: '미싱상태', spec: '박음질 견고', result: '', status: '미검사' }
    );
  } else if (processType === '슬랫') {
    baseItems.push(
      { name: '슬랫연결', spec: '연결부 이상 없음', result: '', status: '미검사' },
      { name: '도장상태', spec: '도장 균일', result: '', status: '미검사' }
    );
  } else if (processType === '절곡') {
    baseItems.push(
      { name: '절곡각도', spec: '규격 ±1°', result: '', status: '미검사' },
      { name: '용접상태', spec: '용접 견고', result: '', status: '미검사' }
    );
  }

  if (inspectionType === 'FQC') {
    baseItems.push(
      { name: '동작검사', spec: '개폐 정상', result: '', status: '미검사' },
      { name: '포장상태', spec: '포장 완료', result: '', status: '미검사' }
    );
  }

  return baseItems;
};

// ============================================================
// 5. 출하 자동생성
// ============================================================

/**
 * 검사완료 작업지시로부터 출하 데이터 자동 생성
 * @param {object} workOrder - 작업지시 데이터
 * @param {object} inspection - 검사 데이터
 * @returns {object} 생성된 출하 데이터
 */
export const createShipmentFromInspection = (workOrder, inspection) => {
  const shipmentNo = generateDocumentNumber('SL', new Date());

  return {
    id: Date.now(),
    shipmentNo,
    shipmentDate: new Date().toISOString().split('T')[0],
    status: '출고대기',

    // 연결 정보
    workOrderId: workOrder.id,
    workOrderNo: workOrder.workOrderNo,
    inspectionId: inspection.id,
    inspectionNo: inspection.inspectionNo,
    orderId: workOrder.orderId,
    orderNo: workOrder.orderNo,

    // 고객/현장 정보
    customerName: workOrder.customerName,
    siteName: workOrder.siteName,

    // 제품 정보
    productName: workOrder.productName,
    productSpec: workOrder.productSpec,
    lotNo: workOrder.lotNo,

    // 수량
    shipmentQty: inspection.passQty || workOrder.completedQty || workOrder.totalQty,

    // 배송 정보
    deliveryType: '직배송',
    vehicleNo: '',
    driverName: '',

    // 메타데이터
    createdAt: new Date().toISOString(),
  };
};

// ============================================================
// 6. 통합 워크플로우
// ============================================================

/**
 * 견적 → 수주 → 작업지시 → 검사 → 출하 전체 흐름 시뮬레이션
 * 테스트 데이터 생성용
 *
 * @param {object} quoteInput - 견적 입력 데이터
 * @param {object} customerInfo - 고객/현장 정보
 * @returns {object} 전체 워크플로우 데이터
 */
export const simulateFullWorkflow = (quoteInput, customerInfo) => {
  const today = new Date();

  // 1. BOM 계산
  const bom = calculateBOM(quoteInput);

  // 2. 견적 데이터 생성
  const quoteNo = generateDocumentNumber('QT', today);
  const quote = {
    id: Date.now(),
    quoteNo,
    quoteDate: today.toISOString().split('T')[0],
    customerName: customerInfo.customerName,
    siteName: customerInfo.siteName,
    siteCode: customerInfo.siteCode,
    items: bom.items,
    totalAmount: bom.summary.totalAmount,
    status: '최초작성',
    variables: bom.variables,
  };

  // 3. 수주 데이터 생성
  const orderNo = generateDocumentNumber('SO', today);
  const order = {
    id: Date.now() + 1,
    orderNo,
    orderDate: today.toISOString().split('T')[0],
    quoteId: quote.id,
    quoteNo: quote.quoteNo,
    customerName: customerInfo.customerName,
    siteName: customerInfo.siteName,
    siteCode: customerInfo.siteCode,
    items: [{
      productName: `${quoteInput.productType} 셔터`,
      width: quoteInput.openWidth,
      height: quoteInput.openHeight,
      qty: quoteInput.qty,
    }],
    totalQty: quoteInput.qty,
    dueDate: new Date(today.getTime() + 14 * 24 * 60 * 60 * 1000).toISOString().split('T')[0],
    status: '수주확정',
  };

  // 4. 작업지시 생성
  const workOrders = createAllWorkOrdersFromOrder(order, { workDate: today });

  // 5. 검사 데이터 생성 (첫 번째 작업지시 기준)
  const inspection = workOrders.length > 0
    ? createInspectionFromWorkOrder(workOrders[0], 'PQC')
    : null;

  // 6. 출하 데이터 생성
  const shipment = workOrders.length > 0 && inspection
    ? createShipmentFromInspection(workOrders[0], inspection)
    : null;

  return {
    quote,
    order,
    workOrders,
    inspection,
    shipment,
    bom,
  };
};

// ============================================================
// 7. 내보내기
// ============================================================

export default {
  // 채번관리
  generateDocumentNumber,
  previewDocumentNumber,
  getNumberingRules,
  getNextSequence,
  getCurrentSequence,

  // BOM 계산
  calculateProductionSize,
  calculateAreaWeight,
  lookupMotorCapacity,
  calculateBOM,

  // 공정관리
  processSteps,
  processAssignees,
  initializeStepStatus,
  createWorkOrderFromOrder,
  analyzeRequiredProcesses,
  createAllWorkOrdersFromOrder,

  // 품질검사
  createInspectionFromWorkOrder,

  // 출하
  createShipmentFromInspection,

  // 통합 워크플로우
  simulateFullWorkflow,

  // 품목코드 (재내보내기)
  generateItemCode,
  generateLotNo,
};
