/**
 * ScheduleCalendar 공통 컴포넌트 타입 정의
 */

/**
 * 달력 뷰 모드
 */
export type CalendarView = 'day-time' | 'week' | 'month' | 'week-time';

/**
 * 일정 이벤트
 */
export interface ScheduleEvent {
  /** 이벤트 고유 ID */
  id: string;
  /** 이벤트 제목 (예: "담당자 - 현장명 / 발주번호") */
  title: string;
  /** 시작 날짜 (yyyy-MM-dd 형식) */
  startDate: string;
  /** 종료 날짜 (yyyy-MM-dd 형식) */
  endDate: string;
  /** 이벤트 색상 (기본 색상명 또는 커스텀) */
  color?: string;
  /** 이벤트 상태 */
  status?: string;
  /** 시작 시간 (HH:mm 형식, week-time 뷰용) */
  startTime?: string;
  /** 종료 시간 (HH:mm 형식, week-time 뷰용) */
  endTime?: string;
  /** 추가 데이터 */
  data?: unknown;
}

/**
 * 일자별 뱃지 정보
 */
export interface DayBadge {
  /** 날짜 (yyyy-MM-dd 형식) */
  date: string;
  /** 뱃지에 표시할 숫자 */
  count: number;
  /** 뱃지 색상 */
  color?: 'red' | 'blue' | 'yellow' | 'green' | 'gray';
}

/**
 * 달력 Props
 */
export interface ScheduleCalendarProps {
  /** 일정 이벤트 목록 */
  events: ScheduleEvent[];
  /** 일자별 뱃지 목록 */
  badges?: DayBadge[];
  /** 현재 년월 (Date 객체) */
  currentDate?: Date;
  /** 현재 뷰 모드 */
  view?: CalendarView;
  /** 선택된 날짜 */
  selectedDate?: Date | null;
  /** 날짜 클릭 핸들러 */
  onDateClick?: (date: Date) => void;
  /** 이벤트 클릭 핸들러 */
  onEventClick?: (event: ScheduleEvent) => void;
  /** 월 변경 핸들러 */
  onMonthChange?: (date: Date) => void;
  /** 뷰 모드 변경 핸들러 */
  onViewChange?: (view: CalendarView) => void;
  /** 타이틀 영역 (년월 네비게이션 왼쪽) */
  titleSlot?: React.ReactNode;
  /** 필터 영역 (slot) */
  filterSlot?: React.ReactNode;
  /** 최대 표시 이벤트 수 (초과 시 +N 표시) */
  maxEventsPerDay?: number;
  /** 주 시작 요일 (0: 일요일, 1: 월요일) */
  weekStartsOn?: 0 | 1;
  /** 로딩 상태 */
  isLoading?: boolean;
  /** 추가 클래스 */
  className?: string;
  /** 사용 가능한 뷰 목록 (기본: 주/월) */
  availableViews?: { value: CalendarView; label: string }[];
  /** 시간축 뷰 시간 범위 (기본: 1~12) */
  timeRange?: { start: number; end: number };
  /** 헤더 네비게이션(◀ ▶) 숨김 (연간 달력처럼 상위에서 제어할 때) */
  hideNavigation?: boolean;
}

/**
 * 캘린더 헤더 Props
 */
export interface CalendarHeaderProps {
  currentDate: Date;
  view: CalendarView;
  onPrevMonth: () => void;
  onNextMonth: () => void;
  onViewChange: (view: CalendarView) => void;
  /** 타이틀 영역 (년월 네비게이션 왼쪽) */
  titleSlot?: React.ReactNode;
  filterSlot?: React.ReactNode;
  /** 사용 가능한 뷰 목록 (기본: [{value:'week',label:'주'},{value:'month',label:'월'}]) */
  availableViews?: { value: CalendarView; label: string }[];
  /** 네비게이션(◀ ▶) 숨김 */
  hideNavigation?: boolean;
}

