import React from 'react';
/**
 * Size variants for the Calendar component
 */
export type CalendarSize = 'sm' | 'md' | 'lg';
/**
 * Selection mode for Calendar
 */
export type CalendarMode = 'single' | 'range';
/**
 * Header display mode for Calendar
 * - 'dropdown': Show month and year as dropdowns (interactive)
 * - 'static': Show month and year as static text (e.g., "October 2025")
 * - 'mixed': Use enableMonthDropdown and enableYearDropdown for custom control
 */
export type CalendarHeaderMode = 'dropdown' | 'static' | 'mixed';
/**
 * Date range type for range selection
 */
export interface DateRange {
    start: Date | null;
    end: Date | null;
}
/**
 * Calendar component props
 * @property {Date | DateRange} value - The selected date or range (controlled mode)
 * @property {Date | DateRange} defaultValue - Default selected date or range (uncontrolled mode)
 * @property {function} onChange - Callback when date/range is selected
 * @property {CalendarMode} mode - Selection mode (single or range)
 * @property {Date} minDate - Minimum selectable date
 * @property {Date} maxDate - Maximum selectable date
 * @property {function} isDateDisabled - Function to determine if a date should be disabled
 * @property {boolean} showToday - Whether to highlight today's date
 * @property {boolean} selectTodayByDefault - Auto-select today's date when no value is provided (default: false)
 * @property {string[]} weekdays - Custom weekday labels
 * @property {string[]} months - Custom month names
 * @property {CalendarSize} size - Size variant
 * @property {boolean} enableMonthDropdown - Whether to show month dropdown (default: true)
 * @property {boolean} enableYearDropdown - Whether to show year dropdown (default: true)
 * @property {object} yearRange - Range of years to show in dropdown
 */
export interface CalendarProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue'> {
    /** Selection mode - single date or date range */
    mode?: CalendarMode;
    /** The selected date or range (controlled mode) */
    value?: Date | DateRange;
    /** Default selected date or range (uncontrolled mode) */
    defaultValue?: Date | DateRange;
    /** Callback fired when a date or range is selected */
    onChange?: (value: Date | DateRange) => void;
    /** Minimum selectable date */
    minDate?: Date;
    /** Maximum selectable date */
    maxDate?: Date;
    /** Function to determine if a specific date should be disabled */
    isDateDisabled?: (date: Date) => boolean;
    /** Whether to highlight today's date (default: true) */
    showToday?: boolean;
    /** Auto-select today's date when calendar opens without a value (default: false) */
    selectTodayByDefault?: boolean;
    /** Custom weekday labels (default: ['M', 'T', 'W', 'T', 'F', 'S', 'S']) */
    weekdays?: string[];
    /** Custom month names */
    months?: string[];
    /** Size variant */
    size?: CalendarSize;
    /** Header display mode - dropdown (default), static text, or mixed (default: 'dropdown') */
    headerMode?: CalendarHeaderMode;
    /** Whether to enable month dropdown instead of navigation arrows (default: true) */
    enableMonthDropdown?: boolean;
    /** Whether to enable year dropdown instead of navigation arrows (default: true) */
    enableYearDropdown?: boolean;
    /** Year range for dropdown selection (default: 100 years past to 10 years future from current year) */
    yearRange?: {
        start: number;
        end: number;
    };
    /** External control of displayed month/year (for dual calendar mode) */
    viewDate?: Date;
    /** Callback when view date changes (from dropdowns or navigation) */
    onViewDateChange?: (date: Date) => void;
    /** Custom prev navigation handler (null to hide left arrow) */
    onNavigatePrev?: (() => void) | null;
    /** Custom next navigation handler (null to hide right arrow) */
    onNavigateNext?: (() => void) | null;
    /** Whether to show days from adjacent months (default: true) */
    showOtherMonthDays?: boolean;
    /** Additional class name for the container */
    className?: string;
}
/**
 * Internal day object used by the Calendar
 */
export interface CalendarDay {
    /** The date object */
    date: Date;
    /** Whether this day belongs to the current month */
    isCurrentMonth: boolean;
    /** Whether this day is today */
    isToday: boolean;
    /** Whether this day is selected */
    isSelected: boolean;
    /** Whether this day is the range start */
    isRangeStart?: boolean;
    /** Whether this day is the range end */
    isRangeEnd?: boolean;
    /** Whether this day is within a selected range */
    isInRange?: boolean;
    /** Whether this day is disabled */
    isDisabled: boolean;
}
/**
 * Theme interface for Calendar component (flat structure)
 */
export interface CalendarTheme {
    baseStyle: string;
    headerStyle: string;
    titleStyle: string;
    headerDropdownsStyle: string;
    navButtonStyle: string;
    weekdaysStyle: string;
    weekdayStyle: string;
    daysGridStyle: string;
    rangeCellStyle: string;
    dayButtonStyle: string;
    dayButtonSizes?: Record<CalendarSize, string>;
}
