/**
 * 주일 기업 - 견적관리 타입 정의
 */

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

// 견적 상태
export type EstimateStatus = 'pending' | 'approval_waiting' | 'completed' | 'rejected' | 'hold';

// =====================================================
// 견적 상세 관련 타입
// =====================================================

// 견적 요약 항목
export interface EstimateSummaryItem {
  id: string;
  name: string; // 명칭
  quantity: number; // 수량
  unit: string; // 단위
  materialCost: number; // 재료비
  laborCost: number; // 노무비
  totalCost: number; // 합계
  remarks: string; // 비고
}

// 공과 항목
export interface ExpenseItem {
  id: string;
  name: string; // 공과명
  amount: number; // 금액
  selected?: boolean; // 선택 여부
}

// 품목 단가 조정 - 품목별 단가 정보
export interface PriceAdjustmentItemPrice {
  purchasePrice: number; // 매입단가
  marginRate: number; // 마진율 (%)
  sellingPrice: number; // 판매단가
  adjustedPrice: number; // 조정단가
}

// 품목 단가 조정 전체 구조
export interface PriceAdjustmentData {
  caulking: PriceAdjustmentItemPrice; // 코킹
  rail: PriceAdjustmentItemPrice; // 레일
  bottom: PriceAdjustmentItemPrice; // 하장
  boxReinforce: PriceAdjustmentItemPrice; // 박스+보강
  shaft: PriceAdjustmentItemPrice; // 샤프트
  painting: PriceAdjustmentItemPrice; // 도장
  motor: PriceAdjustmentItemPrice; // 모터
  controller: PriceAdjustmentItemPrice; // 제어기
}

// 레거시 호환용 (기존 구조)
export interface PriceAdjustmentItem {
  id: string;
  category: string; // 카테고리 (배합비, 재단비, 판매단가, 조립단가)
  unitPrice: number; // 단가
  coating: number; // 코팅
  batting: number; // 배팅
  boxReinforce: number; // 박스+보강
  painting: number; // 도장
  total: number; // 합계
}

// 견적 상세 항목 (테이블 row)
export interface EstimateDetailItem {
  id: string;
  no: number; // 번호
  name: string; // 명칭
  material: string; // 재료
  width: number; // 가로 (M, 소수점 둘째자리)
  height: number; // 세로 (M, 소수점 둘째자리)
  quantity: number; // 수량
  box: number; // 박스
  assembly: number; // 조립
  coating: number; // 코팅/도장 (셀렉트)
  batting: number; // 배팅
  mounting: number; // 모터 (셀렉트)
  fitting: number; // 착장
  controller: number; // 제어기 (셀렉트)
  widthConstruction: number; // 가로 시공비 (수동 셀렉트)
  heightConstruction: number; // 세로 시공비 (자동 셀렉트)
  materialCost: number; // 재료비
  laborCost: number; // 노무비
  quantityPrice: number; // 수량*단가
  expenseQuantity: number; // 공과*수량
  expenseTotal: number; // 공과합
  totalCost: number; // 합계비
  otherCost: number; // 기타원가합
  marginCost: number; // 마진원가
  totalPrice: number; // 단가합계
  unitPrice: number; // 단가
  expense: number; // 공과율 (인풋)
  marginRate: number; // 마진율
  unitQuantity: number; // 단가수량
  expenseResult: number; // 공과 실행
  marginActual: number; // 마진원가+수량

  // === 계산 필드 (인풋, 계산값 표시 + 수정 가능) ===
  // 기본값은 자동 계산, 사용자가 수정하면 그 값 유지
  calcWeight?: number; // 무게 = 면적*25
  calcArea?: number; // 면적 = (가로×0.16)*(세로×0.5)
  calcSteelScreen?: number; // 철재,스크린 = 면적*47500
  calcCaulking?: number; // 코킹 = (세로*4)*단가
  calcRail?: number; // 레일 = (세로×0.2)*단가
  calcBottom?: number; // 하장 = 가로*단가
  calcBoxReinforce?: number; // 박스+보강 = 가로*단가
  calcShaft?: number; // 샤프트 = 가로*단가
  calcUnitPrice?: number; // 단가 = (7)~(17)의 합
  calcExpense?: number; // 공과 = 단가×공과율

  // === 개별 항목 조정단가 (선택 적용 시 사용) ===
  // "조정 단가 적용" 버튼으로 선택한 항목에만 적용되는 단가
  adjustedCaulking?: number; // 코킹 조정단가
  adjustedRail?: number; // 레일 조정단가
  adjustedBottom?: number; // 하장 조정단가
  adjustedBoxReinforce?: number; // 박스+보강 조정단가
  adjustedShaft?: number; // 샤프트 조정단가
  adjustedPainting?: number; // 도장 조정단가
  adjustedMotor?: number; // 모터 조정단가
  adjustedController?: number; // 제어기 조정단가
}