/**
 * 일자 셀 Props
 */
export interface DayCellProps {
  date: Date;
  isCurrentMonth: boolean;
  isToday: boolean;
  isSelected: boolean;
  badge?: DayBadge;
  events: ScheduleEvent[];
  maxEvents: number;
  onClick: (date: Date) => void;
  onEventClick: (event: ScheduleEvent) => void;
}

/**
 * 일정 바 Props
 */
export interface ScheduleBarProps {
  event: ScheduleEvent;
  /** 현재 주에서 시작하는지 */
  isStart: boolean;
  /** 현재 주에서 끝나는지 */
  isEnd: boolean;
  /** 차지하는 컬럼 수 (1-7) */
  colSpan: number;
  /** 시작 위치 (0-6) */
  startCol: number;
  /** 행 인덱스 (겹치는 이벤트 처리) */
  rowIndex: number;
  onClick: (event: ScheduleEvent) => void;
}

/**
 * 더보기 팝오버 Props
 */
export interface MorePopoverProps {
  date: Date;
  events: ScheduleEvent[];
  count: number;
  onEventClick: (event: ScheduleEvent) => void;
}

/**
 * 월간 뷰 Props
 */
export interface MonthViewProps {
  currentDate: Date;
  events: ScheduleEvent[];
  badges: DayBadge[];
  selectedDate: Date | null;
  maxEventsPerDay: number;
  weekStartsOn: 0 | 1;
  onDateClick: (date: Date) => void;
  onEventClick: (event: ScheduleEvent) => void;
}

/**
 * 시간축 주간 뷰 Props (week-time)
 */
export interface WeekTimeViewProps {
  currentDate: Date;
  events: ScheduleEvent[];
  selectedDate: Date | null;
  weekStartsOn: 0 | 1;
  /** 표시할 시간 범위 (기본: 1~12) */
  timeRange?: { start: number; end: number };
  onDateClick: (date: Date) => void;
  onEventClick: (event: ScheduleEvent) => void;
}

/**
 * 일간 시간축 뷰 Props (day-time)
 */
export interface DayTimeViewProps {
  currentDate: Date;
  events: ScheduleEvent[];
  selectedDate: Date | null;
  /** 표시할 시간 범위 (기본: 1~12) */
  timeRange?: { start: number; end: number };
  onDateClick: (date: Date) => void;
  onEventClick: (event: ScheduleEvent) => void;
}

/**
 * 주간 뷰 Props
 */
export interface WeekViewProps {
  currentDate: Date;
  events: ScheduleEvent[];
  badges: DayBadge[];
  selectedDate: Date | null;
  maxEventsPerDay: number;
  weekStartsOn: 0 | 1;
  onDateClick: (date: Date) => void;
  onEventClick: (event: ScheduleEvent) => void;
}

/**
 * 이벤트 색상 매핑 (10가지 색상 + gray)
 * - 순환 색상: blue, green, yellow, red, purple, pink, orange, teal, indigo, cyan
 */
export const EVENT_COLORS: Record<string, string> = {
  gray: 'bg-gray-400 text-white',
  blue: 'bg-blue-500 text-white',
  green: 'bg-green-500 text-white',
  yellow: 'bg-yellow-500 text-white',
  red: 'bg-red-500 text-white',
  purple: 'bg-purple-500 text-white',
  pink: 'bg-pink-500 text-white',
  orange: 'bg-orange-500 text-white',
  teal: 'bg-teal-500 text-white',
  indigo: 'bg-indigo-500 text-white',
  cyan: 'bg-cyan-500 text-white',
};

/**
 * 뱃지 색상 매핑
 */
export const BADGE_COLORS: Record<string, string> = {
  red: 'bg-red-500 text-white',
  blue: 'bg-blue-500 text-white',
  yellow: 'bg-yellow-500 text-white',
  green: 'bg-green-500 text-white',
  gray: 'bg-gray-500 text-white',
};
