/**
 * 발주관리 타입 정의
 */

/**
 * 발주 상태
 */
export type OrderStatus = 'waiting' | 'order_complete' | 'delivery_scheduled' | 'delivery_complete';

/**
 * 발주 구분 (타입)
 */
export type OrderType = 'steel_bar' | 'material' | 'outsourcing';

/**
 * 발주 데이터
 */
export interface Order {
  /** 발주 ID */
  id: string;
  /** 계약번호 */
  contractNumber: string;
  /** 거래처 ID */
  partnerId: string;
  /** 거래처명 */
  partnerName: string;
  /** 현장명 */
  siteName: string;
  /** 명칭 */
  name: string;
  /** 공사PM */
  constructionPM: string;
  /** 발주담당자 */
  orderManager: string;
  /** 발주번호 */
  orderNumber: string;
  /** 발주처명 */
  orderCompany: string;
  /** 작업반장 */
  workTeamLeader: string;
  /** 시공투입일 */
  constructionStartDate: string;
  /** 구분 (발주 타입) */
  orderType: OrderType;
  /** 품목 */
  item: string;
  /** 수량 */
  quantity: number;
  /** 발주일 */
  orderDate: string;
  /** 계획인수일 */
  plannedDeliveryDate: string;
  /** 실제 인수일 */
  actualDeliveryDate: string | null;
  /** 상태 */
  status: OrderStatus;
  /** 기간 (시작일) - 달력용 */
  periodStart: string;
  /** 기간 (종료일) - 달력용 */
  periodEnd: string;
  /** 생성일 */
  createdAt: string;
  /** 수정일 */
  updatedAt: string;
}

/**
 * 발주 통계
 */
export interface OrderStats {
  /** 전체 */
  total: number;
  /** 발주대기 */
  waiting: number;
  /** 발주완료 */
  orderComplete: number;
  /** 인수예정 */
  deliveryScheduled: number;
  /** 인수완료 */
  deliveryComplete: number;
}

/**
 * 발주 상태 옵션
 */
export const ORDER_STATUS_OPTIONS = [
  { value: 'all', label: '전체' },
  { value: 'waiting', label: '발주대기' },
  { value: 'order_complete', label: '발주완료' },
  { value: 'delivery_scheduled', label: '인수예정' },
  { value: 'delivery_complete', label: '인수완료' },
] as const;

/**
 * 발주 상태 라벨
 */
export const ORDER_STATUS_LABELS: Record<OrderStatus, string> = {
  waiting: '발주대기',
  order_complete: '발주완료',
  delivery_scheduled: '인수예정',
  delivery_complete: '인수완료',
};

/**
 * 발주 상태 스타일
 */
export const ORDER_STATUS_STYLES: Record<OrderStatus, string> = {
  waiting: 'bg-yellow-100 text-yellow-800',
  order_complete: 'bg-blue-100 text-blue-800',
  delivery_scheduled: 'bg-purple-100 text-purple-800',
  delivery_complete: 'bg-green-100 text-green-800',
};

/**
 * 발주 상태별 달력 색상 (레거시 - 상태 기반)
 */
export const ORDER_STATUS_CALENDAR_COLORS: Record<OrderStatus, string> = {
  waiting: 'yellow',
  order_complete: 'blue',
  delivery_scheduled: 'purple',
  delivery_complete: 'green',
};

/**
 * 스케줄 색상 팔레트 (10가지 고정 색상)
 * - 인덱스 기반 순환: 11번째 이벤트는 다시 1번 색상
 * - API 연동 시에도 동일하게 사용
 */
