"use client";

import { ComponentConfig } from "@/types/component";

/**
 * 줌 레벨 (시간 단위)
 */
export type ZoomLevel = "day" | "week" | "month";

/**
 * 스케줄 상태
 */
export type ScheduleStatus = "planned" | "in_progress" | "completed" | "delayed" | "cancelled";

/**
 * 스케줄 항목 (간트 바)
 */
export interface ScheduleItem {
  /** 고유 ID */
  id: string;

  /** 리소스 ID (설비/작업자) */
  resourceId: string;

  /** 표시 제목 */
  title: string;

  /** 시작 일시 (ISO 8601) */
  startDate: string;

  /** 종료 일시 (ISO 8601) */
  endDate: string;

  /** 상태 */
  status: ScheduleStatus;

  /** 진행률 (0-100) */
  progress?: number;

  /** 색상 (CSS color) */
  color?: string;

  /** 추가 데이터 */
  data?: Record<string, any>;
}

/**
 * 리소스 (행 - 설비/작업자)
 */
export interface Resource {
  /** 리소스 ID */
  id: string;

  /** 표시명 */
  name: string;

  /** 그룹 (선택) */
  group?: string;

  /** 아이콘 (선택) */
  icon?: string;

  /** 용량 (선택, 충돌 계산용) */
  capacity?: number;
}

/**
 * 필드 매핑 설정
 */
export interface FieldMapping {
  /** ID 필드 */
  id: string;
  /** 리소스 ID 필드 */
  resourceId: string;
  /** 제목 필드 */
  title: string;
  /** 시작일 필드 */
  startDate: string;
  /** 종료일 필드 */
  endDate: string;
  /** 상태 필드 (선택) */
  status?: string;
  /** 진행률 필드 (선택) */
  progress?: string;
  /** 색상 필드 (선택) */
  color?: string;
}

/**
 * 리소스 필드 매핑 설정
 */
export interface ResourceFieldMapping {
  /** ID 필드 */
  id: string;
  /** 이름 필드 */
  name: string;
  /** 그룹 필드 (선택) */
  group?: string;
}

/**
 * 스케줄 타입 (schedule_mng.schedule_type)
 */
export type ScheduleType =
  | "PRODUCTION" // 생산계획
  | "MAINTENANCE" // 정비계획
  | "SHIPPING" // 배차계획
  | "WORK_ASSIGN"; // 작업배정

/**
 * 소스 데이터 설정 (스케줄 생성 기준이 되는 원본 데이터)
 * 예: 수주 데이터, 작업 요청 등
 */
export interface SourceDataConfig {
  /** 소스 테이블명 (예: sales_order_mng) */
  tableName?: string;

  /** 기준일 필드 - 스케줄 종료일로 사용 (예: due_date, delivery_date) */
  dueDateField?: string;

  /** 수량 필드 (예: balance_qty, order_qty) */
  quantityField?: string;

  /** 그룹화 필드 - 품목/작업 단위 (예: part_code, item_code) */
  groupByField?: string;

  /** 그룹명 표시 필드 (예: part_name, item_name) */
  groupNameField?: string;
}

/**
 * 툴바 액션 설정 (커스텀 버튼)
 * 타임라인 툴바에 표시되는 커스텀 액션 버튼을 정의
 * preview -> confirm -> apply 워크플로우 지원
 */
export interface ToolbarAction {
  /** 고유 ID */
  id: string;
  /** 버튼 텍스트 */
  label: string;
  /** lucide-react 아이콘명 */
  icon?: "Zap" | "Package" | "Plus" | "Download" | "Upload" | "RefreshCw" | "Play" | "FileText" | "Send" | "Sparkles" | "Wand2";
  /** 버튼 색상 클래스 (예: "bg-emerald-600 hover:bg-emerald-700") */
  color?: string;
  /** 미리보기 API 엔드포인트 (예: "/production/generate-schedule/preview") */
  previewApi: string;
  /** 적용 API 엔드포인트 (예: "/production/generate-schedule") */
  applyApi: string;
  /** 다이얼로그 제목 */
  dialogTitle?: string;
  /** 다이얼로그 설명 */
  dialogDescription?: string;
  /**
   * 데이터 소스 유형
   * - linkedSelection: 연결 필터(좌측 테이블)에서 선택된 행 사용
   * - currentSchedules: 현재 타임라인의 스케줄 ID 사용
   */
  dataSource: "linkedSelection" | "currentSchedules";
  /** 페이로드 구성 설정 */
  payloadConfig?: {
    /** linkedSelection: 선택된 행을 그룹화할 필드 (기본: linkedFilter.sourceField) */
    groupByField?: string;
    /** linkedSelection: 수량 합계 필드 (예: "balance_qty") */
    quantityField?: string;
    /** linkedSelection: 기준일 필드 (예: "due_date") */
    dueDateField?: string;
    /** linkedSelection: 표시명 필드 (예: "part_name") */
    nameField?: string;
    /** currentSchedules: 스케줄 필터 조건 필드명 (예: "product_type") */
    scheduleFilterField?: string;
    /** currentSchedules: 스케줄 필터 값 (예: "완제품") */
    scheduleFilterValue?: string;
    /** API 호출 시 추가 옵션 (예: { "safety_lead_time": 1 }) */
    extraOptions?: Record<string, any>;
  };
  /**
   * 표시 조건: staticFilters와 비교하여 모든 조건이 일치할 때만 버튼 표시
   * 예: { "product_type": "완제품" } → staticFilters.product_type === "완제품"일 때만 표시
   */
  showWhen?: Record<string, string>;
}

