import { default as React, CSSProperties } from 'react';
import { ColumnDef as TanstackColumnDef } from '@tanstack/react-table';
type BodyCellType<T extends object> = "input" | "textarea" | "inputNum" | "inputEng" | "select" | "checkbox" | "checkboxN" | "datePicker" | "modal" | "file" | "button" | "custom" | "text" | "date" | ((row: T) => "input" | "textarea" | "inputNum" | "inputEng" | "select" | "checkbox" | "checkboxN" | "datePicker" | "modal" | "file" | "button" | "custom" | "text" | "date") | string;
type RenderCellParams<T extends object> = {
    rowData: T;
    rowIndex: number;
    column: ColumnDef<T>;
    columnId: string;
    value: unknown;
    isCellActive: boolean;
    isCellFocused: boolean;
    isRowSelected: boolean;
    isRowActive: boolean;
};
type GetCellPropsParams<T extends object> = {
    rowData: T;
    rowIndex: number;
    column: ColumnDef<T>;
    columnId: string;
    value: unknown;
    isCellActive: boolean;
    isCellFocused: boolean;
    isRowSelected: boolean;
    isRowActive: boolean;
};
type CellMerge = {
    /** 여러 행/열을 병합할 때 사용합니다. reorderMode에서는 rowSpan 기반 행병합만 지원하지 않으며, colSpan만 사용하는 경우는 허용됩니다. */
    rowSpan?: number;
    colSpan?: number;
    skipCell?: boolean;
};
type GetCellPropsResult = React.TdHTMLAttributes<HTMLTableCellElement> & {
    merge?: CellMerge;
};
type ColumnCommonProps<T extends object> = {
    accessorKey?: string;
    width?: string;
    role?: "group";
    setSort?: React.Dispatch<React.SetStateAction<string[]>>;
    visible?: boolean;
    /** 바디 td 요소에 추가 속성이나 스타일을 주입합니다. merge.rowSpan 기반 행병합은 reorderMode와 함께 사용할 수 없지만, colSpan만 사용하는 경우는 허용됩니다. */
    getCellProps?: (params: GetCellPropsParams<T>) => GetCellPropsResult;
    /** 헤더 셀의 내용을 컬럼 단위로 커스텀 렌더링합니다. */
    renderHeaderCell?: (params: {
        column: ColumnDef<T>;
        columnId: string;
    }) => React.ReactNode;
    /** 헤더 th 요소에 추가 속성이나 스타일을 주입합니다. */
    getHeaderCellProps?: (params: {
        column: ColumnDef<T>;
        columnId: string;
    }) => React.ThHTMLAttributes<HTMLTableCellElement>;
};
type StandardColumnProps<T extends object> = {
    align?: "start" | "center" | "right";
    editable?: boolean;
    type?: BodyCellType<T>;
    selectItems?: {
        value: string | number;
        label: string;
    }[];
    required?: boolean;
    button?: React.ReactNode | ((row: T) => React.ReactNode);
    ellipsis?: boolean;
    tags?: (row: T) => React.ReactNode[];
    disabled?: (row: T) => boolean | boolean;
    isOnly?: boolean;
    maxLength?: number;
    numRange?: number[];
    /** custom 타입에서 사용하는 기존 전용 렌더러입니다. 신규 코드는 renderCell 사용을 권장합니다. */
    component?: (row: T) => React.ReactNode;
    modalFn?: (row: T) => void;
    accept?: string;
    icon?: React.ReactNode;
    onChange?: (...args: any[]) => any;
    readOnly?: boolean;
    simpleSelect?: boolean;
    showEditIcon?: boolean;
    renderCell?: never;
};
type RenderCellColumnProps<T extends object> = {
    /** 바디 셀의 내용을 컬럼 단위로 완전히 커스텀 렌더링합니다. 이 경로에서는 align, editable, type, maxLength 같은 표준 셀 옵션이 자동 적용되지 않습니다. */
    renderCell: (params: RenderCellParams<T>) => React.ReactNode;
    align?: never;
    editable?: never;
    type?: never;
    selectItems?: never;
    required?: never;
    button?: never;
    ellipsis?: never;
    tags?: never;
    disabled?: never;
    isOnly?: never;
    maxLength?: never;
    numRange?: never;
    component?: never;
    modalFn?: never;
    accept?: never;
    icon?: never;
    onChange?: never;
    readOnly?: never;
    simpleSelect?: never;
    showEditIcon?: never;
};
export type ColumnDef<T extends object> = TanstackColumnDef<T> & ColumnCommonProps<T> & (StandardColumnProps<T> | RenderCellColumnProps<T>);
export interface Table2Props {
    /** Cell 클릭 시 해당 Cell Border 스타일 변경 여부를 설정합니다. */
    selectedCell?: boolean;
    /** Cell 포커스 시 해당 Cell Border 스타일 변경 여부를 설정합니다. */
    focusedCell?: boolean;
    /** 테이블에 표시할 데이터 배열을 설정합니다. */
    data?: any[];
    /** 테이블의 열 정의 배열을 설정합니다. */
    columns?: ColumnDef<any>[];
    /** 테이블 데이터 변경 시 호출되는 콜백 함수를 설정합니다. */
    onChange?: (data: any[]) => void;
    /** 체크박스 표시 여부를 설정합니다. */
    checkbox?: boolean;
    /** 행 번호 컬럼 표시 여부를 설정합니다. */
    no?: boolean;
    /** 체크박스를 라디오 버튼 형태로 표시 여부를 설정합니다. */
    radio?: boolean;
    /** Cell 클릭 시 해당 위치의 row, col 정보를 반환합니다. */
    onCellClick?: (row: any, rowIndex: number, col: any, colIndex: number) => void;
    /** 행 클릭 시 동작할 콜백 함수를 설정합니다. */
    onRowClick?: (row: any, rowIndex: number) => void;
    /** 행 더블 클릭 시 동작할 콜백 함수를 설정합니다. */
    onRowDoubleClick?: (row: any, rowIndex: number) => void;
    /** 로딩 상태 표시 여부를 설정합니다. */
    isLoading?: boolean;
    /** 행 개수 변경 시 스크롤 위치 유지 방식 설정합니다. */
    rowCountChangeScrollPosition?: "top" | "bottom" | number | "preserve";
    /** 특정 행으로 스크롤할 인덱스를 설정합니다. */
    scrollTo?: number;
    /** 편집, 추가 구분 확인 Column 여부를 설정합니다. */
    isEditMode?: boolean;
    /** 행 클릭 트리거 인덱스를 설정합니다. */
    rowClickTriggerIdx?: number;
    /** 데이터 변경 시 행 클릭 트리거 인덱스 초기화 여부를 설정합니다. */
    resetTriggerOnDataChange?: boolean;
    /** true로 설정하면 data가 변경되어도 triggerRowIndex effect가 재발화되지 않습니다. */
    noTriggerOnDataChange?: boolean;
    /** 행 드래그앤드롭 재정렬 모드를 활성화합니다. getCellProps의 merge.rowSpan 기반 행병합과 함께 사용하는 것은 지원하지 않지만, colSpan만 사용하는 경우는 허용됩니다. */
    reorderMode?: boolean;
    /** 행 순서가 변경될 때 재정렬된 데이터를 반환합니다. */
    onReorder?: (data: any[]) => void;
    /** 내부 table 요소 스타일을 오버라이드합니다. */
    sx?: CSSProperties;
    /** tbody 행 높이를 설정합니다. */
    rowHeight?: number;
    /** thead 행 높이를 설정합니다. */
    headerRowHeight?: number;
    /** 각 행에 대한 추가 속성을 설정할 수 있는 콜백 함수를 제공합니다. */
    getRowProps?: (params: {
        row: any;
        rowIndex: number;
        isSelected: boolean;
        isActive: boolean;
        isHovered: boolean;
    }) => React.HTMLAttributes<HTMLTableRowElement>;
}
export {};