export const SCHEDULE_COLOR_PALETTE = [
  { name: 'blue', bg: 'bg-blue-500', text: 'text-white', hex: '#3b82f6' },
  { name: 'green', bg: 'bg-green-500', text: 'text-white', hex: '#22c55e' },
  { name: 'yellow', bg: 'bg-yellow-500', text: 'text-white', hex: '#eab308' },
  { name: 'red', bg: 'bg-red-500', text: 'text-white', hex: '#ef4444' },
  { name: 'purple', bg: 'bg-purple-500', text: 'text-white', hex: '#a855f7' },
  { name: 'pink', bg: 'bg-pink-500', text: 'text-white', hex: '#ec4899' },
  { name: 'orange', bg: 'bg-orange-500', text: 'text-white', hex: '#f97316' },
  { name: 'teal', bg: 'bg-teal-500', text: 'text-white', hex: '#14b8a6' },
  { name: 'indigo', bg: 'bg-indigo-500', text: 'text-white', hex: '#6366f1' },
  { name: 'cyan', bg: 'bg-cyan-500', text: 'text-white', hex: '#06b6d4' },
] as const;

/**
 * 인덱스 기반 스케줄 색상 반환 (순환)
 * @param index - 이벤트 인덱스 (0부터 시작)
 * @returns 색상 이름 (ScheduleCalendar에서 사용)
 */
export function getScheduleColor(index: number): string {
  return SCHEDULE_COLOR_PALETTE[index % SCHEDULE_COLOR_PALETTE.length].name;
}

/**
 * 담당자별 색상 매핑
 * - 같은 담당자는 항상 같은 색상
 * - MOCK_ORDER_MANAGERS 순서에 따라 색상 할당
 */
const ORDER_MANAGER_COLOR_MAP: Record<string, string> = {
  '김담당': 'blue',
  '이담당': 'green',
  '박담당': 'pink',
  '최담당': 'purple',
};

/**
 * 담당자 이름 기반 스케줄 색상 반환
 * - 매핑된 담당자: 고정 색상
 * - 매핑되지 않은 담당자: 이름 해시 기반 색상 (일관성 유지)
 * @param managerName - 발주담당자 이름
 * @returns 색상 이름 (ScheduleCalendar에서 사용)
 */
export function getScheduleColorByManager(managerName: string): string {
  // 매핑된 담당자면 고정 색상 반환
  if (ORDER_MANAGER_COLOR_MAP[managerName]) {
    return ORDER_MANAGER_COLOR_MAP[managerName];
  }

  // 매핑되지 않은 담당자: 이름 해시 기반으로 일관된 색상 할당
  let hash = 0;
  for (let i = 0; i < managerName.length; i++) {
    hash = managerName.charCodeAt(i) + ((hash << 5) - hash);
  }
  const index = Math.abs(hash) % SCHEDULE_COLOR_PALETTE.length;
  return SCHEDULE_COLOR_PALETTE[index].name;
}

/**
 * 발주 구분 (타입) 옵션
 */
export const ORDER_TYPE_OPTIONS: FilterOption[] = [
  { value: 'steel_bar', label: '강봉발주' },
  { value: 'material', label: '화자재발주' },
  { value: 'outsourcing', label: '외주발주' },
];

/**
 * 발주 구분 (타입) 라벨
 */
export const ORDER_TYPE_LABELS: Record<OrderType, string> = {
  steel_bar: '강봉발주',
  material: '화자재발주',
  outsourcing: '외주발주',
};

/**
 * 정렬 옵션
 */
export const ORDER_SORT_OPTIONS = [
  { value: 'latest', label: '최신순' },
  { value: 'oldest', label: '오래된순' },
  { value: 'partnerNameAsc', label: '거래처명 ↑' },
  { value: 'partnerNameDesc', label: '거래처명 ↓' },
  { value: 'siteNameAsc', label: '현장명 ↑' },
  { value: 'siteNameDesc', label: '현장명 ↓' },
  { value: 'deliveryDateAsc', label: '인수일 ↑' },
  { value: 'deliveryDateDesc', label: '인수일 ↓' },
] as const;

/**
 * 필터 옵션 공통 타입
 */
export interface FilterOption {
  value: string;
  label: string;
}