/**
 * 타임라인 스케줄러 설정
 */
export interface TimelineSchedulerConfig extends ComponentConfig {
  /** 스케줄 타입 (필터링 기준) - schedule_mng.schedule_type */
  scheduleType?: ScheduleType;

  /** 스케줄 데이터 테이블명 (기본: schedule_mng, 커스텀 테이블 사용 시) */
  selectedTable?: string;

  /** 커스텀 테이블 사용 여부 (false면 schedule_mng 사용) */
  useCustomTable?: boolean;

  /** 커스텀 테이블명 */
  customTableName?: string;

  /** 정적 필터 조건 (커스텀 테이블에서 특정 조건으로 필터링) */
  staticFilters?: Record<string, string>;

  /** 리소스 테이블명 (설비/작업자) */
  resourceTable?: string;

  /** 소스 데이터 설정 (스케줄 자동 생성 시 참조) */
  sourceConfig?: SourceDataConfig;

  /** 스케줄 필드 매핑 */
  fieldMapping: FieldMapping;

  /** 리소스 필드 매핑 */
  resourceFieldMapping?: ResourceFieldMapping;

  /** 초기 줌 레벨 */
  defaultZoomLevel?: ZoomLevel;

  /** 초기 표시 날짜 (ISO 8601) */
  initialDate?: string;

  /** 편집 가능 여부 */
  editable?: boolean;

  /** 드래그 이동 가능 */
  draggable?: boolean;

  /** 리사이즈 가능 */
  resizable?: boolean;

  /** 행 높이 (px) */
  rowHeight?: number;

  /** 헤더 높이 (px) */
  headerHeight?: number;

  /** 리소스 컬럼 너비 (px) */
  resourceColumnWidth?: number;

  /** 셀 너비 (px, 줌 레벨별) */
  cellWidth?: {
    day?: number;
    week?: number;
    month?: number;
  };

  /** 충돌 표시 여부 */
  showConflicts?: boolean;

  /** 진행률 바 표시 여부 */
  showProgress?: boolean;

  /** 오늘 표시선 */
  showTodayLine?: boolean;

  /** 상태별 색상 */
  statusColors?: {
    planned?: string;
    in_progress?: string;
    completed?: string;
    delayed?: string;
    cancelled?: string;
  };

  /** 툴바 표시 여부 */
  showToolbar?: boolean;

  /** 줌 레벨 변경 버튼 표시 */
  showZoomControls?: boolean;

  /** 네비게이션 버튼 표시 */
  showNavigation?: boolean;

  /** 추가 버튼 표시 */
  showAddButton?: boolean;

  /** 높이 (px 또는 auto) */
  height?: number | string;

  /** 최대 높이 */
  maxHeight?: number | string;

  /**
   * 표시 모드
   * - "resource": 기존 설비(리소스) 기반 간트 차트 (기본값)
   * - "itemGrouped": 품목별 카드형 타임라인 (참고 이미지 스타일)
   */
  viewMode?: "resource" | "itemGrouped";

  /** 범례 표시 여부 */
  showLegend?: boolean;

  /**
   * 연결 필터 설정: 다른 컴포넌트의 선택에 따라 데이터를 필터링
   * 설정 시 초기 상태는 빈 화면, 선택 이벤트 수신 시 필터링된 데이터 표시
   */
  linkedFilter?: {
    /** 소스 컴포넌트 ID (선택 이벤트를 발생시키는 컴포넌트) */
    sourceComponentId?: string;
    /** 소스 테이블명 (이벤트의 tableName과 매칭) */
    sourceTableName?: string;
    /** 소스 필드 (선택된 행에서 추출할 필드) */
    sourceField: string;
    /** 타겟 필드 (타임라인 데이터에서 필터링할 필드) */
    targetField: string;
    /** 선택 없을 때 빈 상태 표시 여부 (기본: true) */
    showEmptyWhenNoSelection?: boolean;
    /** 빈 상태 메시지 */
    emptyMessage?: string;
  };

