/**
 * 주일 기업 - 거래처 관리 타입 정의
 */

// 메모 타입
export interface PartnerMemo {
  id: string;
  content: string;
  createdAt: string;
}

// 필요 서류 타입
export interface PartnerDocument {
  id: string;
  fileName: string;
  fileUrl: string;
  fileSize: number;
  uploadedAt: string;
}

// 거래처 타입
export interface Partner {
  id: string;
  partnerCode: string; // 거래처번호 (자동생성)

  // 기본 정보
  businessNumber: string; // 사업자등록번호
  partnerName: string; // 거래처명
  representative: string; // 대표자명
  partnerType: 'sales' | 'purchase' | 'both'; // 거래처 유형 (매출/매입/복합)
  businessType: string; // 업태
  businessCategory: string; // 업종

  // 연락처 정보
  zipCode: string; // 우편번호
  address1: string; // 기본주소
  address2: string; // 상세주소
  phone: string; // 전화번호
  mobile: string; // 모바일
  fax: string; // 팩스
  email: string; // 이메일

  // 담당자 정보
  manager: string; // 담당자명
  managerPhone: string; // 담당자 전화
  systemManager: string; // 시스템 관리자

  // 회사 정보
  logoUrl: string | null; // 회사 로고 URL
  logoBlob: string | null; // 회사 로고 BLOB (Base64)
  salesPaymentDay: number | null; // 매출 결제일 (1~31)

  // 신용/거래 정보
  creditRating: string; // 신용등급 (AAA, AA, A, BBB, BB, B, CCC, CC, C, D)
  transactionGrade: string; // 거래등급 (A, B, C, D, E)
  taxInvoiceEmail: string; // 세금계산서 이메일

  // 추가 정보
  outstandingAmount: number; // 미수금
  overdueDays: number; // 연체일수
  overdueToggle: boolean; // 연체 ON/OFF
  badDebtToggle: boolean; // 악성채권 ON/OFF
  memos: PartnerMemo[]; // 메모 리스트

  // 필요 서류
  documents: PartnerDocument[];

  // 리스트용 필드 (하위 호환)
  category: string; // 구분 (건설사, 시공사 등)
  paymentDay: number | null; // 매출 결제일
  isBadDebt: boolean; // 악성채권 여부
  isActive: boolean; // 활성 상태

  createdAt: string;
  updatedAt: string;
}

// 거래처 통계
export interface PartnerStats {
  total: number; // 전체 거래처
  unregistered: number; // 미등록
  badDebt: number; // 악성채권
  normal: number; // 정상
}

// 거래처 필터
export interface PartnerFilter {
  search?: string;
  badDebtFilter?: 'all' | 'badDebt' | 'normal';
  sortBy?: 'latest' | 'oldest' | 'nameAsc' | 'nameDesc';
  page?: number;
  size?: number;
}

// 거래처 폼 데이터
export interface PartnerFormData {
  // 기본 정보
  businessNumber: string;
  partnerCode?: string;
  partnerName: string;
  representative: string;
  partnerType: 'sales' | 'purchase' | 'both';
  businessType: string;
  businessCategory: string;

  // 연락처 정보
  zipCode: string;
  address1: string;
  address2: string;
  phone: string;
  mobile: string;
  fax: string;
  email: string;

  // 담당자 정보
  manager: string;
  managerPhone: string;
  systemManager: string;

  // 회사 정보
  logoUrl: string | null;
  logoBlob: string | null;
  salesPaymentDay: number | null;

  // 신용/거래 정보
  creditRating: string;
  transactionGrade: string;
  taxInvoiceEmail: string;

  // 추가 정보
  outstandingAmount: number;
  overdueDays: number;
  overdueToggle: boolean;
  badDebtToggle: boolean;
  memos: PartnerMemo[];

  // 필요 서류
  documents: PartnerDocument[];

  // 리스트용 필드
  category: string;
}

