export type KviewTableCellType =
    | 'text'
    | 'entity'
    | 'link'
    | 'status'
    | 'date'
    | 'amount'
    | 'currency'
    | 'number'
    | 'scaled-number'
    | 'scaled_number'
    | 'percentage'
    | 'percent'
    | 'multiple'
    | 'boolean'
    | 'checkbox'
    | 'tag'
    | 'multiselect'
    | 'quarter'
    | 'year'
    | 'label'
    | 'sparkline';

export type KviewTableAlignment = 'start' | 'center' | 'end';

export interface KviewDetailTableColumn {
    key: string;
    label?: string | null;
    type?: KviewTableCellType;
    alignment?: KviewTableAlignment;
    align?: KviewTableAlignment;
    numeric?: boolean;
    nowrap?: boolean;
    width?: string | number | null;
    minWidth?: string | number | null;
    variant?: string | null;
    semantic?: string | null;
}

export interface KviewTableTagValue {
    value?: string | number | null;
    label?: string | number | null;
    variant?: string | null;
}

export interface KviewTableCellValue {
    type?: KviewTableCellType;
    value?: unknown;
    label?: string | number | null;
    formatted?: string | number | null;
    url?: string | null;
    inertia?: boolean;
    variant?: string | null;
    semantic?: string | null;
    alignment?: KviewTableAlignment;
    align?: KviewTableAlignment;
    title?: string | null;
    ariaLabel?: string | null;
}

export type KviewTableCellInput =
    | KviewTableCellValue
    | string
    | number
    | boolean
    | null
    | undefined
    | KviewTableTagValue[]
    | number[];

export interface KviewPreviewBadge {
    label: string;
    variant?: 'default' | 'primary' | 'accent' | 'success' | 'warning' | 'danger' | 'muted';
}

export interface KviewPreviewMetric {
    label: string;
    value: string;
    meta?: string | null;
}

export interface KviewPreviewField {
    label: string;
    value: string;
}

export interface KviewPreviewPayload {
    title: string;
    eyebrow?: string | null;
    subtitle?: string | null;
    icon?: string | null;
    summary?: string | null;
    badges?: KviewPreviewBadge[];
    metrics?: KviewPreviewMetric[];
    fields?: KviewPreviewField[];
    url?: string | null;
    inertia?: boolean;
}

export type KviewRowActionType = 'view' | 'edit' | 'delete' | 'preview' | 'link' | 'action';

export interface KviewRowAction {
    id?: string | null;
    type?: KviewRowActionType;
    label: string;
    icon?: string | null;
    url?: string | null;
    inertia?: boolean;
    variant?: 'primary' | 'secondary' | 'ghost' | 'danger';
    tooltip?: 'auto' | boolean | string;
    disabled?: boolean;
    confirm?: string | null;
    confirmTitle?: string | null;
    confirmLabel?: string | null;
    preview?: KviewPreviewPayload | null;
    onAction?: (action: KviewRowAction, event: MouseEvent) => void;
}

export interface KviewDetailTableRow {
    id: string | number;
    href?: string | null;
    inertia?: boolean;
    cells: Record<string, KviewTableCellInput>;
    actions?: KviewRowAction[];
}

export interface KviewPivotTableColumn extends KviewDetailTableColumn {
    /** Adds a stronger visual divider before a logical measure family. */
    dividerBefore?: boolean;
    /** Enables the package-owned in-group sort button for this column. */
    sortable?: boolean;
}

export interface KviewPivotTableSummary {
    label?: string | null;
    /** Number of leading columns occupied by the summary label. */
    labelColumnSpan?: number;
    cells: Record<string, KviewTableCellInput>;
}

export interface KviewPivotTableGroup {
    id: string | number;
    label: string;
    meta?: string | null;
    /** Canonical values used when a sortable column represents the group key. */
    sortValues?: Record<string, string | number | null>;
    rows: KviewDetailTableRow[];
    summary?: KviewPivotTableSummary | null;
    collapsible?: boolean;
    defaultExpanded?: boolean;
}

/**
 * Controls where a group's aggregate is rendered.
 *
 * `adaptive` keeps the aggregate in the collapsed group heading, then moves it
 * after the detail rows while the group is expanded.
 */
export type KviewPivotTableSummaryPosition = 'group-header' | 'group-footer' | 'adaptive';

export interface KviewPivotTableSort {
    key: string;
    direction: KviewSortDirection;
}

export type KviewRowActivateHandler = (
    row: KviewDetailTableRow,
    event: MouseEvent | KeyboardEvent,
) => void;

export type KviewSortDirection = 'asc' | 'desc';

export interface KviewCrudTableSort {
    key: string | null;
    direction: KviewSortDirection | null;
}

