// 품질관리 개선 설정 - IQC/PQC/FQC 검사기준 연동
// 상용 MES 대비 개선사항 Phase 1

/**
 * ═══════════════════════════════════════════════════════════════════
 * 품질검사 유형 정의 (IQC/PQC/FQC)
 * ═══════════════════════════════════════════════════════════════════
 *
 * IQC (Incoming Quality Control) - 수입검사
 * - 시점: 자재 입고 시
 * - 대상: 원자재, 구매부품
 * - 검사항목: 외관, 치수, 재질, 수량
 *
 * PQC (Process Quality Control) - 공정검사/중간검사
 * - 시점: 생산 공정 중
 * - 대상: 반제품, 공정 완료품
 * - 검사항목: 공정별 품질기준
 *
 * FQC (Final Quality Control) - 제품검사/출하검사
 * - 시점: 출하 전
 * - 대상: 완제품
 * - 검사항목: 최종 품질, 기능, 외관
 *
 * ═══════════════════════════════════════════════════════════════════
 */

// 검사 유형 정의
export const inspectionTypes = {
  IQC: {
    code: 'IQC',
    name: '수입검사',
    fullName: 'Incoming Quality Control',
    description: '자재 입고 시 수행하는 품질검사',
    trigger: '입고',
    target: ['원자재', '구매부품', '부자재'],
    lotPrefix: 'IQC',
    color: 'blue',
    icon: 'Download',
  },
  PQC: {
    code: 'PQC',
    name: '공정검사',
    fullName: 'Process Quality Control',
    description: '생산 공정 중 수행하는 품질검사',
    trigger: '공정완료',
    target: ['반제품', '공정완료품'],
    lotPrefix: 'PQC',
    color: 'yellow',
    icon: 'ClipboardList',
  },
  FQC: {
    code: 'FQC',
    name: '제품검사',
    fullName: 'Final Quality Control',
    description: '출하 전 최종 품질검사',
    trigger: '생산완료',
    target: ['완제품'],
    lotPrefix: 'FQC',
    color: 'green',
    icon: 'Package',
  },
};

// 검사 상태 정의
export const inspectionStatuses = {
  WAITING: { code: 'WAITING', name: '검사대기', color: 'bg-gray-100 text-gray-700' },
  IN_PROGRESS: { code: 'IN_PROGRESS', name: '검사중', color: 'bg-blue-100 text-blue-700' },
  PASSED: { code: 'PASSED', name: '합격', color: 'bg-green-100 text-green-700' },
  FAILED: { code: 'FAILED', name: '불합격', color: 'bg-red-100 text-red-700' },
  CONDITIONAL: { code: 'CONDITIONAL', name: '조건부합격', color: 'bg-yellow-100 text-yellow-700' },
  REWORK: { code: 'REWORK', name: '재작업', color: 'bg-orange-100 text-orange-700' },
  SCRAP: { code: 'SCRAP', name: '폐기', color: 'bg-red-200 text-red-800' },
};

// IQC 검사기준 (원자재/구매부품별)
export const iqcStandards = {
  // 원자재 검사기준
  '원자재': {
    checkItems: [
      { id: 1, item: '외관검사', spec: '흠집, 녹, 이물질 없음', method: '육안검사', required: true },
      { id: 2, item: '치수검사', spec: '규격 ±3%', method: '버니어캘리퍼스', required: true },
      { id: 3, item: '재질확인', spec: '발주서 일치', method: '성적서 확인', required: true },
      { id: 4, item: '수량확인', spec: '발주수량 일치', method: '계수', required: true },
      { id: 5, item: 'LOT번호', spec: '성적서 LOT 일치', method: '서류확인', required: true },
    ],
    sampleRate: 10, // 전수검사 시 10%, AQL 적용 가능
    aqlLevel: 'Level II', // AQL 수준
  },
  // 구매부품 검사기준 (전동개폐기, 연동제어기 등)
  '구매부품': {
    checkItems: [
      { id: 1, item: '외관검사', spec: '파손, 스크래치 없음', method: '육안검사', required: true },
      { id: 2, item: '작동검사', spec: '정상 작동', method: '기능테스트', required: true },
      { id: 3, item: '규격확인', spec: '발주규격 일치', method: '측정/서류', required: true },
      { id: 4, item: '수량확인', spec: '발주수량 일치', method: '계수', required: true },
      { id: 5, item: '인증서류', spec: '인증서 구비', method: '서류확인', required: false },
    ],
    sampleRate: 100, // 전수검사
  },
  // 절곡코일/철판 검사기준
  '절곡자재': {
    checkItems: [
      { id: 1, item: '외관검사', spec: '표면 결함 없음', method: '육안검사', required: true },
      { id: 2, item: '두께검사', spec: '규격 ±0.1mm', method: '마이크로미터', required: true },
      { id: 3, item: '폭검사', spec: '규격 ±2mm', method: '줄자', required: true },
      { id: 4, item: '재질확인', spec: 'Mill Sheet 확인', method: '서류확인', required: true },
      { id: 5, item: '중량확인', spec: '발주중량 ±5%', method: '저울', required: true },
    ],
    sampleRate: 10,
  },
};