/**
 * 목업 거래처 목록 (검색&다중선택 지원)
 * - '전체' 옵션은 MultiSelectCombobox에서 자동 제공
 */
export const MOCK_PARTNERS: FilterOption[] = [
  { value: '1', label: '(주)대한건설' },
  { value: '2', label: '삼성물산' },
  { value: '3', label: '현대건설' },
  { value: '4', label: 'GS건설' },
  { value: '5', label: '대림산업' },
];

/**
 * 목업 현장 목록 (검색&다중선택 지원)
 * - '전체' 옵션은 MultiSelectCombobox에서 자동 제공
 */
export const MOCK_SITES: FilterOption[] = [
  { value: '1', label: '강남 오피스빌딩 신축' },
  { value: '2', label: '판교 데이터센터' },
  { value: '3', label: '송도 물류센터' },
  { value: '4', label: '인천공항 터미널' },
  { value: '5', label: '부산항 창고' },
];

/**
 * 목업 공사PM 목록 (검색&다중선택 지원)
 */
export const MOCK_CONSTRUCTION_PM: FilterOption[] = [
  { value: '1', label: '홍길동' },
  { value: '2', label: '김철수' },
  { value: '3', label: '이영희' },
  { value: '4', label: '박민수' },
];

/**
 * 목업 발주담당자 목록 (검색&다중선택 지원)
 */
export const MOCK_ORDER_MANAGERS: FilterOption[] = [
  { value: '1', label: '김담당' },
  { value: '2', label: '이담당' },
  { value: '3', label: '박담당' },
  { value: '4', label: '최담당' },
];

/**
 * 목업 발주처 목록 (검색&다중선택 지원)
 */
export const MOCK_ORDER_COMPANIES: FilterOption[] = [
  { value: '1', label: 'A건설' },
  { value: '2', label: 'B철강' },
  { value: '3', label: 'C자재' },
  { value: '4', label: 'D산업' },
];

/**
 * 목업 작업반장 목록 (검색&다중선택 지원)
 * - '전체' 옵션은 MultiSelectCombobox에서 자동 제공
 */
export const MOCK_WORK_TEAM_LEADERS: FilterOption[] = [
  { value: '1', label: '이반장' },
  { value: '2', label: '김반장' },
  { value: '3', label: '박반장' },
  { value: '4', label: '최반장' },
];

// ============================================
// 발주 상세 관련 타입 및 상수
// ============================================

/**
 * 발주 상세 아이템 (발주 품목) - 테이블 로우
 */
export interface OrderDetailItem {
  id: string;
  /** 작업반장 */
  workTeamLeader: string;
  /** 시공투입일 */
  constructionStartDate: string;
  /** 시공완료일 */
  constructionEndDate: string;
  /** 명칭 */
  name: string;
  /** 제품 */
  product: string;
  /** 가로 */
  width: number;
  /** 세로 */
  height: number;
  /** 항목명 (품목관리에서 가져옴) */
  itemName: string;
  /** 수량 */
  quantity: number;
  /** 단위 */
  unit: string;
  /** 비고 */
  remark: string;
  /** 이미지 URL */
  imageUrl: string;
  /** 발주일 */
  orderDate: string;
  /** 계획 인수일 */
  plannedDeliveryDate: string;
  /** 실제 인수일 */
  actualDeliveryDate: string;
  /** 상태 */
  status: OrderStatus;
}

/**
 * 발주 상세 카테고리 섹션
 * - 카테고리별로 테이블 섹션을 관리
 */
export interface OrderDetailCategory {
  id: string;
  /** 카테고리 ID */
  categoryId: string;
  /** 카테고리명 */
  categoryName: string;
  /** 해당 카테고리의 발주 품목 목록 */
  items: OrderDetailItem[];
}

/**
 * 발주 상세 데이터
 */
