/**
 * 주일 기업 - 입찰관리 타입 정의
 *
 * 입찰 데이터는 견적 상세에서 견적완료 시 자동 등록됨
 * (별도 등록 기능 없음, 상세/수정만 가능)
 */

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

// 입찰 상태
export type BiddingStatus =
  | 'waiting'      // 입찰대기
  | 'submitted'    // 투찰
  | 'failed'       // 탈락
  | 'invalid'      // 유찰
  | 'awarded'      // 낙찰
  | 'hold';        // 보류

// 입찰 타입
export interface Bidding {
  id: string;
  biddingCode: string; // 입찰번호

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

  // 입찰 정보
  biddingDate: string | null; // 입찰일자
  totalCount: number; // 총 개소
  biddingAmount: number; // 입찰금액
  bidDate: string | null; // 입찰일
  submissionDate: string | null; // 투찰일
  confirmDate: string | null; // 확정일

  // 상태 정보
  status: BiddingStatus;

  // 입찰자
  bidderId: string;
  bidderName: string;

  // 비고
  remarks: string;

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

  // 연결된 견적 정보 (견적완료 시 자동 연결)
  estimateId: string;
  estimateCode: string;
}

// 입찰 통계
export interface BiddingStats {
  total: number; // 전체 입찰
  waiting: number; // 입찰대기
  awarded: number; // 낙찰
}

// 입찰 필터
export interface BiddingFilter {
  search?: string;
  status?: BiddingStatus | 'all';
  partnerId?: string;
  bidderId?: string;
  startDate?: string;
  endDate?: string;
  sortBy?: string;
  page?: number;
  size?: number;
}

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

// 상태 옵션
export const BIDDING_STATUS_OPTIONS = [
  { value: 'all', label: '전체' },
  { value: 'waiting', label: '입찰대기' },
  { value: 'submitted', label: '투찰' },
  { value: 'failed', label: '탈락' },
  { value: 'invalid', label: '유찰' },
  { value: 'awarded', label: '낙찰' },
  { value: 'hold', label: '보류' },
];

// 정렬 옵션
export const BIDDING_SORT_OPTIONS = [
  { value: 'biddingDateDesc', label: '최신순 (입찰일)' },
  { value: 'biddingDateAsc', label: '등록순 (입찰일)' },
  { value: 'submissionDateDesc', label: '투찰일 최신순' },
  { value: 'confirmDateDesc', label: '확정일 최신순' },
  { value: 'partnerNameAsc', label: '거래처명 오름차순' },
  { value: 'partnerNameDesc', label: '거래처명 내림차순' },
  { value: 'projectNameAsc', label: '현장명 오름차순' },
  { value: 'projectNameDesc', label: '현장명 내림차순' },
];

// 상태별 스타일
export const BIDDING_STATUS_STYLES: Record<BiddingStatus, string> = {
  waiting: 'text-orange-500 font-medium',
  submitted: 'text-blue-500 font-medium',
  failed: 'text-red-500 font-medium',
  invalid: 'text-gray-500 font-medium',
  awarded: 'text-green-600 font-medium',
  hold: 'text-gray-400 font-medium',
};

export const BIDDING_STATUS_LABELS: Record<BiddingStatus, string> = {
  waiting: '입찰대기',
  submitted: '투찰',
  failed: '탈락',
  invalid: '유찰',
  awarded: '낙찰',
  hold: '보류',
};

// =====================================================
// 입찰 상세 관련 타입
// =====================================================

// 공과 항목 (견적에서 가져옴)
export interface ExpenseItem {
  id: string;
  name: string; // 공과명
  amount: number; // 금액
}

// 견적 상세 항목 (견적에서 가져옴 - estimates와 동일한 구조)
export interface EstimateDetailItem {
  id: string;
  no: number; // 번호
  name: string; // 명칭
  material: string; // 제품
  width: number; // 가로 (M)
  height: number; // 세로 (M)
  quantity: number; // 수량

  // 계산값들
  weight: number; // 무게 = 면적*25
  area: number; // 면적 = (가로×0.16)*(세로×0.5)
  steelScreen: number; // 철제,스크린 = 면적*47500
  caulking: number; // 코킹 = (세로*4)*단가
  rail: number; // 레일 = (세로×0.2)*단가
  bottom: number; // 하장 = 가로*단가
  boxReinforce: number; // 박스+보강 = 가로*단가
  shaft: number; // 샤프트 = 가로*단가
  painting: number; // 도장 (셀렉트)
  motor: number; // 모터 (셀렉트)
  controller: number; // 제어기 (셀렉트)
  widthConstruction: number; // 가로시공비
  heightConstruction: number; // 세로시공비
  unitPrice: number; // 단가
  expenseRate: number; // 공과율
  expense: number; // 공과
  cost: number; // 원가
  costExecution: number; // 원가실행
  marginCost: number; // 마진원가
  marginCostExecution: number; // 마진원가실행
  expenseExecution: number; // 공과실행
}

// 입찰 상세 전체 데이터
export interface BiddingDetail extends Bidding {
  // 공사기간
  constructionStartDate: string;
  constructionEndDate: string;

  // 부가세
  vatType: string;

  // 공과 상세 (견적에서 가져옴 - 읽기 전용)
  expenseItems: ExpenseItem[];

  // 견적 상세 (견적에서 가져옴 - 읽기 전용)
  estimateDetailItems: EstimateDetailItem[];
}

// 입찰 상세 폼 데이터 (수정용)
export interface BiddingDetailFormData {
  // 입찰 정보
  biddingCode: string;
  bidderId: string;
  bidderName: string;
  partnerName: string;
  projectName: string;
  biddingDate: string;
  totalCount: number;
  constructionStartDate: string;
  constructionEndDate: string;
  vatType: string;
  biddingAmount: number;
  status: BiddingStatus;
  submissionDate: string;
  confirmDate: string;
  remarks: string;

  // 공과 상세 (읽기 전용)
  expenseItems: ExpenseItem[];

  // 견적 상세 (읽기 전용)
  estimateDetailItems: EstimateDetailItem[];
}

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

// 오늘 날짜 (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 getEmptyBiddingDetailFormData(): BiddingDetailFormData {
  const today = getTodayDate();
  return {
    biddingCode: '',
    bidderId: '',
    bidderName: '',
    partnerName: '',
    projectName: '',
    biddingDate: today,
    totalCount: 0,
    constructionStartDate: '',
    constructionEndDate: '',
    vatType: 'excluded',
    biddingAmount: 0,
    status: 'waiting',
    submissionDate: today,
    confirmDate: '',
    remarks: '',
    expenseItems: [],
    estimateDetailItems: [],
  };
}

// BiddingDetail을 FormData로 변환
export function biddingDetailToFormData(detail: BiddingDetail): BiddingDetailFormData {
  return {
    biddingCode: detail.biddingCode,
    bidderId: detail.bidderId,
    bidderName: detail.bidderName,
    partnerName: detail.partnerName,
    projectName: detail.projectName,
    biddingDate: normalizeDateValue(detail.biddingDate),
    totalCount: detail.totalCount,
    constructionStartDate: detail.constructionStartDate,
    constructionEndDate: detail.constructionEndDate,
    vatType: detail.vatType,
    biddingAmount: detail.biddingAmount,
    status: detail.status,
    submissionDate: normalizeDateValue(detail.submissionDate),
    confirmDate: detail.confirmDate || '',
    remarks: detail.remarks,
    expenseItems: detail.expenseItems,
    estimateDetailItems: detail.estimateDetailItems,
  };
}