// 결재자 정보 - 공통 타입 import 및 re-export
import type { ApprovalPerson, ElectronicApproval } from '../common/types';
export type { ApprovalPerson, ElectronicApproval };
export { getEmptyElectronicApproval } from '../common/types';

// 현장설명회 정보 (견적 상세용)
export interface SiteBriefingInfo {
  briefingCode: string; // 현설번호
  partnerName: string; // 거래처명
  companyName: string; // 회사명
  briefingDate: string; // 현장설명회 일자
  attendee: string; // 참석자
}

// 입찰 정보 (견적 상세용)
export interface BidInfo {
  projectName: string; // 현장명
  bidDate: string; // 입찰일자
  siteCount: number; // 개소
  constructionPeriod: string; // 공사기간 (startDate ~ endDate)
  constructionStartDate: string;
  constructionEndDate: string;
  vatType: string; // 부가세
  workReport: string; // 업무 보고
  documents: BidDocument[]; // 현장설명회 자료
}

// 입찰 문서
export interface BidDocument {
  id: string;
  fileName: string;
  fileUrl: string;
  fileSize: number;
}

// 견적 상세 전체 데이터
export interface EstimateDetail extends Estimate {
  // 현장설명회 정보
  siteBriefing: SiteBriefingInfo;

  // 입찰 정보
  bidInfo: BidInfo;

  // 견적 요약 정보
  summaryItems: EstimateSummaryItem[];

  // 공과 상세
  expenseItems: ExpenseItem[];

  // 품목 단가 조정 (레거시)
  priceAdjustments: PriceAdjustmentItem[];

  // 품목 단가 조정 (신규 구조)
  priceAdjustmentData?: PriceAdjustmentData;

  // 견적 상세 테이블
  detailItems: EstimateDetailItem[];

  // 전자결재 정보
  approval?: ElectronicApproval;
}

// 견적 상세 폼 데이터 (수정용)
export interface EstimateDetailFormData {
  // 견적 정보
  estimateCode: string;
  estimatorId: string;
  estimatorName: string;
  estimateCompanyManager: string; // 견적 회사 담당자
  estimateCompanyManagerContact: string; // 견적 회사 담당자 연락처
  estimateAmount: number;
  status: EstimateStatus;
  completedDate: string | null; // 견적완료일

  // 현장설명회 정보
  siteBriefing: SiteBriefingInfo;

  // 입찰 정보
  bidInfo: BidInfo;

  // 견적 요약 정보
  summaryItems: EstimateSummaryItem[];

  // 견적 요약 메모
  summaryMemo: string;

  // 공과 상세
  expenseItems: ExpenseItem[];

  // 품목 단가 조정 (레거시)
  priceAdjustments: PriceAdjustmentItem[];

  // 품목 단가 조정 (신규 구조)
  priceAdjustmentData: PriceAdjustmentData;

  // 견적 상세 테이블
  detailItems: EstimateDetailItem[];

  // 전자결재 정보
  approval: ElectronicApproval;
}

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

// 빈 단가 조정 항목 생성
function getEmptyPriceAdjustmentItemPrice(): PriceAdjustmentItemPrice {
  return {
    purchasePrice: 10000,
    marginRate: 3.0,
    sellingPrice: 10300,
    adjustedPrice: 10300,
  };
}

// 빈 단가 조정 데이터 생성
export function getEmptyPriceAdjustmentData(): PriceAdjustmentData {
  return {
    caulking: getEmptyPriceAdjustmentItemPrice(),
    rail: getEmptyPriceAdjustmentItemPrice(),
    bottom: getEmptyPriceAdjustmentItemPrice(),
    boxReinforce: getEmptyPriceAdjustmentItemPrice(),
    shaft: getEmptyPriceAdjustmentItemPrice(),
    painting: getEmptyPriceAdjustmentItemPrice(),
    motor: getEmptyPriceAdjustmentItemPrice(),
    controller: getEmptyPriceAdjustmentItemPrice(),
  };
}