export interface OrderDetail extends Order {
  /** 발주처 ID */
  orderCompanyId: string;
  /** 화물도착지 타입 */
  deliveryLocationType: 'site' | 'warehouse' | 'direct';
  /** 화물도착지 주소 */
  deliveryAddress: string;
  /** 계약 ID */
  contractId: string;
  /** 공사PM ID */
  constructionPMId: string;
  /** 공사담당자 목록 */
  constructionManagers: string[];
  /** 발주 상세 품목 목록 */
  orderItems: OrderDetailItem[];
  /** 비고 */
  memo: string;
  /** 발주 스케줄 이벤트 (달력용) */
  scheduleEvents: OrderScheduleEvent[];
  /** 총 금액 */
  totalAmount?: number;
  /** 공급가액 */
  supplyAmount?: number;
  /** 세액 */
  taxAmount?: number;
  /** 카테고리별 품목 목록 */
  categories?: OrderDetailCategory[];
}

/**
 * 발주 스케줄 이벤트 (달력용)
 */
export interface OrderScheduleEvent {
  id: string;
  title: string;
  startDate: string;
  endDate: string;
  orderType: OrderType;
  color: string;
}

/**
 * 발주 상세 폼 데이터
 */
export interface OrderDetailFormData {
  /** 발주번호 */
  orderNumber: string;
  /** 발주처 ID */
  orderCompanyId: string;
  /** 구분 (발주 타입) */
  orderType: OrderType;
  /** 상태 */
  status: OrderStatus;
  /** 발주담당자 */
  orderManager: string;
  /** 화물도착지 주소 */
  deliveryAddress: string;
  /** 거래처 ID */
  partnerId: string;
  /** 거래처명 */
  partnerName: string;
  /** 현장명 */
  siteName: string;
  /** 계약번호 */
  contractNumber: string;
  /** 계약 ID */
  contractId: string;
  /** 공사PM ID */
  constructionPMId: string;
  /** 공사PM 이름 */
  constructionPM: string;
  /** 공사담당자 목록 */
  constructionManagers: string[];
  /** 작업반장 */
  workTeamLeader: string;
  /** 시공투입일 (필수) */
  constructionStartDate: string;
  /** 시공완료일 */
  constructionEndDate: string;
  /** 발주 상세 카테고리 목록 */
  orderCategories: OrderDetailCategory[];
  /** 비고 */
  memo: string;
  /** 기간 (시작일) */
  periodStart: string;
  /** 기간 (종료일) */
  periodEnd: string;
}

/**
 * 화물도착지 타입 옵션
 */
export const DELIVERY_LOCATION_TYPE_OPTIONS: FilterOption[] = [
  { value: 'site', label: '현장' },
  { value: 'warehouse', label: '창고' },
  { value: 'direct', label: '직배송' },
];

/**
 * 화물도착지 타입 라벨
 */
export const DELIVERY_LOCATION_TYPE_LABELS: Record<'site' | 'warehouse' | 'direct', string> = {
  site: '현장',
  warehouse: '창고',
  direct: '직배송',
};

/**
 * 목업 카테고리 목록
 */
export const MOCK_CATEGORIES: FilterOption[] = [
  { value: '1', label: '강봉' },
  { value: '2', label: '화자재' },
  { value: '3', label: '외주' },
  { value: '4', label: '철근' },
  { value: '5', label: '콘크리트' },
];

/**
 * 목업 항목명 목록 (품목관리에서 가져오는 데이터)
 */
export const MOCK_ITEM_NAMES: FilterOption[] = [
  { value: '1', label: '이형봉강 SD400 D16' },
  { value: '2', label: '이형봉강 SD400 D19' },
  { value: '3', label: '원형봉강 SR235' },
  { value: '4', label: '콘크리트 25-21-150' },
  { value: '5', label: '철근 가공품' },
];

/**
 * 빈 발주 상세 품목 생성
 */
