// ===== 매입관리 타입 정의 =====

// 매입 상태
export type PurchaseStatus = 'pending' | 'completed' | 'cancelled';

// 매입 유형 (계정과목명)
export type PurchaseType =
  | 'unset' // 미설정
  | 'raw_material' // 원재료매입
  | 'subsidiary_material' // 부재료매입
  | 'product' // 상품매입
  | 'outsourcing' // 외주가공비
  | 'consumables' // 소모품비
  | 'repair' // 수선비
  | 'transportation' // 운반비
  | 'office_supplies' // 사무용품비
  | 'rent' // 임차료
  | 'utilities' // 수도광열비
  | 'communication' // 통신비
  | 'vehicle' // 차량유지비
  | 'entertainment' // 접대비
  | 'insurance' // 보험료
  | 'other_service'; // 기타용역비

// 증빙 유형
export type EvidenceType =
  | 'tax_invoice' // 세금계산서
  | 'card' // 카드전표
  | 'cash_receipt' // 현금영수증
  | 'receipt' // 간이영수증
  | 'none'; // 증빙없음

// 매입 품목 정보
export interface PurchaseItem {
  id: string;
  itemName: string; // 품목명
  quantity: number; // 수량
  unitPrice: number; // 단가
  supplyPrice: number; // 공급가액
  vat: number; // 부가세
  note?: string; // 적요
}

// 매입 레코드
export interface PurchaseRecord {
  id: string;
  purchaseNo: string; // 매입번호
  purchaseDate: string; // 매입일자
  vendorId: string; // 거래처 ID
  vendorName: string; // 거래처명
  supplyAmount: number; // 공급가액
  vat: number; // 부가세
  totalAmount: number; // 합계금액
  purchaseType: PurchaseType; // 매입유형
  evidenceType: EvidenceType; // 증빙유형
  status: PurchaseStatus; // 상태
  // 연결된 결재문서 ID (품의서/지출결의서)
  approvalId?: string;
  // 근거 문서 (API에서 조회됨)
  sourceDocument?: {
    type: 'proposal' | 'expense_report'; // 품의서 | 지출결의서
    documentNo: string;
    title: string; // 품의서/지출결의서 제목
    expectedCost: number;
  };
  // 출금 계좌
  withdrawalAccount?: {
    bankName: string;
    accountNo: string;
    accountAlias?: string;
  };
  // 품목 정보
  items: PurchaseItem[];
  // 세금계산서 수취 여부
  taxInvoiceReceived: boolean;
  // 타임스탬프
  createdAt: string;
  updatedAt: string;
}

// 정렬 옵션
export type SortOption = 'latest' | 'oldest' | 'amountHigh' | 'amountLow';

// 세금계산서 수취여부 필터
export type TaxInvoiceReceivedFilter = 'all' | 'received' | 'notReceived';

// ===== 상수 정의 =====

export const PURCHASE_TYPE_LABELS: Record<PurchaseType, string> = {
  unset: '미설정',
  raw_material: '원재료매입',
  subsidiary_material: '부재료매입',
  product: '상품매입',
  outsourcing: '외주가공비',
  consumables: '소모품비',
  repair: '수선비',
  transportation: '운반비',
  office_supplies: '사무용품비',
  rent: '임차료',
  utilities: '수도광열비',
  communication: '통신비',
  vehicle: '차량유지비',
  entertainment: '접대비',
  insurance: '보험료',
  other_service: '기타용역비',
};

export const EVIDENCE_TYPE_LABELS: Record<EvidenceType, string> = {
  tax_invoice: '세금계산서',
  card: '카드전표',
  cash_receipt: '현금영수증',
  receipt: '간이영수증',
  none: '증빙없음',
};

export const PURCHASE_STATUS_LABELS: Record<PurchaseStatus, string> = {
  pending: '진행중',
  completed: '완료',
  cancelled: '취소',
};

export const PURCHASE_STATUS_COLORS: Record<PurchaseStatus, string> = {
  pending: 'bg-blue-100 text-blue-800',
  completed: 'bg-green-100 text-green-800',
  cancelled: 'bg-red-100 text-red-800',
};

// 정렬 옵션
export const SORT_OPTIONS: { value: SortOption; label: string }[] = [
  { value: 'latest', label: '최신순' },
  { value: 'oldest', label: '등록순' },
  { value: 'amountHigh', label: '금액 높은순' },
  { value: 'amountLow', label: '금액 낮은순' },
];

// 매입유형 필터 옵션 (전체 포함)
export const PURCHASE_TYPE_FILTER_OPTIONS: { value: string; label: string }[] = [
  { value: 'all', label: '전체' },
  { value: 'raw_material', label: '원재료매입' },
  { value: 'subsidiary_material', label: '부재료매입' },
  { value: 'product', label: '상품매입' },
  { value: 'outsourcing', label: '외주가공비' },
  { value: 'consumables', label: '소모품비' },
  { value: 'repair', label: '수선비' },
  { value: 'transportation', label: '운반비' },
  { value: 'office_supplies', label: '사무용품비' },
  { value: 'rent', label: '임차료' },
  { value: 'utilities', label: '수도광열비' },
  { value: 'communication', label: '통신비' },
  { value: 'vehicle', label: '차량유지비' },
  { value: 'entertainment', label: '접대비' },
  { value: 'insurance', label: '보험료' },
  { value: 'other_service', label: '기타용역비' },
  { value: 'unset', label: '미설정' },
];

// 세금계산서 수취여부 필터 옵션
export const TAX_INVOICE_RECEIVED_FILTER_OPTIONS: { value: TaxInvoiceReceivedFilter; label: string }[] = [
  { value: 'all', label: '전체' },
  { value: 'received', label: '수취 확인' },
  { value: 'notReceived', label: '수취 미확인' },
];