// 오늘 날짜 (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 getEmptyEstimateDetailFormData(): EstimateDetailFormData {
  const today = getTodayDate();
  return {
    estimateCode: '',
    estimatorId: '',
    estimatorName: '',
    estimateCompanyManager: '',
    estimateCompanyManagerContact: '',
    estimateAmount: 0,
    status: 'pending',
    completedDate: null,
    siteBriefing: {
      briefingCode: '',
      partnerName: '',
      companyName: '',
      briefingDate: today,
      attendee: '',
    },
    bidInfo: {
      projectName: '',
      bidDate: today,
      siteCount: 0,
      constructionPeriod: '',
      constructionStartDate: '',
      constructionEndDate: '',
      vatType: 'excluded',
      workReport: '',
      documents: [],
    },
    summaryItems: [],
    summaryMemo: '',
    expenseItems: [],
    priceAdjustments: [],
    priceAdjustmentData: getEmptyPriceAdjustmentData(),
    detailItems: [],
    approval: {
      approvers: [],
      references: [],
    },
  };
}

// EstimateDetail을 FormData로 변환
export function estimateDetailToFormData(detail: EstimateDetail): EstimateDetailFormData {
  return {
    estimateCode: detail.estimateCode,
    estimatorId: detail.estimatorId,
    estimatorName: detail.estimatorName,
    estimateCompanyManager: detail.estimateCompanyManager || '',
    estimateCompanyManagerContact: detail.estimateCompanyManagerContact || '',
    estimateAmount: detail.estimateAmount,
    status: detail.status,
    completedDate: detail.completedDate || null,
    siteBriefing: {
      ...detail.siteBriefing,
      briefingDate: normalizeDateValue(detail.siteBriefing?.briefingDate),
    },
    bidInfo: {
      ...detail.bidInfo,
      bidDate: normalizeDateValue(detail.bidInfo?.bidDate),
    },
    summaryItems: detail.summaryItems,
    summaryMemo: '',
    expenseItems: detail.expenseItems,
    priceAdjustments: detail.priceAdjustments,
    priceAdjustmentData: detail.priceAdjustmentData || getEmptyPriceAdjustmentData(),
    detailItems: detail.detailItems,
    approval: detail.approval || { approvers: [], references: [] },
  };
}

// 견적 타입
export interface Estimate {
  id: string;
  estimateCode: string; // 견적번호

  // 기본 정보
  partnerId: string; // 거래처 ID
  partnerName: string; // 거래처명
  projectName: string; // 현장명
  estimatorId: string; // 견적자 ID
  estimatorName: string; // 견적자명
  estimateCompanyManager: string; // 견적 회사 담당자
  estimateCompanyManagerContact: string; // 견적 회사 담당자 연락처

  // 견적 정보
  itemCount: number; // 총 개소 (품목 수)
  estimateAmount: number; // 견적금액
  completedDate: string | null; // 견적완료일
  bidDate: string | null; // 입찰일

  // 상태 정보
  status: EstimateStatus; // 견적 상태

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

// 견적 통계
export interface EstimateStats {
  total: number; // 전체 견적
  pending: number; // 견적대기
  completed: number; // 견적완료
}

// 견적 필터
export interface EstimateFilter {
  search?: string;
  status?: EstimateStatus | 'all';
  partnerId?: string;
  estimatorId?: string;
  startDate?: string;
  endDate?: string;
  sortBy?: 'latest' | 'oldest' | 'amountAsc' | 'amountDesc' | 'bidDateDesc';
  page?: number;
  size?: number;
}

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

// 상태 옵션
export const ESTIMATE_STATUS_OPTIONS = [
  { value: 'all', label: '전체' },
  { value: 'pending', label: '견적대기' },
  { value: 'approval_waiting', label: '승인대기' },
  { value: 'completed', label: '견적완료' },
  { value: 'rejected', label: '반려' },
  { value: 'hold', label: '보류' },
];

// 정렬 옵션
export const ESTIMATE_SORT_OPTIONS = [
  { value: 'latest', label: '최신순' },
  { value: 'oldest', label: '등록순' },
  { value: 'bidDateDesc', label: '입찰일 최신순' },
  { value: 'partnerNameAsc', label: '거래처명 오름차순' },
  { value: 'partnerNameDesc', label: '거래처명 내림차순' },
  { value: 'projectNameAsc', label: '현장명 오름차순' },
  { value: 'projectNameDesc', label: '현장명 내림차순' },
];

// 상태별 스타일
export const STATUS_STYLES: Record<EstimateStatus, string> = {
  pending: 'text-orange-500 font-medium',
  approval_waiting: 'text-blue-500 font-medium',
  completed: 'text-gray-600',
  rejected: 'text-red-500 font-medium',
  hold: 'text-gray-400',
};

export const STATUS_LABELS: Record<EstimateStatus, string> = {
  pending: '견적대기',
  approval_waiting: '승인대기',
  completed: '견적완료',
  rejected: '반려',
  hold: '보류',
};