export function getEmptyOrderDetailItem(): OrderDetailItem {
  return {
    id: String(Date.now()),
    workTeamLeader: '',
    constructionStartDate: '',
    constructionEndDate: '',
    name: '',
    product: '',
    width: 0,
    height: 0,
    itemName: '',
    quantity: 0,
    unit: '',
    remark: '',
    imageUrl: '',
    orderDate: '',
    plannedDeliveryDate: '',
    actualDeliveryDate: '',
    status: 'waiting',
  };
}

/**
 * 빈 발주 상세 카테고리 생성
 */
export function getEmptyOrderDetailCategory(): OrderDetailCategory {
  return {
    id: String(Date.now()),
    categoryId: '',
    categoryName: '',
    items: [],
  };
}

/**
 * 빈 발주 상세 폼 데이터 생성
 */
export function getEmptyOrderDetailFormData(): OrderDetailFormData {
  return {
    orderNumber: '',
    orderCompanyId: '',
    orderType: 'steel_bar',
    status: 'waiting',
    orderManager: '',
    deliveryAddress: '',
    partnerId: '',
    partnerName: '',
    siteName: '',
    contractNumber: '',
    contractId: '',
    constructionPMId: '',
    constructionPM: '',
    constructionManagers: [],
    workTeamLeader: '',
    constructionStartDate: '',
    constructionEndDate: '',
    orderCategories: [],
    memo: '',
    periodStart: '',
    periodEnd: '',
  };
}

/**
 * OrderDetail을 폼 데이터로 변환
 */
export function orderDetailToFormData(detail: OrderDetail): OrderDetailFormData {
  // orderItems를 카테고리별로 그룹핑
  const categoryMap = new Map<string, OrderDetailCategory>();

  // orderItems가 없거나 undefined일 경우 빈 배열로 처리
  const orderItems = detail.orderItems || [];
  orderItems.forEach((item) => {
    // 임시로 'default' 카테고리 사용 (실제로는 item에 categoryId가 있어야 함)
    const categoryId = 'default';
    const categoryName = '기본 카테고리';

    if (!categoryMap.has(categoryId)) {
      categoryMap.set(categoryId, {
        id: categoryId,
        categoryId,
        categoryName,
        items: [],
      });
    }
    categoryMap.get(categoryId)!.items.push(item);
  });

  return {
    orderNumber: detail.orderNumber || '',
    orderCompanyId: detail.orderCompanyId || '',
    orderType: detail.orderType || 'steel_bar',
    status: detail.status || 'waiting',
    orderManager: detail.orderManager || '',
    deliveryAddress: detail.deliveryAddress || '',
    partnerId: detail.partnerId || '',
    partnerName: detail.partnerName || '',
    siteName: detail.siteName || '',
    contractNumber: detail.contractNumber || '',
    contractId: detail.contractId || '',
    constructionPMId: detail.constructionPMId || '',
    constructionPM: detail.constructionPM || '',
    constructionManagers: detail.constructionManagers || [],
    workTeamLeader: detail.workTeamLeader || '',
    constructionStartDate: detail.constructionStartDate || '',
    constructionEndDate: '', // Order 인터페이스에는 없으므로 빈 값
    orderCategories: Array.from(categoryMap.values()),
    memo: detail.memo || '',
    periodStart: detail.periodStart || '',
    periodEnd: detail.periodEnd || '',
  };
}

/**
 * 목업 발주 상세 데이터
 */
