/**
 * 출고관리 타입 정의
 */

// 출고 상태
export type ShipmentStatus =
  | 'scheduled'         // 출고예정
  | 'ready'             // 출고대기
  | 'shipping'          // 배송중
  | 'completed'         // 배송완료 (출고완료)
  | 'cancelled';        // 취소

// 상태 라벨
export const SHIPMENT_STATUS_LABELS: Record<ShipmentStatus, string> = {
  scheduled: '출고예정',
  ready: '출고대기',
  shipping: '배송중',
  completed: '출고완료',
  cancelled: '취소',
};

// 상태 스타일
export const SHIPMENT_STATUS_STYLES: Record<ShipmentStatus, string> = {
  scheduled: 'bg-gray-100 text-gray-800',
  ready: 'bg-yellow-100 text-yellow-800',
  shipping: 'bg-blue-100 text-blue-800',
  completed: 'bg-green-100 text-green-800',
  cancelled: 'bg-red-100 text-red-800',
};

// 출고 우선순위
export type ShipmentPriority = 'urgent' | 'normal' | 'low';

export const PRIORITY_LABELS: Record<ShipmentPriority, string> = {
  urgent: '긴급',
  normal: '보통',
  low: '낮음',
};

export const PRIORITY_STYLES: Record<ShipmentPriority, string> = {
  urgent: 'bg-red-100 text-red-800',
  normal: 'bg-gray-100 text-gray-800',
  low: 'bg-blue-100 text-blue-800',
};

// 운임비용 타입
export type FreightCostType = 'prepaid' | 'collect' | 'free' | 'negotiable' | 'none';

export const FREIGHT_COST_LABELS: Record<FreightCostType, string> = {
  prepaid: '선불',
  collect: '착불',
  none: '없음',
  free: '무료',
  negotiable: '협의',
};

// 배차 정보 (다중 행)
export interface VehicleDispatch {
  id: string;
  logisticsCompany: string;    // 물류업체 (Select)
  arrivalDateTime: string;     // 입차일시
  tonnage: string;             // 톤수
  vehicleNo: string;           // 차량번호
  driverContact: string;       // 기사연락처
  remarks: string;             // 비고
}

// 제품 그룹 (아코디언용)
export interface ProductGroup {
  id: string;
  productName: string;         // 제품명
  specification: string;       // 규격 (예: 2000 x 2500 mm)
  partCount: number;           // 부품 수
  parts: ProductPart[];        // 부품 목록
}

// 제품 부품
export interface ProductPart {
  id: string;
  seq: number;                 // 순번
  itemName: string;            // 품목명
  specification: string;       // 규격
  quantity: number;            // 수량
  unit: string;                // 단위
}

// 배송방식 (확장)
export type DeliveryMethod =
  | 'pickup'              // 상차 (레거시)
  | 'direct'              // 직접배차 (레거시)
  | 'logistics'           // 물류사 (레거시)
  | 'direct_dispatch'     // 직접배차
  | 'loading'             // 상차
  | 'kyungdong_delivery'  // 경동택배
  | 'daesin_delivery'     // 대신택배
  | 'kyungdong_freight'   // 경동화물
  | 'daesin_freight'      // 대신화물
  | 'self_pickup';        // 직접수령

export const DELIVERY_METHOD_LABELS: Record<DeliveryMethod, string> = {
  pickup: '상차',
  direct: '직접배차',
  logistics: '물류사',
  direct_dispatch: '직접배차',
  loading: '상차',
  kyungdong_delivery: '경동택배',
  daesin_delivery: '대신택배',
  kyungdong_freight: '경동화물',
  daesin_freight: '대신화물',
  self_pickup: '직접수령',
};

// 출고 목록 아이템
export interface ShipmentItem {
  id: string;
  shipmentNo: string;        // 출고번호
  lotNo: string;             // 출고로트
  orderLotNo?: string;       // 수주로트 (수주번호)
  scheduledDate: string;     // 출고예정일
  status: ShipmentStatus;    // 상태
  priority: ShipmentPriority; // 우선순위
  deliveryMethod: DeliveryMethod; // 배송방식
  deliveryMethodLabel?: string; // 배송방식 라벨 (API에서 조회)
  customerName: string;      // 발주처
  siteName: string;          // 현장명
  manager?: string;          // 담당
  canShip: boolean;          // 출고가능
  depositConfirmed: boolean; // 입금확인
  invoiceIssued: boolean;    // 세금계산서
  deliveryTime?: string;     // 납기(수배시간)
  // 새 필드
  orderCustomer?: string;     // 수주처
  customerGrade?: string;     // 거래등급
  receiver?: string;          // 수신자
  receiverAddress?: string;   // 수신주소
  receiverCompany?: string;   // 수신처
  dispatch?: string;          // 배차
  arrivalDateTime?: string;   // 입차일시
  tonnage?: string;           // 톤수
  unloadingNo?: string;       // 하차번호
  driverContact?: string;     // 기사연락처
  writer?: string;            // 작성자
  shipmentDate?: string;      // 출고일
  shipmentTime?: string;      // 출고시간 (캘린더용)
  orderer?: string;           // 수주자
  createdAt?: string;         // 작성일
}

