// ===== 매출 유형 =====
export type SalesType =
  | 'credit'       // 외상 매출
  | 'product'      // 제품 매출
  | 'goods'        // 상품 매출
  | 'parts'        // 부품 매출
  | 'construction' // 공사 매출
  | 'rental'       // 임대 수익
  | 'other';       // 기타 매출

export const SALES_TYPE_LABELS: Record<SalesType, string> = {
  credit: '외상 매출',
  product: '제품 매출',
  goods: '상품 매출',
  parts: '부품 매출',
  construction: '공사 매출',
  rental: '임대 수익',
  other: '기타 매출',
};

export const SALES_TYPE_OPTIONS = [
  { value: 'all', label: '전체' },
  { value: 'credit', label: '외상 매출' },
  { value: 'product', label: '제품 매출' },
  { value: 'goods', label: '상품 매출' },
  { value: 'parts', label: '부품 매출' },
  { value: 'construction', label: '공사 매출' },
  { value: 'rental', label: '임대 수익' },
  { value: 'other', label: '기타 매출' },
];

// ===== 매출 상태 =====
export type SalesStatus =
  | 'monthlyClose'  // 당월마감
  | 'lastMonth'     // 전월
  | 'agreed'        // 합의
  | 'outstanding'   // 미수
  | 'all';          // 전체

export const SALES_STATUS_LABELS: Record<SalesStatus, string> = {
  monthlyClose: '당월마감',
  lastMonth: '전월',
  agreed: '합의',
  outstanding: '미수',
  all: '전체',
};

export const SALES_STATUS_COLORS: Record<SalesStatus, string> = {
  monthlyClose: 'bg-green-100 text-green-800',
  lastMonth: 'bg-gray-100 text-gray-800',
  agreed: 'bg-blue-100 text-blue-800',
  outstanding: 'bg-red-100 text-red-800',
  all: 'bg-gray-100 text-gray-800',
};

// ===== 필터 옵션 =====
export type FilterOption = 'all' | 'monthlyClose' | 'lastMonth' | 'agreed' | 'outstanding';

export const FILTER_OPTIONS: { value: FilterOption; label: string }[] = [
  { value: 'all', label: '전체' },
  { value: 'monthlyClose', label: '당월마감' },
  { value: 'lastMonth', label: '전월' },
  { value: 'agreed', label: '합의' },
  { value: 'outstanding', label: '미수' },
];

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

export const SORT_OPTIONS: { value: SortOption; label: string }[] = [
  { value: 'latest', label: '최신순' },
  { value: 'oldest', label: '오래된순' },
  { value: 'amountHigh', label: '금액 높은순' },
  { value: 'amountLow', label: '금액 낮은순' },
];

// ===== 매출 품목 =====
export interface SalesItem {
  id: string;
  itemName: string;      // 품목명
  quantity: number;      // 수량
  unitPrice: number;     // 단가
  supplyAmount: number;  // 공급가액
  vat: number;           // 부가세
  note: string;          // 적요
}

// ===== 매출 레코드 =====
export interface SalesRecord {
  id: string;
  salesNo: string;           // 매출번호
  salesDate: string;         // 매출일
  vendorId: string;          // 거래처 ID
  vendorName: string;        // 거래처명
  salesType: SalesType;      // 매출 유형
  accountSubject: string;    // 계정과목
  items: SalesItem[];        // 품목 목록
  totalSupplyAmount: number; // 공급가액 합계
  totalVat: number;          // 부가세 합계
  totalAmount: number;       // 총 금액
  receivedAmount: number;    // 입금액
  outstandingAmount: number; // 미수금액
  taxInvoiceIssued: boolean; // 세금계산서 발행 여부
  transactionStatementIssued: boolean; // 거래명세서 발행 여부
  note: string;              // 비고
  status: SalesStatus;       // 상태
  createdAt: string;
  updatedAt: string;
}

// ===== 세금계산서 발행여부 필터 =====
export type TaxInvoiceFilter = 'all' | 'issued' | 'notIssued';

export const TAX_INVOICE_FILTER_OPTIONS: { value: TaxInvoiceFilter; label: string }[] = [
  { value: 'all', label: '전체' },
  { value: 'issued', label: '발행완료' },
  { value: 'notIssued', label: '미발행' },
];

// ===== 거래명세서 발행여부 필터 =====
export type TransactionStatementFilter = 'all' | 'issued' | 'notIssued';

export const TRANSACTION_STATEMENT_FILTER_OPTIONS: { value: TransactionStatementFilter; label: string }[] = [
  { value: 'all', label: '전체' },
  { value: 'issued', label: '발행완료' },
  { value: 'notIssued', label: '미발행' },
];

// ===== 매출유형 필터 옵션 (스크린샷 기준) =====
export const SALES_TYPE_FILTER_OPTIONS = [
  { value: 'all', label: '전체' },
  { value: 'product', label: '제품 매출' },
  { value: 'goods', label: '상품 매출' },
  { value: 'parts', label: '부품 매출' },
  { value: 'service', label: '용역 매출' },
  { value: 'construction', label: '공사 매출' },
  { value: 'rental', label: '임대 수익' },
  { value: 'other', label: '기타 매출' },
  { value: 'unset', label: '미설정' },
];

