import type { tipoResposta } from "p-respostas";
import type { LucideIcon } from "lucide-vue-next";
import type { TipoTabelaCelula, TiposTabelaCelulas } from "./celulas/tiposTabelaCelulas";
export type ComponenteCelulaBase<T extends TipoTabelaCelula> = readonly [T, TiposTabelaCelulas[T]];
export type ComponenteCelula = {
    [K in TipoTabelaCelula]: ComponenteCelulaBase<K>;
}[TipoTabelaCelula];
export declare const celulaTabela: <T extends TipoTabelaCelula>(tipo: T, dados: TiposTabelaCelulas[T]) => ComponenteCelulaBase<T>;
export type { TipoTabelaCelula, TiposTabelaCelulas };
export type EliAlinhamentoColuna = "esquerda" | "centro" | "direita";
export type EliColuna<T> = {
    /** Texto exibido no cabeçalho da coluna. */
    rotulo: string;
    /** Função responsável por renderizar o conteúdo da célula. */
    celula: (linha: T) => ComponenteCelula;
    /** Ação opcional disparada ao clicar na célula. */
    acao?: () => void;
    /** Alinhamento do conteúdo da coluna (cabeçalho e células). */
    alinhamento?: EliAlinhamentoColuna;
    /**
     * Quando `true`, tenta truncar (ellipsis) conteúdos textuais longos.
     * Observação: o tooltip automático só é aplicado quando o conteúdo renderizado
     * da célula é um `string`/`number`.
     */
    truncar?: boolean;
    /**
     * Largura máxima usada quando `truncar` estiver ativo.
     * Exemplos: `240` (px), `"18rem"`, `"30ch"`.
     */
    largura_maxima?: number | string;
    /**
     * Campo de ordenação associado à coluna. Caso informado, a coluna passa a
     * exibir controles de ordenação e utiliza o valor como chave para o backend.
     */
    coluna_ordem?: keyof T;
};
export type EliConsultaPaginada<T> = {
    /** Registros retornados na consulta. */
    valores: T[];
    /** Total de registros disponíveis no backend. */
    quantidade: number;
};
export type EliTabelaAcao<T> = {
    /** Ícone (Lucide) exibido para representar a ação. */
    icone: LucideIcon;
    /** Cor aplicada ao ícone e rótulo. */
    cor: string;
    /** Texto descritivo da ação. */
    rotulo: string;
    /** Função executada quando o usuário ativa a ação. */
    acao: (linha: T) => void;
    /**
     * Define se a ação deve ser exibida para a linha. Pode ser um booleano fixo
     * ou uma função (sincrona/assíncrona) que recebe a linha para decisão dinâmica.
     */
    exibir?: boolean | ((linha: T) => Promise<boolean> | boolean);
};
/**
 * Estrutura de dados para uma tabela alimentada por uma consulta.
 *
 * - `colunas`: definição de colunas e como renderizar cada célula
 * - `consulta`: função que recupera os dados, com suporte a ordenação/paginação
 * - `mostrarCaixaDeBusca`: habilita um campo de busca textual no cabeçalho
 */
export type EliTabelaConsulta<T> = {
    /** Indica se a caixa de busca deve ser exibida acima da tabela. */
    mostrarCaixaDeBusca?: boolean;
    /** Lista de colunas da tabela. */
    colunas: EliColuna<T>[];
    /** Quantidade de registros solicitados por consulta (padrão `10`). */
    registros_por_consulta?: number;
    /**
     * Função responsável por buscar os dados. Recebe parâmetros opcionais de
     * ordenação (`coluna_ordem`/`direcao_ordem`) e paginação (`offSet`/`limit`).
     */
    consulta: (parametrosConsulta?: {
        coluna_ordem?: keyof T;
        direcao_ordem?: "asc" | "desc";
        offSet?: number;
        limit?: number;
        /** Texto digitado na caixa de busca, quando habilitada. */
        texto_busca?: string;
    }) => Promise<tipoResposta<EliConsultaPaginada<T>>>;
    /** Quantidade máxima de botões exibidos na paginação (padrão `7`). */
    maximo_botoes_paginacao?: number;
    /** Mensagem exibida quando a consulta retorna ok porém sem dados. */
    mensagemVazio?: string;
    /** Ações exibidas à direita de cada linha. */
    acoesLinha?: EliTabelaAcao<T>[];
    /**
     * Configurações dos botões que serão inseridos a direita da caixa de busca.
     * Seu uso mais comum será para criar novos registros, mas poderá ter outras utilidades.
     */
    acoesTabela?: {
        /** Ícone (Lucide) exibido no botão */
        icone?: LucideIcon;
        /** Cor aplicada ao botão. */
        cor?: string;
        /** Texto descritivo da ação. */
        rotulo: string;
        /** Função executada ao clicar no botão. */
        acao: () => void;
    }[];
};
