import { DoCheck, ElementRef, EventEmitter, OnChanges, OnInit, SimpleChanges } from '@angular/core';
import { FormBuilder, FormControl, FormGroup } from '@angular/forms';
import { TextareaInputMetadata } from '../../molecules/textarea-input/types';
import { UsernameInputMetadata } from '../../molecules/username-input/types';
import { AttachmentItem } from '../attachment-uploader/types';
import { ButtonMetadata, FormMetadata, FormSubmit, InputMetadata, InputType } from '../../types';
import * as i0 from "@angular/core";
export declare class FormComponent implements OnInit, OnChanges, DoCheck {
    private fb;
    private elementRef;
    props: FormMetadata;
    onSubmit: EventEmitter<FormSubmit>;
    onInvalid: EventEmitter<any>;
    onSelectChange: EventEmitter<{
        field: string;
        value: any;
    }>;
    form: FormGroup;
    types: typeof InputType;
    states: {
        ENABLED: "ENABLED";
        DISABLED: "DISABLED";
        WORKING: "WORKING";
        ERROR: "ERROR";
    };
    /**
     * Valor actual del form (`form.getRawValue()`), actualizado en cada
     * `valueChanges`. Pensado para el modo `controlled`: el host lo lee vía
     * `@ViewChild(FormComponent)` sin tocar el FormGroup directo. En modo normal
     * también está disponible.
     */
    readonly value: import("@angular/core").WritableSignal<Record<string, any>>;
    /**
     * Estado de validez del form, actualizado en cada `statusChanges`. Para que
     * el host (wizard) habilite/deshabilite su botón "Siguiente".
     */
    readonly valid: import("@angular/core").WritableSignal<boolean>;
    private subscriptions;
    private actionsCache;
    private fieldPropMemo;
    private usernamePropMemo;
    private textareaPropMemo;
    private selectPropMemo;
    private previousState;
    private previousUploadingCount;
    private uploadingFields;
    constructor(fb: FormBuilder, elementRef: ElementRef);
    ngOnInit(): void;
    ngOnChanges(changes: SimpleChanges): void;
    ngDoCheck(): void;
    /**
     * Synchronizes form control disabled/enabled state with field metadata.
     */
    private syncFieldControlStates;
    /**
     * Actualiza el cache de actions basado en el estado actual del form.
     */
    private updateActionsCache;
    ngOnDestroy(): void;
    trackSelectChanges(fieldName: string): void;
    submitHandler(token?: string): Promise<void>;
    onAttachmentChange(fieldName: string, items: AttachmentItem[]): void;
    getControl(field: string): FormControl;
    getFieldProp(field: InputMetadata): InputMetadata;
    /**
     * Adapter para SELECT — igual que `getFieldProp` pero limpia `label`.
     * val-form ya renderiza el título del campo con `<val-title>` arriba del input;
     * si además pasáramos `label` al `<ion-select>`, este lo pinta DENTRO del pill
     * → redundancia visual ("Tipo" dos veces). Reusa el mismo memo (con la entrada
     * ya label-stripped) para no romper la identidad de referencia.
     */
    getSelectProp(field: InputMetadata): InputMetadata;
    /**
     * Adapter — convierte un `InputMetadata` (con type=HANDLE) a `UsernameInputMetadata`.
     * El check de disponibilidad se resuelve dentro del component (AuthService inyectado);
     * el caller puede sobrescribirlo pasando `field.errors` o un `UsernameInputMetadata`
     * custom usando type=TEXT si necesita otra fuente de truth.
     */
    getUsernameProp(field: InputMetadata): UsernameInputMetadata;
    /**
     * Adapter — convierte un `InputMetadata` (con type=TEXTAREA) a `TextareaInputMetadata`.
     * Defaults sensatos: autoGrow + counter habilitado, 4-12 rows.
     */
    getTextareaProp(field: InputMetadata): TextareaInputMetadata;
    get isAtEndOfForm(): boolean;
    /**
     * Fuerza mostrar los errores de validación (marca todos los controles como
     * touched) y devuelve si el form es válido. Pensado para el modo `controlled`:
     * el host lo invoca en su "Siguiente" para gatear la navegación del wizard.
     */
    validate(): boolean;
    /**
     * Marca todos los controles como touched (muestra errores) sin devolver nada.
     * Alias semántico de la primera mitad de `validate()`.
     */
    markAllTouched(): void;
    get Form(): FormGroup;
    get FormState(): {
        form: FormGroup;
        data: FormMetadata;
    };
    get actions(): ButtonMetadata[];
    static ɵfac: i0.ɵɵFactoryDeclaration<FormComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<FormComponent, "val-form", never, { "props": { "alias": "props"; "required": false; }; }, { "onSubmit": "onSubmit"; "onInvalid": "onInvalid"; "onSelectChange": "onSelectChange"; }, never, ["*"], true, never>;
}