// PQC 공정별 검사기준
export const pqcStandards = {
  // 스크린 공정 검사
  'SCREEN': {
    checkItems: [
      { id: 1, item: '절단치수', spec: '도면치수 ±5mm', method: '줄자/스케일', required: true },
      { id: 2, item: '봉제상태', spec: '올풀림 없음', method: '육안검사', required: true },
      { id: 3, item: '앤드락부착', spec: '견고한 부착', method: '당김테스트', required: true },
      { id: 4, item: '원단상태', spec: '오염/손상 없음', method: '육안검사', required: true },
    ],
    inspectionPoint: '앤드락작업 완료 후',
  },
  // 슬랫 공정 검사
  'SLAT': {
    checkItems: [
      { id: 1, item: '절단길이', spec: '도면치수 ±2mm', method: '버니어캘리퍼스', required: true },
      { id: 2, item: '버상태', spec: '날카로운 버 없음', method: '육안/촉감', required: true },
      { id: 3, item: '미미작업', spec: '마감상태 양호', method: '육안검사', required: true },
      { id: 4, item: '수량확인', spec: '작업지시 수량', method: '계수', required: true },
    ],
    inspectionPoint: '미미작업 완료 후',
  },
  // 절곡 공정 검사
  'FOLD': {
    checkItems: [
      { id: 1, item: '절곡각도', spec: '도면각도 ±1°', method: '각도기', required: true },
      { id: 2, item: '절곡치수', spec: '전개도 치수 ±2mm', method: '버니어캘리퍼스', required: true },
      { id: 3, item: 'V컷팅깊이', spec: '설정깊이 ±0.5mm', method: '깊이게이지', required: true },
      { id: 4, item: '표면상태', spec: '찍힘/흠집 없음', method: '육안검사', required: true },
    ],
    inspectionPoint: '절곡 완료 후',
  },
  // 조립 공정 검사
  'ASSEMBLY': {
    checkItems: [
      { id: 1, item: '조립상태', spec: '이격/틈새 없음', method: '육안검사', required: true },
      { id: 2, item: '체결상태', spec: '볼트/리벳 견고', method: '토크확인', required: true },
      { id: 3, item: '작동검사', spec: '원활한 작동', method: '작동테스트', required: true },
      { id: 4, item: '부품누락', spec: 'BOM 전체 조립', method: '체크리스트', required: true },
    ],
    inspectionPoint: '조립 완료 후',
  },
};

// FQC 제품검사 기준
export const fqcStandards = {
  // 스크린 방화셔터
  '스크린': {
    checkItems: [
      { id: 1, item: '외관검사', spec: '표면 결함 없음', method: '육안검사', required: true },
      { id: 2, item: '치수검사', spec: '주문치수 ±10mm', method: '줄자', required: true },
      { id: 3, item: '작동검사', spec: '개폐 원활', method: '작동테스트', required: true },
      { id: 4, item: '내림속도', spec: '0.15m/s 이하', method: '스톱워치', required: true },
      { id: 5, item: '정지검사', spec: '위치 유지', method: '작동테스트', required: true },
      { id: 6, item: '라벨부착', spec: '인증라벨 부착', method: '육안검사', required: true },
      { id: 7, item: '포장상태', spec: '포장재 손상 없음', method: '육안검사', required: true },
    ],
    criticalItems: [3, 4, 5], // 필수 합격 항목
  },
  // 슬랫 방화셔터
  '슬랫': {
    checkItems: [
      { id: 1, item: '외관검사', spec: '표면 결함 없음', method: '육안검사', required: true },
      { id: 2, item: '치수검사', spec: '주문치수 ±10mm', method: '줄자', required: true },
      { id: 3, item: '슬랫연결', spec: '연결부 이상 없음', method: '육안검사', required: true },
      { id: 4, item: '작동검사', spec: '개폐 원활', method: '작동테스트', required: true },
      { id: 5, item: '소음검사', spec: '이상소음 없음', method: '청각확인', required: true },
      { id: 6, item: '라벨부착', spec: '인증라벨 부착', method: '육안검사', required: true },
    ],
    criticalItems: [3, 4],
  },
  // 절곡 제품
  '절곡': {
    checkItems: [
      { id: 1, item: '외관검사', spec: '표면 결함 없음', method: '육안검사', required: true },
      { id: 2, item: '치수검사', spec: '도면치수 ±3mm', method: '버니어캘리퍼스', required: true },
      { id: 3, item: '절곡각도', spec: '도면각도 ±1°', method: '각도기', required: true },
      { id: 4, item: '도장상태', spec: '도장 균일', method: '육안검사', required: false },
      { id: 5, item: '수량확인', spec: '주문수량 일치', method: '계수', required: true },
    ],
    criticalItems: [2, 3],
  },
};