// ===== 거래처 타입 =====
export interface Vendor {
  id: string;
  name: string;
  email?: string;
  phone?: string;
}

// ===== API 응답 타입 =====
export interface SaleApiOrderItem {
  id: number;
  order_id: number;
  item_name: string;
  quantity: string | number;
  unit_price: string | number;
  supply_amount: string | number;
  tax_amount: string | number;
  total_amount: string | number;
  note: string | null;
  sort_order: number;
}

export interface SaleApiData {
  id: number;
  sale_number: string;
  sale_date: string;
  client_id: number;
  client?: {
    id: number;
    name: string;
  };
  order?: {
    id: number;
    items?: SaleApiOrderItem[];
  };
  supply_amount: string | number;
  tax_amount: string | number;
  total_amount: string | number;
  description: string | null;
  status: 'draft' | 'confirmed' | 'invoiced';
  tax_invoice_issued: boolean;
  transaction_statement_issued: boolean;
  tax_invoice_id: number | null;
  deposit_id: number | null;
  created_by: number | null;
  updated_by: number | null;
  created_at: string;
  updated_at: string;
}

// API 상태 → 프론트엔드 상태 매핑
export const API_STATUS_MAP: Record<string, SalesStatus> = {
  'draft': 'outstanding',
  'confirmed': 'monthlyClose',
  'invoiced': 'agreed',
};

// API 응답 → 프론트엔드 타입 변환
export function transformApiToFrontend(apiData: SaleApiData): SalesRecord {
  // 수주(Order)의 품목(items)을 매출 품목으로 변환
  const items: SalesItem[] = (apiData.order?.items ?? []).map((item, _index) => ({
    id: String(item.id),
    itemName: item.item_name ?? '',
    quantity: parseFloat(String(item.quantity)) || 0,
    unitPrice: parseFloat(String(item.unit_price)) || 0,
    supplyAmount: parseFloat(String(item.supply_amount)) || 0,
    vat: parseFloat(String(item.tax_amount)) || 0,
    note: item.note ?? '',
  }));

  return {
    id: String(apiData.id),
    salesNo: apiData.sale_number,
    salesDate: apiData.sale_date,
    vendorId: String(apiData.client_id),
    vendorName: (apiData.client?.name && apiData.client.name.trim() !== '') ? apiData.client.name : '(거래처 미지정)',
    salesType: 'other', // API에 없음, 기본값
    accountSubject: 'other', // API에 없음, 기본값
    items, // 수주 품목에서 가져옴
    totalSupplyAmount: parseFloat(String(apiData.supply_amount)) || 0,
    totalVat: parseFloat(String(apiData.tax_amount)) || 0,
    totalAmount: parseFloat(String(apiData.total_amount)) || 0,
    receivedAmount: 0, // API에 없음, 기본값
    outstandingAmount: parseFloat(String(apiData.total_amount)) || 0, // totalAmount와 동일
    taxInvoiceIssued: apiData.tax_invoice_issued ?? false,
    transactionStatementIssued: apiData.transaction_statement_issued ?? false,
    note: apiData.description ?? '',
    status: API_STATUS_MAP[apiData.status] ?? 'outstanding',
    createdAt: apiData.created_at,
    updatedAt: apiData.updated_at,
  };
}

// 프론트엔드 → API 요청 변환
export function transformFrontendToApi(data: Partial<SalesRecord>): Record<string, unknown> {
  const apiData: Record<string, unknown> = {};

  if (data.salesDate !== undefined) apiData.sale_date = data.salesDate;
  if (data.vendorId !== undefined) apiData.client_id = parseInt(data.vendorId, 10);
  if (data.totalSupplyAmount !== undefined) apiData.supply_amount = data.totalSupplyAmount;
  if (data.totalVat !== undefined) apiData.tax_amount = data.totalVat;
  if (data.totalAmount !== undefined) apiData.total_amount = data.totalAmount;
  if (data.note !== undefined) apiData.description = data.note || null;
  if (data.taxInvoiceIssued !== undefined) apiData.tax_invoice_issued = data.taxInvoiceIssued;
  if (data.transactionStatementIssued !== undefined) apiData.transaction_statement_issued = data.transactionStatementIssued;

  // 품목 배열 변환 (수정 시 items 포함)
  if (data.items !== undefined && data.items.length > 0) {
    apiData.items = data.items.map((item, index) => ({
      item_name: item.itemName,
      quantity: item.quantity,
      unit_price: item.unitPrice,
      supply_amount: item.supplyAmount,
      tax_amount: item.vat,
      total_amount: item.supplyAmount + item.vat,
      note: item.note || null,
      sort_order: index + 1,
    }));
  }

  return apiData;
}

// API 페이지네이션 응답 타입
export interface SaleApiPaginatedResponse {
  data: SaleApiData[];
  current_page: number;
  last_page: number;
  per_page: number;
  total: number;
}