// API 응답 타입
export interface PartnerListResponse {
  items: Partner[];
  total: number;
  page: number;
  size: number;
  totalPages: number;
}

// 셀렉트 옵션들
export const PARTNER_TYPE_OPTIONS = [
  { value: 'sales', label: '매출' },
  { value: 'purchase', label: '매입' },
  { value: 'both', label: '복합' },
];

export const CATEGORY_OPTIONS = [
  { value: '건설사', label: '건설사' },
  { value: '시공사', label: '시공사' },
  { value: '기타', label: '기타' },
];

export const CREDIT_RATING_OPTIONS = [
  { value: 'AAA', label: 'AAA' },
  { value: 'AA', label: 'AA' },
  { value: 'A', label: 'A' },
  { value: 'BBB', label: 'BBB' },
  { value: 'BB', label: 'BB' },
  { value: 'B', label: 'B' },
  { value: 'CCC', label: 'CCC' },
  { value: 'CC', label: 'CC' },
  { value: 'C', label: 'C' },
  { value: 'D', label: 'D' },
];

export const TRANSACTION_GRADE_OPTIONS = [
  { value: 'A', label: 'A(우수)' },
  { value: 'B', label: 'B(양호)' },
  { value: 'C', label: 'C(보통)' },
  { value: 'D', label: 'D(주의)' },
  { value: 'E', label: 'E(위험)' },
];

export const PAYMENT_DAY_OPTIONS = Array.from({ length: 31 }, (_, i) => ({
  value: String(i + 1),
  label: `${i + 1}일`,
}));

// 빈 폼 데이터 생성
export const getEmptyPartnerFormData = (): PartnerFormData => ({
  businessNumber: '',
  partnerCode: '',
  partnerName: '',
  representative: '',
  partnerType: 'sales',
  businessType: '',
  businessCategory: '',
  zipCode: '',
  address1: '',
  address2: '',
  phone: '',
  mobile: '',
  fax: '',
  email: '',
  manager: '',
  managerPhone: '',
  systemManager: '',
  logoUrl: null,
  logoBlob: null,
  salesPaymentDay: 15,
  creditRating: 'A',
  transactionGrade: 'C',
  taxInvoiceEmail: '',
  outstandingAmount: 0,
  overdueDays: 0,
  overdueToggle: false,
  badDebtToggle: false,
  memos: [],
  documents: [],
  category: '건설사',
});

// Partner → PartnerFormData 변환
export const partnerToFormData = (partner: Partner): PartnerFormData => ({
  businessNumber: partner.businessNumber || '',
  partnerCode: partner.partnerCode || '',
  partnerName: partner.partnerName || '',
  representative: partner.representative || '',
  partnerType: partner.partnerType || 'sales',
  businessType: partner.businessType || '',
  businessCategory: partner.businessCategory || '',
  zipCode: partner.zipCode || '',
  address1: partner.address1 || '',
  address2: partner.address2 || '',
  phone: partner.phone || '',
  mobile: partner.mobile || '',
  fax: partner.fax || '',
  email: partner.email || '',
  manager: partner.manager || '',
  managerPhone: partner.managerPhone || '',
  systemManager: partner.systemManager || '',
  logoUrl: partner.logoUrl || null,
  logoBlob: partner.logoBlob || null,
  salesPaymentDay: partner.salesPaymentDay ?? partner.paymentDay ?? 15,
  creditRating: partner.creditRating || 'A',
  transactionGrade: partner.transactionGrade || 'C',
  taxInvoiceEmail: partner.taxInvoiceEmail || '',
  outstandingAmount: partner.outstandingAmount || 0,
  overdueDays: partner.overdueDays || 0,
  overdueToggle: partner.overdueToggle || false,
  badDebtToggle: partner.badDebtToggle || partner.isBadDebt || false,
  memos: partner.memos || [],
  documents: partner.documents || [],
  category: partner.category || '건설사',
});