// 제품검사 관리 타입 정의

// ===== 기본 열거 타입 =====

// 검사 상태
export type InspectionStatus = '접수' | '진행중' | '완료';

// 판정 결과
export type JudgmentResult = '합격' | '불합격';

// ===== 관련자 정보 =====

// 건축공사장 정보
export interface ConstructionSiteInfo {
  siteName: string;     // 현장명
  landLocation: string; // 대지위치
  lotNumber: string;    // 지번
}

// 자재유통업자 정보
export interface MaterialDistributorInfo {
  companyName: string;        // 회사명
  companyAddress: string;     // 회사주소
  representativeName: string; // 대표자명
  phone: string;              // 전화번호
}

// 공사시공자 정보
export interface ConstructorInfo {
  companyName: string;    // 회사명
  companyAddress: string; // 회사주소
  name: string;           // 성명
  phone: string;          // 전화번호
}

// 공사감리자 정보
export interface SupervisorInfo {
  officeName: string;    // 사무소명
  officeAddress: string; // 사무소주소
  name: string;          // 성명
  phone: string;         // 전화번호
}

// ===== 검사 일정/현장 정보 =====

export interface InspectionScheduleInfo {
  visitRequestDate: string;  // 검사방문요청일
  startDate: string;         // 검사시작일
  endDate: string;           // 검사종료일
  inspector: string;         // 검사자
  sitePostalCode: string;    // 우편번호
  siteAddress: string;       // 현장 주소
  siteAddressDetail: string; // 상세 주소
}

// ===== 수주 관련 =====

// 수주 설정 항목 (상세 페이지 아코디언 내부 테이블)
export interface OrderSettingItem {
  id: string;
  orderId?: number;             // 수주 DB ID (FQC 문서 연동용)
  orderNumber: string;        // 수주번호
  siteName: string;           // 현장명
  clientId?: number | null;   // 발주처 ID
  clientName?: string;        // 발주처명
  itemId?: number | null;     // 품목(모델) ID
  itemName?: string;          // 품목(모델)명
  deliveryDate: string;       // 납품일
  floor: string;              // 층수
  symbol: string;             // 부호
  orderWidth: number;         // 수주 규격 - 가로
  orderHeight: number;        // 수주 규격 - 세로
  constructionWidth: number;  // 시공 규격 - 가로
  constructionHeight: number; // 시공 규격 - 세로
  changeReason: string;       // 변경사유
  // FQC 성적서 EAV 문서 ID (quality_document_locations.document_id)
  documentId?: number | null;
  // 검사 결과 데이터
  inspectionData?: ProductInspectionData;
}

// 수주 그룹 (아코디언 상위 레벨)
export interface OrderGroup {
  orderNumber: string;        // 수주번호
  siteName: string;           // 현장명
  deliveryDate: string;       // 납품일
  locationCount: number;      // 개소
  items: OrderSettingItem[];  // 하위 항목들
}

// 제품검사 입력 데이터
export interface ProductInspectionData {
  productName: string;
  specification: string;
  // 제품 사진
  productImages: string[];
  // 겉모양 검사
  appearanceProcessing: 'pass' | 'fail' | null;    // 가공상태
  appearanceSewing: 'pass' | 'fail' | null;        // 재봉상태
  appearanceAssembly: 'pass' | 'fail' | null;      // 조립상태
  appearanceSmokeBarrier: 'pass' | 'fail' | null;  // 연기차단재
  appearanceBottomFinish: 'pass' | 'fail' | null;  // 하단마감재
  motor: 'pass' | 'fail' | null;                   // 모터
  // 재질/치수 검사
  material: 'pass' | 'fail' | null;                // 재질
  lengthValue: number | null;                      // 길이 측정값
  lengthJudgment: 'pass' | 'fail' | null;          // 길이 판정
  heightValue: number | null;                      // 높이 측정값
  heightJudgment: 'pass' | 'fail' | null;          // 높이 판정
  guideRailGapValue: number | null;                // 가이드레일 홈간격 측정값
  guideRailGap: 'pass' | 'fail' | null;            // 가이드레일 홈간격 판정
  bottomFinishGapValue: number | null;             // 하단마감재 간격 측정값
  bottomFinishGap: 'pass' | 'fail' | null;         // 하단마감재 간격 판정
  // 시험 검사
  fireResistanceTest: 'pass' | 'fail' | null;      // 내화시험
  smokeLeakageTest: 'pass' | 'fail' | null;        // 차연시험
  openCloseTest: 'pass' | 'fail' | null;           // 개폐시험
  impactTest: 'pass' | 'fail' | null;              // 내충격시험
  // 특이사항
  hasSpecialNotes: boolean;
  specialNotes: string;
}

// 수주 선택 모달 항목
export interface OrderSelectItem {
  id: string;
  orderNumber: string;   // 수주번호
  siteName: string;      // 현장명
  clientId: number | null; // 발주처 ID
  clientName: string;    // 발주처
  itemId: number | null; // 품목(모델) ID
  itemName: string;      // 품목(모델)명
  deliveryDate: string;  // 납품일
  locationCount: number; // 개소
  locations: OrderSelectLocation[]; // 개소 상세
}

// 수주의 개소(root node) 정보
export interface OrderSelectLocation {
  nodeId: number;
  floor: string;
  symbol: string;
  orderWidth: number;
  orderHeight: number;
}

// ===== 메인 데이터 =====