// 불합격 처리 옵션
export const defectDispositionOptions = [
  { code: 'REWORK', name: '재작업', description: '수정 후 재검사', nextAction: '재검사' },
  { code: 'ACCEPT_AS_IS', name: '특채', description: '조건부 합격 처리', nextAction: '출하가능', requireApproval: true },
  { code: 'RETURN', name: '반품', description: '공급업체 반품', nextAction: '반품처리' },
  { code: 'SCRAP', name: '폐기', description: '불량품 폐기', nextAction: '폐기처리' },
  { code: 'DOWNGRADE', name: '등급하향', description: '하위등급 전용', nextAction: '등급변경' },
];

// 불량 유형 코드
export const defectTypes = {
  DIMENSION: { code: 'DIM', name: '치수불량', category: '가공불량' },
  APPEARANCE: { code: 'APP', name: '외관불량', category: '표면불량' },
  FUNCTION: { code: 'FUN', name: '기능불량', category: '기능불량' },
  MATERIAL: { code: 'MAT', name: '재질불량', category: '자재불량' },
  ASSEMBLY: { code: 'ASS', name: '조립불량', category: '조립불량' },
  PACKAGING: { code: 'PKG', name: '포장불량', category: '포장불량' },
  QUANTITY: { code: 'QTY', name: '수량부족', category: '수량불량' },
  OTHER: { code: 'OTH', name: '기타', category: '기타' },
};

// 검사 LOT 번호 생성
export const generateInspectionLot = (type, date, seq) => {
  const typePrefix = inspectionTypes[type]?.lotPrefix || 'QC';
  const dateStr = date.toISOString().slice(2, 10).replace(/-/g, '');
  const seqStr = String(seq).padStart(3, '0');
  return `${typePrefix}-${dateStr}-${seqStr}`;
};

// 검사 결과 판정 로직
export const determineInspectionResult = (checkResults, standards) => {
  const criticalItems = standards?.criticalItems || [];
  const requiredItems = checkResults.filter(r => r.required);

  // 필수항목 중 불합격이 있는 경우
  const failedRequired = requiredItems.filter(r => r.result === 'NG');
  if (failedRequired.length > 0) {
    // Critical 항목 불합격이면 불합격
    const failedCritical = failedRequired.filter(r => criticalItems.includes(r.id));
    if (failedCritical.length > 0) {
      return { result: 'FAILED', reason: '필수검사항목 불합격' };
    }
    // 비Critical 불합격은 조건부 합격 가능
    return { result: 'CONDITIONAL', reason: '일부 항목 불합격 (특채 필요)' };
  }

  return { result: 'PASSED', reason: '전체 항목 합격' };
};

// 검사 통계 계산
export const calculateInspectionStats = (inspections) => {
  const total = inspections.length;
  const passed = inspections.filter(i => i.result === 'PASSED' || i.result === '합격').length;
  const failed = inspections.filter(i => i.result === 'FAILED' || i.result === '불합격').length;
  const conditional = inspections.filter(i => i.result === 'CONDITIONAL' || i.result === '조건부합격').length;

  return {
    total,
    passed,
    failed,
    conditional,
    passRate: total > 0 ? ((passed / total) * 100).toFixed(1) : 0,
    defectRate: total > 0 ? ((failed / total) * 100).toFixed(1) : 0,
  };
};

export default {
  inspectionTypes,
  inspectionStatuses,
  iqcStandards,
  pqcStandards,
  fqcStandards,
  defectDispositionOptions,
  defectTypes,
  generateInspectionLot,
  determineInspectionResult,
  calculateInspectionStats,
};