export const MOCK_ORDER_DETAIL: OrderDetail = {
  id: '1',
  contractNumber: 'CT-2025-001',
  partnerId: '1',
  partnerName: '(주)대한건설',
  siteName: '강남 오피스빌딩 신축',
  name: '강봉 발주',
  constructionPM: '홍길동',
  orderManager: '김담당',
  orderNumber: 'ORD-2025-001',
  orderCompany: 'A건설',
  workTeamLeader: '이반장',
  constructionStartDate: '2025-01-15',
  orderType: 'steel_bar',
  item: '강봉',
  quantity: 100,
  orderDate: '2025-01-10',
  plannedDeliveryDate: '2025-01-20',
  actualDeliveryDate: null,
  status: 'order_complete',
  periodStart: '2025-01-10',
  periodEnd: '2025-01-20',
  createdAt: '2025-01-10T09:00:00Z',
  updatedAt: '2025-01-10T09:00:00Z',
  orderCompanyId: '1',
  deliveryLocationType: 'site',
  deliveryAddress: '서울시 강남구 테헤란로 123',
  contractId: '1',
  constructionPMId: '1',
  constructionManagers: ['홍길동', '김철수', '이영희'],
  orderItems: [
    // 카테고리 1: 이미지 없음 → 일반 테이블 레이아웃
    {
      id: '1',
      workTeamLeader: '이반장',
      constructionStartDate: '2025-01-15',
      constructionEndDate: '2025-01-20',
      name: '카테고리명',
      product: '제품명',
      width: 300,
      height: 500,
      itemName: 'FSSB01(주차장)',
      quantity: 1,
      unit: 'EA',
      remark: '',
      imageUrl: '',
      orderDate: '2025-01-10',
      plannedDeliveryDate: '2025-01-18',
      actualDeliveryDate: '',
      status: 'order_complete',
    },
    {
      id: '2',
      workTeamLeader: '김반장',
      constructionStartDate: '2025-01-16',
      constructionEndDate: '2025-01-22',
      name: '카테고리명',
      product: '제품명',
      width: 300,
      height: 500,
      itemName: 'FSSB01(주차장)',
      quantity: 1,
      unit: 'EA',
      remark: '',
      imageUrl: '',
      orderDate: '2025-01-12',
      plannedDeliveryDate: '2025-01-20',
      actualDeliveryDate: '',
      status: 'waiting',
    },
    // 카테고리 2: 이미지 있음 → 2열 레이아웃
    {
      id: '3',
      workTeamLeader: '이반장',
      constructionStartDate: '2025-01-15',
      constructionEndDate: '2025-01-20',
      name: '카테고리명2',
      product: '제품명',
      width: 300,
      height: 500,
      itemName: 'FSSB01(주차장)',
      quantity: 1,
      unit: 'EA',
      remark: '',
      imageUrl: 'https://placehold.co/400x300/e2e8f0/64748b?text=IMG',
      orderDate: '2025-01-10',
      plannedDeliveryDate: '2025-01-18',
      actualDeliveryDate: '',
      status: 'order_complete',
    },
    {
      id: '4',
      workTeamLeader: '김반장',
      constructionStartDate: '2025-01-16',
      constructionEndDate: '2025-01-22',
      name: '카테고리명2',
      product: '제품명',
      width: 300,
      height: 500,
      itemName: 'FSSB01(주차장)',
      quantity: 1,
      unit: 'EA',
      remark: '',
      imageUrl: 'https://placehold.co/400x300/e2e8f0/64748b?text=IMG',
      orderDate: '2025-01-12',
      plannedDeliveryDate: '2025-01-20',
      actualDeliveryDate: '',
      status: 'waiting',
    },
  ],
  memo: '내용',
  scheduleEvents: [
    {
      id: '1',
      title: '홍길동 - 현장명 / 발주번호',
      startDate: '2026-01-05',
      endDate: '2026-01-09',
      orderType: 'steel_bar',
      color: 'blue',
    },
    {
      id: '2',
      title: '홍길동 - 현장명 / 발주번호',
      startDate: '2026-01-05',
      endDate: '2026-01-07',
      orderType: 'material',
      color: 'blue',
    },
    {
      id: '3',
      title: '홍길동 - 현장명 / 발주번호',
      startDate: '2026-01-06',
      endDate: '2026-01-16',
      orderType: 'outsourcing',
      color: 'blue',
    },
    {
      id: '4',
      title: '홍길동 - 현장명 / 발주번호',
      startDate: '2026-01-07',
      endDate: '2026-01-18',
      orderType: 'steel_bar',
      color: 'blue',
    },
  ],
};