// 제품검사 데이터 (리스트 + 상세 공용)
export interface ProductInspection {
  id: string;
  qualityDocNumber: string; // 품질관리서 번호
  siteName: string;         // 현장명
  client: string;           // 수주처
  clientId?: number;        // 수주처 ID
  locationCount: number;    // 개소
  requiredInfo: string;     // 필수정보 (완료 / N건 누락)
  inspectionPeriod: string; // 검사기간 (2026-01-01 또는 2026-01-01~2026-01-02)
  inspector: string;        // 검사자
  status: InspectionStatus; // 상태
  author: string;           // 작성자
  receptionDate: string;    // 접수일
  manager: string;          // 담당자
  managerContact: string;   // 담당자 연락처

  // 관련자 정보
  constructionSite: ConstructionSiteInfo;
  materialDistributor: MaterialDistributorInfo;
  constructorInfo: ConstructorInfo;
  supervisor: SupervisorInfo;

  // 검사 일정/현장
  scheduleInfo: InspectionScheduleInfo;

  // 수주 설정
  orderItems: OrderSettingItem[];

  // EAV 요청서 문서 ID (자동생성)
  requestDocumentId?: number | null;
}

// ===== 통계 =====

export interface InspectionStats {
  receptionCount: number;  // 접수
  inProgressCount: number; // 진행중
  completedCount: number;  // 완료
}

// ===== 캘린더 스케줄 =====

export interface InspectionCalendarItem {
  id: string;
  startDate: string;        // 시작일
  endDate: string;          // 종료일
  inspector: string;        // 검사자
  siteName: string;         // 현장명
  status: InspectionStatus; // 상태
}

// ===== 폼 데이터 =====

// 등록 폼
export interface InspectionFormData {
  qualityDocNumber: string;
  siteName: string;
  client: string;
  clientId?: number;       // 수주처 ID (API용)
  inspectorId?: number;    // 검사자 ID (API용)
  receptionDate?: string;  // 접수일 (API용)
  manager: string;
  managerContact: string;
  constructionSite: ConstructionSiteInfo;
  materialDistributor: MaterialDistributorInfo;
  constructorInfo: ConstructorInfo;
  supervisor: SupervisorInfo;
  scheduleInfo: InspectionScheduleInfo;
  orderItems: OrderSettingItem[];
}

// 수정 폼
export interface InspectionEditFormData extends InspectionFormData {
  editReason: string;
}

// ===== 필터 =====

export interface InspectionFilter {
  search: string;
  status: InspectionStatus | '전체';
  dateRange: {
    start: string;
    end: string;
  };
}

// ===== 문서 관련 =====

// 결재라인
export interface ApprovalLineItem {
  role: string;       // 작성, 승인
  name: string;       // 이름
  department: string; // 부서명
}

// 제품검사요청서
export interface InspectionRequestDocument {
  documentNumber: string;
  createdDate: string;
  approvalLine: ApprovalLineItem[];
  // 기본정보
  client: string;
  companyName: string;
  manager: string;
  orderNumber: string;
  managerContact: string;
  siteName: string;
  deliveryDate: string;
  siteAddress: string;
  totalLocations: string;
  receptionDate: string;
  visitRequestDate: string;
  // 입력사항
  constructionSite: ConstructionSiteInfo;
  materialDistributor: MaterialDistributorInfo;
  constructorInfo: ConstructorInfo;
  supervisor: SupervisorInfo;
  // 검사대상 사전 고지 정보
  priorNoticeItems: OrderSettingItem[];
}

// 제품검사성적서 검사항목
export interface ReportInspectionItem {
  no: number;
  category: string;        // 검사항목 대분류 (겉모양, 모터, 재질 등)
  subCategory?: string;    // 세부항목 (가공상태, 재봉상태 등)
  criteria: string;        // 검사기준
  method: string;          // 검사방법
  frequency: string;       // 검사주기
  measuredValue?: string;  // 측정값
  judgment?: '적합' | '부적합'; // 판정
  subCategorySpan?: number;      // 세부항목 셀 rowSpan (예: 비차열/차열성 3행 병합)
  measuredValueSpan?: number;    // 측정값 셀 rowSpan (크로스그룹 병합)
  methodSpan?: number;           // 검사방법 셀 rowSpan (크로스그룹 병합)
  freqSpan?: number;       // 검사주기 셀 rowSpan (크로스그룹 병합)
  judgmentSpan?: number;   // 판정 셀 rowSpan (크로스그룹 병합, 예: 항목6+7+8+9)
  hideJudgment?: boolean;  // 판정 표시 안함 (빈 셀 렌더)
  editable?: boolean;      // 측정값 입력 가능 여부
}

// 제품검사성적서
export interface InspectionReportDocument {
  documentNumber: string;
  createdDate: string;
  approvalLine: ApprovalLineItem[];
  productName: string;    // 제품명
  productLotNo: string;   // 제품 LOT NO
  productCode: string;    // 제품코드
  lotSize: string;        // 로트크기
  client: string;         // 수주처
  inspectionDate: string; // 검사일자
  siteName: string;       // 현장명
  inspector: string;      // 검사자
  productImages?: string[];  // 제품 사진 URLs (2개)
  inspectionItems: ReportInspectionItem[];
  specialNotes: string;   // 특이사항
  finalJudgment: JudgmentResult; // 최종 판정
}

// ===== 테이블 =====

export interface InspectionTableColumn {
  key: string;
  label: string;
  width?: string;
  align?: 'left' | 'center' | 'right';
}