export interface KviewCrudTableFilterOption {
    value: string | number;
    label: string | number;
    disabled?: boolean;
}

export type KviewCrudTableFilterOptions =
    | Record<string, string | number>
    | Array<KviewCrudTableFilterOption | string | number>;

export interface KviewCrudTableColumnFilter {
    type?: 'text' | 'number' | 'date' | 'select' | 'multiselect' | string;
    placeholder?: string;
    options?: KviewCrudTableFilterOptions;
}

/**
 * Server-normalized crud-table column. Produced by the PHP
 * TableColumnRegistry; the Vue engine never re-derives these rules.
 */
export interface KviewCrudTableColumn extends KviewDetailTableColumn {
    label: string;
    type: KviewTableCellType;
    alignment: KviewTableAlignment;
    hidden: boolean;
    sortable: boolean;
    filterable: boolean;
    resizable: boolean;
    hideable: boolean;
    numeric: boolean;
    nowrap: boolean;
    filter?: KviewCrudTableColumnFilter | false;
    formatter?: Record<string, unknown>;
}

export type KviewCrudTableRow = KviewDetailTableRow;

export interface KviewCrudTablePaginationLink {
    url: string | null;
    label: string;
    active: boolean;
}

export interface KviewCrudTablePagination {
    page: number;
    perPage: number;
    lastPage: number;
    total: number;
    from: number | null;
    to: number | null;
    links: KviewCrudTablePaginationLink[];
    options: { value: string; label: string }[];
}

export interface KviewCrudTableLabels {
    newRecord: string;
    deleteSelected: string;
    deleteSelectedConfirm: string;
    exportLabel: string;
    settings: string;
    emptyTitle: string;
    emptyText: string;
    search: string;
    rowsPerPage: string;
    pagination: string;
    previousPage: string;
    nextPage: string;
    rowActions: string;
    columns: string;
    clear: string;
    apply: string;
    selectedCount: string;
    showingRange: string;
    showing: string;
    reset: string;
    resetTitle: string;
    resetMessage: string;
    dataTransfer: string;
    exportCsv: string;
    exportCsvHelp: string;
    exportXlsx: string;
    exportXlsxHelp: string;
    importData: string;
    importHelp: string;
    nothingTitle: string;
    nothingMessage: string;
    readyTitle: string;
    readyMessage: string;
    rowWord: string;
    rowsWord: string;
    selectAll: string;
    horizontalScroll: string;
    closeFilter: string;
    filterColumn: string;
    filterPlaceholder: string;
    filterValue: string;
    reorderColumn: string;
    moveUp: string;
    moveDown: string;
    resizeColumn: string;
    widthPixels: string;
    selectRow: string;
    record: string;
    records: string;
    deleteRecordTitle: string;
    deleteRecordMessage: string;
    deleteAction: string;
    operators: Record<'contains' | 'equals' | 'starts' | 'ends' | 'not_contains' | 'not_equals', string>;
}

export type KviewCrudTableLabelOverrides = Partial<Omit<KviewCrudTableLabels, 'operators'>> & {
    operators?: Partial<KviewCrudTableLabels['operators']>;
};

export interface KviewCrudTableFilter {
    operator: string;
    value: string;
}

export type KviewCrudTableFilterState = Record<string, KviewCrudTableFilter>;

export interface KviewCrudTableViewState {
    hidden: string[];
    order: string[];
    widths: Record<string, number | string>;
}

export interface KviewCrudTablePayload {
    id: string;
    resource?: string | null;
    title?: string | null;
    titleIcon?: string | null;
    eyebrow?: string | null;
    description?: string | null;
    headingLevel?: 1 | 2 | 3 | 4 | 5 | 6;
    columns: KviewCrudTableColumn[];
    rows: KviewCrudTableRow[];
    sort: KviewCrudTableSort;
    search: string;
    filters: KviewCrudTableFilterState;
    pagination: KviewCrudTablePagination;
    createUrl?: string | null;
    createInertia?: boolean;
    createLabel?: string;
    selectable?: boolean;
    bulkDeleteUrl?: string | null;
    bulkDeleteLabel?: string;
    bulkDeleteConfirm?: string;
    exportName?: string | null;
    exportLabel?: string;
    exportApplicationName?: string;
    exportSheetName?: string;
    settingsLabel?: string;
    emptyTitle?: string | null;
    emptyText?: string;
    searchLabel?: string;
    searchPlaceholder?: string;
    rowsPerPageLabel?: string;
    paginationLabel?: string;
    actionsLabel?: string;
    labels?: KviewCrudTableLabelOverrides;
    footnote?: string | null;
    searchDebounceMs?: number;
    storagePrefix?: string;
}
