import { ReactNode } from 'react';

export interface Column {
  key: string;
  name: string;
  label: string;
  isVisible: boolean;
  hasIcon?: boolean;
  type?: string;
  sortable?: boolean;
  filterable?: boolean;
  toggable?: boolean;
  width?: string;
}

export interface TableAction {
  type: 'action';
  name: string;
  label: string;
  styles?: string;
  icon?: string;
  iconPosition?: string;
  props?: Record<string, any>;
  hasConfirmCallback?: boolean;
  separator?: boolean;
  url?: string;
}

export interface TableActionGroup {
  type: 'group';
  name: string;
  label: string;
  styles?: string;
  icon?: string;
  iconPosition?: string;
  props?: Record<string, any>;
  actions: TableAction[];
}

export interface FilterOption {
  value: string;
  label: string;
  icon?: string;
  iconPosition?: string;
  count?: number;
}

export interface FilterDefinition {
  name: string;
  label: string;
  options: Record<string, string>;
  icons?: Record<string, string>;
  multiple: boolean;
  filterOptions?: FilterOption[];
}

export interface ConfirmDialogContent {
  title: string;
  message: string;
  confirm: string;
  cancel: string;
  disabled: boolean;
}

export interface PendingAction {
  actionName: string;
  ids: (number | string)[];
  url?: string;
}

export interface FormattedData {
  [key: string]: ReactNode | string | number | boolean | null;
  _id?: number | string;
  id?: number | string;
}

export interface Pagination {
  currentPage: number;
  hasMorePages: boolean;
  total: number;
  prevPage: () => void;
  nextPage: () => void;
}

export interface PageProps {
  columns: Column[];
  filters: FilterDefinition[];
  actions: (TableAction | TableActionGroup)[];
  currentFilters: Record<string, string | string[]>;
  data: {
    data: Record<string, unknown>[];
    current_page: number;
    last_page: number;
    total: number;
    per_page: number;
  };
  pageSize: number;
  availablePageSizes: number[];
  sort?: string;
  direction?: string;
  translations?: Record<string, Record<string, string>>;
  actionResult?: {
    success?: boolean;
    message?: string;
    title?: string;
    variant?: string;
    confirmData?: {
      title?: string;
      message?: string;
      confirm?: string;
      cancel?: string;
      disabled?: boolean;
    };
  };
  visibleColumns?: Record<string, boolean>;
  exportable?: boolean;
  exportType?: string;
  exportColumn?: string;
}

export interface DatatableProps {
  route?: string;
  icons?: Record<string, React.ComponentType<React.SVGProps<SVGSVGElement>>>;
}
