import type { tipoResposta } from "p-respostas";
import type { LucideIcon } from "lucide-vue-next";
import type { tipoTabelaCelula, tiposTabelaCelulas } from "./celulas/tiposTabelaCelulas";
import { operadores, zFiltro } from "p-comuns";
import { ComponenteEntrada } from "../EliEntrada/tiposEntradas";
export type tipoFiltro = ReturnType<(typeof zFiltro)["parse"]>;
export type tipoComponenteCelulaBase<T extends tipoTabelaCelula> = readonly [T, tiposTabelaCelulas[T]];
export type tipoComponenteCelula = {
    [K in tipoTabelaCelula]: tipoComponenteCelulaBase<K>;
}[tipoTabelaCelula];
export declare const celulaTabela: <T extends tipoTabelaCelula>(tipo: T, dados: tiposTabelaCelulas[T]) => tipoComponenteCelulaBase<T>;
export type { tipoTabelaCelula, tiposTabelaCelulas };
export type tipoEliColuna<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) => tipoComponenteCelula;
    /** Ação opcional disparada ao clicar na célula. */
    /**
     * 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;
    /**
     * indica que a coluna será visivel, se false incia em detalhe
     * Caso já tenha salvo a propriedade de visibilidade será adotado a propriedade salva
     */
    visivel: boolean;
};
export type tipoEliConsultaPaginada<T> = {
    /** Registros retornados na consulta. */
    valores: T[];
    /** Total de registros disponíveis no backend. */
    quantidade: number;
};
export type tipoEliTabelaAcao<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 tipoEliTabelaConsulta<T> = {
    /** nome da tabela, um identificador unico */
    nome: string;
    /** Indica se a caixa de busca deve ser exibida acima da tabela. */
    mostrarCaixaDeBusca?: boolean;
    /** Lista de colunas da tabela. */
    colunas: tipoEliColuna<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?: {
        filtros?: tipoFiltro[];
        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<tipoEliConsultaPaginada<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?: tipoEliTabelaAcao<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;
        /**
         * Callback opcional para forçar atualização da consulta.
         * Observação: o componente `EliTabela` pode ignorar isso dependendo do modo de uso.
         */
        atualizarConsulta?: () => Promise<void>;
        /**
         * Callback opcional para permitir editar a lista localmente (sem refazer consulta).
         * Observação: o componente `EliTabela` pode ignorar isso dependendo do modo de uso.
         */
        editarLista?: (lista: T[]) => Promise<T[]>;
    }[];
    filtroAvancado?: {
        coluna: keyof T;
        operador: operadores | keyof typeof operadores;
        entrada: ComponenteEntrada;
    }[];
};
