/**
 * 주일 기업 - 계약관리 타입 정의
 *
 * 계약 데이터는 낙찰 후 자동 등록됨
 */

import { getTodayString } from '@/lib/utils/date';

// 계약 상태
export type ContractStatus =
  | 'pending'      // 계약대기
  | 'completed';   // 계약완료

// 계약 단계 (스크린샷의 상단 탭)
export type ContractStage =
  | 'estimate_selected'  // 견적선정
  | 'estimate_progress'  // 견적진행
  | 'delivery'           // 납품
  | 'installation'       // 설치중
  | 'inspection'         // 검수
  | 'other';             // 기타

// 계약 타입
export interface Contract {
  id: string;
  contractCode: string; // 계약번호

  // 기본 정보
  partnerId: string; // 거래처 ID
  partnerName: string; // 거래처명
  projectName: string; // 현장명

  // 담당자 정보
  contractManagerId: string; // 계약담당자 ID
  contractManagerName: string; // 계약담당자
  constructionPMId: string; // 공사PM ID
  constructionPMName: string; // 공사PM

  // 계약 정보
  totalLocations: number; // 총 개소
  contractAmount: number; // 계약금액
  contractStartDate: string | null; // 계약시작일
  contractEndDate: string | null; // 계약종료일

  // 상태 정보
  status: ContractStatus; // 계약상태
  stage: ContractStage; // 계약단계

  // 비고
  remarks: string;

  // 메타 정보
  createdAt: string;
  updatedAt: string;
  createdBy: string;

  // 연결된 입찰 정보
  biddingId: string;
  biddingCode: string;
}

// 계약 통계
export interface ContractStats {
  total: number; // 전체 계약
  pending: number; // 계약대기
  completed: number; // 계약완료
}

// 단계별 건수
export interface ContractStageCount {
  estimateSelected: number; // 견적선정
  estimateProgress: number; // 견적진행
  delivery: number; // 납품
  installation: number; // 설치중
  inspection: number; // 검수
  other: number; // 기타
}

// 계약 필터
export interface ContractFilter {
  search?: string;
  status?: ContractStatus | 'all';
  stage?: ContractStage | 'all';
  partnerId?: string;
  contractManagerId?: string;
  constructionPMId?: string;
  startDate?: string;
  endDate?: string;
  sortBy?: string;
  page?: number;
  size?: number;
}

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

// 상태 옵션
export const CONTRACT_STATUS_OPTIONS = [
  { value: 'all', label: '전체' },
  { value: 'pending', label: '계약대기' },
  { value: 'completed', label: '계약완료' },
];

// 단계 옵션
export const CONTRACT_STAGE_OPTIONS = [
  { value: 'all', label: '전체' },
  { value: 'estimate_selected', label: '견적선정' },
  { value: 'estimate_progress', label: '견적진행' },
  { value: 'delivery', label: '납품' },
  { value: 'installation', label: '설치중' },
  { value: 'inspection', label: '검수' },
  { value: 'other', label: '기타' },
];

// 정렬 옵션
export const CONTRACT_SORT_OPTIONS = [
  { value: 'contractDateDesc', label: '최신순 (계약일)' },
  { value: 'contractDateAsc', label: '등록순 (계약일)' },
  { value: 'partnerNameAsc', label: '거래처명 오름차순' },
  { value: 'partnerNameDesc', label: '거래처명 내림차순' },
  { value: 'projectNameAsc', label: '현장명 오름차순' },
  { value: 'projectNameDesc', label: '현장명 내림차순' },
  { value: 'amountDesc', label: '계약금액 높은순' },
  { value: 'amountAsc', label: '계약금액 낮은순' },
];

// 상태별 스타일
export const CONTRACT_STATUS_STYLES: Record<ContractStatus, string> = {
  pending: 'text-orange-500 font-medium',
  completed: 'text-green-600 font-medium',
};

export const CONTRACT_STATUS_LABELS: Record<ContractStatus, string> = {
  pending: '계약대기',
  completed: '계약완료',
};

// 단계별 라벨
export const CONTRACT_STAGE_LABELS: Record<ContractStage, string> = {
  estimate_selected: '견적선정',
  estimate_progress: '견적진행',
  delivery: '납품',
  installation: '설치중',
  inspection: '검수',
  other: '기타',
};

// 계약 상세 (상세/수정용 확장 타입)
export interface ContractDetail extends Contract {
  // 계약서 파일
  contractFile?: {
    id: string;
    fileName: string;
    fileUrl: string;
    uploadedAt: string;
  } | null;
  // 첨부 문서 목록
  attachments: ContractAttachment[];
}

// 첨부 문서 타입
export interface ContractAttachment {
  id: string;
  fileName: string;
  fileSize: number;
  fileUrl: string;
  uploadedAt: string;
}

// 계약 폼 데이터
export interface ContractFormData {
  contractCode: string;
  contractManagerId: string;
  contractManagerName: string;
  partnerId: string;
  partnerName: string;
  projectName: string;
  contractDate: string;
  totalLocations: number;
  contractStartDate: string;
  contractEndDate: string;
  vatType: string;
  contractAmount: number;
  status: ContractStatus;
  remarks: string;
  contractFile: File | null;
  attachments: File[];
}

// 오늘 날짜 (YYYY-MM-DD)
const getTodayDate = () => getTodayString();

// 날짜 값 정규화 (빈 값, '0', null이면 오늘 날짜 반환)
const normalizeDateValue = (value: string | null | undefined): string => {
  if (!value || value === '0' || value === 'null' || value === '0000-00-00') {
    return getTodayDate();
  }
  return value;
};

// 빈 폼 데이터 생성
export function getEmptyContractFormData(): ContractFormData {
  const today = getTodayDate();
  return {
    contractCode: '',
    contractManagerId: '',
    contractManagerName: '',
    partnerId: '',
    partnerName: '',
    projectName: '',
    contractDate: today,
    totalLocations: 0,
    contractStartDate: '',
    contractEndDate: '',
    vatType: 'excluded',
    contractAmount: 0,
    status: 'pending',
    remarks: '',
    contractFile: null,
    attachments: [],
  };
}

// ContractDetail을 FormData로 변환
export function contractDetailToFormData(detail: ContractDetail): ContractFormData {
  return {
    contractCode: detail.contractCode,
    contractManagerId: detail.contractManagerId,
    contractManagerName: detail.contractManagerName,
    partnerId: detail.partnerId,
    partnerName: detail.partnerName,
    projectName: detail.projectName,
    contractDate: normalizeDateValue(detail.createdAt),
    totalLocations: detail.totalLocations,
    contractStartDate: detail.contractStartDate || '',
    contractEndDate: detail.contractEndDate || '',
    vatType: 'excluded',
    contractAmount: detail.contractAmount,
    status: detail.status,
    remarks: detail.remarks,
    contractFile: null,
    attachments: [],
  };
}

// 부가세 옵션
export const VAT_TYPE_OPTIONS = [
  { value: 'included', label: '부가세 포함' },
  { value: 'excluded', label: '부가세 별도' },
];