  /** 툴바 커스텀 액션 버튼 설정 */
  toolbarActions?: ToolbarAction[];
}

/**
 * 드래그 이벤트
 */
export interface DragEvent {
  /** 스케줄 ID */
  scheduleId: string;
  /** 새로운 시작일 */
  newStartDate: string;
  /** 새로운 종료일 */
  newEndDate: string;
  /** 새로운 리소스 ID (리소스 간 이동 시) */
  newResourceId?: string;
}

/**
 * 리사이즈 이벤트
 */
export interface ResizeEvent {
  /** 스케줄 ID */
  scheduleId: string;
  /** 새로운 시작일 */
  newStartDate: string;
  /** 새로운 종료일 */
  newEndDate: string;
  /** 리사이즈 방향 */
  direction: "start" | "end";
}

/**
 * 클릭 이벤트
 */
export interface ScheduleClickEvent {
  /** 스케줄 항목 */
  schedule: ScheduleItem;
  /** 리소스 */
  resource: Resource;
}

/**
 * 빈 셀 클릭 이벤트
 */
export interface CellClickEvent {
  /** 리소스 ID */
  resourceId: string;
  /** 날짜 */
  date: string;
}

/**
 * TimelineSchedulerComponent Props
 */
export interface TimelineSchedulerComponentProps {
  /** 컴포넌트 설정 */
  config: TimelineSchedulerConfig;

  /** 디자인 모드 여부 */
  isDesignMode?: boolean;

  /** 폼 데이터 */
  formData?: Record<string, any>;

  /** 외부 스케줄 데이터 */
  externalSchedules?: ScheduleItem[];

  /** 외부 리소스 데이터 */
  externalResources?: Resource[];

  /** 로딩 상태 */
  isLoading?: boolean;

  /** 에러 */
  error?: string;

  /** 컴포넌트 ID */
  componentId?: string;

  /** 드래그 완료 이벤트 */
  onDragEnd?: (event: DragEvent) => void;

  /** 리사이즈 완료 이벤트 */
  onResizeEnd?: (event: ResizeEvent) => void;

  /** 스케줄 클릭 이벤트 */
  onScheduleClick?: (event: ScheduleClickEvent) => void;

  /** 빈 셀 클릭 이벤트 */
  onCellClick?: (event: CellClickEvent) => void;

  /** 스케줄 추가 이벤트 */
  onAddSchedule?: (resourceId: string, date: string) => void;
}

/**
 * useTimelineData 훅 반환 타입
 */
export interface UseTimelineDataResult {
  /** 스케줄 목록 */
  schedules: ScheduleItem[];

  /** 리소스 목록 */
  resources: Resource[];

  /** 로딩 상태 */
  isLoading: boolean;

  /** 에러 */
  error: string | null;

  /** 현재 줌 레벨 */
  zoomLevel: ZoomLevel;

  /** 줌 레벨 변경 */
  setZoomLevel: (level: ZoomLevel) => void;

  /** 현재 표시 시작일 */
  viewStartDate: Date;

  /** 현재 표시 종료일 */
  viewEndDate: Date;

  /** 이전으로 이동 */
  goToPrevious: () => void;

  /** 다음으로 이동 */
  goToNext: () => void;

  /** 오늘로 이동 */
  goToToday: () => void;

  /** 특정 날짜로 이동 */
  goToDate: (date: Date) => void;

  /** 스케줄 업데이트 */
  updateSchedule: (id: string, updates: Partial<ScheduleItem>) => Promise<void>;

  /** 스케줄 추가 */
  addSchedule: (schedule: Omit<ScheduleItem, "id">) => Promise<void>;

  /** 스케줄 삭제 */
  deleteSchedule: (id: string) => Promise<void>;

  /** 데이터 새로고침 */
  refresh: () => void;
}

/**
 * 날짜 셀 정보
 */
export interface DateCell {
  /** 날짜 */
  date: Date;
  /** 표시 라벨 */
  label: string;
  /** 오늘 여부 */
  isToday: boolean;
  /** 주말 여부 */
  isWeekend: boolean;
  /** 월 첫째날 여부 */
  isMonthStart: boolean;
}

/**
 * 스케줄 바 위치 정보
 */
export interface ScheduleBarPosition {
  /** 왼쪽 오프셋 (px) */
  left: number;
  /** 너비 (px) */
  width: number;
  /** 상단 오프셋 (px) */
  top: number;
  /** 높이 (px) */
  height: number;
}
