type booleanFn = () => boolean;
import { TemplateRef } from '@angular/core';
import { AbstractControl } from '@angular/forms';
import { FieldSizeConfig } from '../../form-field/configurations/field-size';
import { DynamicType } from '../../form-field/configurations/fields/field';
import { DynamicStructure } from '../structure/structure';
/**
 * Propriedades adicionais disponíveis em **todo campo ou estrutura colocado dentro de um `row`**.
 *
 * Ao inserir um campo em `RowConfig.fields`, ele é expandido com estas propriedades via
 * `ExpandedDynamicType` / `ExpandedDynamicStructure`. Permitem controlar layout, visibilidade,
 * mensagens de erro e rodapés de forma granular por campo dentro da linha.
 */
interface RowAdditionalFields {
    /**
     * Tamanho (largura) deste campo dentro da linha.
     * Permite definir colunas responsivas (ex: metade da linha, terço, etc.)
     * usando `FieldSizeConfig` com breakpoints.
     */
    size?: FieldSizeConfig;
    /**
     * Função que retorna `true` quando o campo deve ser exibido.
     * Permite ocultar/exibir o campo dinamicamente sem removê-lo da configuração.
     * @example () => this.model.mostrarCampo
     */
    visible?: () => boolean;
    /**
     * Função que retorna um mapa de mensagens de erro customizadas para o campo.
     * A chave é o nome do validador (ex: `'required'`, `'minlength'`) e o valor é a mensagem.
     * @example () => ({ required: 'Campo obrigatório', minlength: 'Mínimo 3 caracteres' })
     */
    errorMessages?: () => {} | {};
    /**
     * Template Angular (`ng-template`) renderizado abaixo do campo.
     * Use para adicionar conteúdo customizado abaixo do input, como dicas ou informações extras.
     */
    bottomTemplate?: TemplateRef<Element>;
    /**
     * Rodapé exibido abaixo do campo com texto de ajuda e/ou link de ação.
     * Permite adicionar orientações contextuais ou atalhos diretamente associados ao campo.
     */
    footer?: {
        /**
         * Texto de ajuda exibido no rodapé do campo.
         */
        help?: {
            /** Texto de ajuda exibido no rodapé. */
            text: string;
            /**
             * Função que controla a visibilidade do texto de ajuda.
             * Recebe o `AbstractControl` e a configuração do campo.
             */
            visible?: (options: {
                abstractControl: AbstractControl;
                formField: DynamicType;
            }) => boolean;
        };
        /**
         * Link clicável exibido no rodapé do campo.
         */
        link?: {
            /** Texto exibido no link. */
            label: string;
            /**
             * Callback chamado ao clicar no link do rodapé.
             * Recebe o `AbstractControl` e a configuração do campo.
             */
            onClick?: (options: {
                abstractControl: AbstractControl;
                formField: DynamicType;
            }) => void;
            /**
             * Função que controla a visibilidade do link.
             * Recebe o `AbstractControl` e a configuração do campo.
             */
            visible?: (options: {
                abstractControl: AbstractControl;
                formField: DynamicType;
            }) => boolean;
        };
    };
}
export type ExpandedDynamicType = DynamicType & RowAdditionalFields;
export type ExpandedDynamicStructure = DynamicStructure & RowAdditionalFields;
export type RowType = ExpandedDynamicType | ExpandedDynamicStructure;
/**
 * Configuração para estrutura do tipo linha (row).
 *
 * Organiza campos lado a lado em uma linha horizontal usando grid layout.
 * Cada campo dentro de um `row` pode receber propriedades adicionais de `RowAdditionalFields`,
 * como `size`, `visible`, `errorMessages`, `footer` e `bottomTemplate`.
 */
export interface RowConfig {
    /** Tipo da estrutura: sempre `'row'`. */
    type: 'row';
    /**
     * Lista de campos e sub-estruturas dispostos em linha.
     * Cada item pode ter propriedades adicionais de `RowAdditionalFields` (size, visible, footer, etc.).
     */
    fields: RowType[];
    /**
     * Controla a visibilidade da linha inteira.
     * Pode ser um booleano estático ou função reativa.
     * @example () => this.model.mostrarSecao
     */
    visible?: booleanFn | boolean;
}
declare module '../structure/structure' {
    interface StructureTypeMap {
        row: RowConfig;
    }
}
export {};