// 출고 품목
export interface ShipmentProduct {
  id: string;
  no: number;
  itemCode: string;          // 품목코드
  itemName: string;          // 품목명
  floorUnit: string;         // 층/M호
  specification: string;     // 규격
  quantity: number;          // 수량
  lotNo: string;             // LOT번호
}

// 출고 상세 정보
export interface ShipmentDetail {
  // 기본 정보 (읽기전용)
  id: string;
  orderId?: number;              // 수주 ID (문서 BOM 데이터 조회용)
  shipmentNo: string;          // 출고번호
  lotNo: string;               // 출고로트
  orderLotNo?: string;         // 수주로트 (수주번호)
  siteName: string;            // 현장명
  customerName: string;        // 수주처
  customerGrade: string;       // 거래등급
  status: ShipmentStatus;      // 상태
  registrant?: string;         // 작성자
  orderer?: string;            // 수주자

  // 수주/배송 정보
  scheduledDate: string;       // 출고 예정일
  shipmentDate?: string;       // 출고일
  deliveryMethod: DeliveryMethod; // 배송방식
  freightCost?: FreightCostType; // 운임비용
  freightCostLabel?: string;   // 운임비용 라벨
  receiver?: string;           // 수신자
  receiverContact?: string;    // 수신처
  zipCode?: string;            // 우편번호
  address?: string;            // 주소
  addressDetail?: string;      // 상세주소

  // 배차 정보 (다중 행)
  vehicleDispatches: VehicleDispatch[];

  // 제품내용 (그룹핑)
  productGroups: ProductGroup[];
  otherParts: ProductPart[];

  // 기존 필드 (하위 호환 유지)
  products: ShipmentProduct[];
  priority: ShipmentPriority;
  deliveryAddress: string;
  depositConfirmed: boolean;
  invoiceIssued: boolean;
  canShip: boolean;
  loadingManager?: string;
  loadingCompleted?: string;
  logisticsCompany?: string;
  vehicleTonnage?: string;
  shippingCost?: number;
  vehicleNo?: string;
  driverName?: string;
  driverContact?: string;
  remarks?: string;
}

// 출고 등록 폼 데이터
export interface ShipmentCreateFormData {
  lotNo: string;             // 로트번호 *
  scheduledDate: string;     // 출고예정일 *
  priority: ShipmentPriority; // 출고 우선순위 *
  deliveryMethod: DeliveryMethod; // 배송방식 *
  shipmentDate?: string;     // 출고일
  freightCost?: FreightCostType; // 운임비용
  receiver?: string;         // 수신자
  receiverContact?: string;  // 수신처
  zipCode?: string;          // 우편번호
  address?: string;          // 주소
  addressDetail?: string;    // 상세주소
  vehicleDispatches: VehicleDispatch[]; // 배차 정보
  logisticsCompany?: string; // 물류사
  vehicleTonnage?: string;   // 차량 톤수(물량)
  loadingTime?: string;      // 상차시간(입차예정)
  loadingManager?: string;   // 상차담당자
  remarks?: string;          // 비고
}

// 출고 수정 폼 데이터
export interface ShipmentEditFormData {
  scheduledDate: string;     // 출고예정일 *
  shipmentDate?: string;     // 출고일
  priority: ShipmentPriority; // 출고 우선순위 *
  deliveryMethod: DeliveryMethod; // 배송방식 *
  freightCost?: FreightCostType; // 운임비용
  receiver?: string;         // 수신자
  receiverContact?: string;  // 수신처
  zipCode?: string;          // 우편번호
  address?: string;          // 주소
  addressDetail?: string;    // 상세주소
  vehicleDispatches: VehicleDispatch[]; // 배차 정보
  loadingManager?: string;   // 상차담당자
  logisticsCompany?: string; // 물류사
  vehicleTonnage?: string;   // 차량 톤수
  vehicleNo?: string;        // 차량번호
  shippingCost?: number;     // 운송비
  driverName?: string;       // 운전자명
  driverContact?: string;    // 운전자 연락처
  expectedArrival?: string;  // 입차예정시간
  confirmedArrival?: string; // 입차확정시간
  changeReason: string;      // 변경 사유 *
  remarks?: string;          // 비고
}

// 통계 데이터
export interface ShipmentStats {
  todayShipmentCount: number;    // 당일 출고 (레거시)
  todayPendingCount?: number;    // 당일 출고대기
  scheduledCount: number;        // 출고 대기
  pendingCount?: number;         // 출고대기 (새)
  shippingCount: number;         // 배송중
  completedCount?: number;       // 출고완료
  urgentCount: number;           // 긴급 출고
  totalCount: number;            // 전체 건수
}

// 상태별 통계 (탭용)
export interface ShipmentStatusStats {
  [key: string]: {
    label: string;
    count: number;
  };
}

// 필터 탭
export interface ShipmentFilterTab {
  key: 'all' | 'scheduled' | 'ready' | 'shipping' | 'completed' | 'calendar';
  label: string;
  count: number;
}

// LOT 선택 옵션 (등록 시)
export interface LotOption {
  value: string;
  label: string;
  customerName: string;
  siteName: string;
  deliveryAddress: string;
}

// 물류사 선택 옵션
export interface LogisticsOption {
  value: string;
  label: string;
}

// 차량 톤수 선택 옵션
export interface VehicleTonnageOption {
  value: string;
  label: string;
}
