import { EventEmitter, OnDestroy } from '@angular/core';
import { FormControl } from '@angular/forms';
import { FormMetadata, FormSubmit } from '../../types';
import { MFAMethod, TOTPSetupResponse } from '../../../services/auth/types';
import { QrResult } from '../../../services/qr-generator/types';
import * as i0 from "@angular/core";
/** Paso del flujo del modal. */
type MfaStep = 'loading' | 'status' | 'method-select' | 'totp-setup' | 'code-confirm' | 'disable';
/**
 * `val-mfa-modal` — modal de gestión de autenticación de dos factores (MFA)
 * para un usuario autenticado. Mismo patrón que `val-change-password-modal`.
 *
 * Flujo (máquina de estados interna):
 *  - `loading` → `getProfile()` para conocer el estado MFA.
 *  - `status` → muestra MFA habilitado/deshabilitado. Si está habilitado:
 *    gestión de backup codes (TOTP) + deshabilitar. Si no: botón habilitar.
 *  - `method-select` → elegir TOTP / EMAIL / SMS.
 *  - `totp-setup` → QR + secreto manual + backup codes → verificar código.
 *  - `code-confirm` → (EMAIL/SMS) ingresar código recibido, con reenvío.
 *  - `disable` → contraseña para deshabilitar MFA.
 *
 * El QR se genera **client-side** (`QrGeneratorService`) — el secreto TOTP
 * nunca sale del navegador.
 *
 * Self-contained: inyecta `AuthService` y llama los endpoints directo. La app
 * controla `[isOpen]` y reacciona a `(changed)` / `(dismissed)`.
 *
 * i18n: namespace compartido `_auth`.
 *
 * @example
 * ```html
 * <val-mfa-modal
 *   [isOpen]="isModalOpen()"
 *   (dismissed)="isModalOpen.set(false)"
 * />
 * ```
 */
export declare class MfaModalComponent implements OnDestroy {
    private _isOpen;
    /** Controla la visibilidad. Cada apertura re-resuelve el estado MFA. */
    set isOpen(value: boolean);
    get isOpen(): boolean;
    /**
     * Código MFA pre-cargado (deep-link desde el email de setup MFA-email). Si
     * está presente al abrir, el modal salta directo al paso de confirmación
     * con el código rellenado.
     */
    prefillCode?: string;
    /** Emite cuando el estado MFA cambia (habilitado / deshabilitado). */
    changed: EventEmitter<void>;
    /**
     * Emitido cuando un setup MFA se confirma exitosamente y el modal fue abierto
     * vía deep-link (con `prefillCode`). El host puede usarlo para cerrar el
     * modal y navegar (ej. a home) en lugar de quedarse en la página de Security.
     */
    enabledViaDeeplink: EventEmitter<void>;
    /** Emite cuando el user cierra el modal (botón X o backdrop). */
    dismissed: EventEmitter<void>;
    private auth;
    private toast;
    private i18n;
    private i18nHelper;
    private qrGen;
    private readonly _step;
    /** Paso actual del flujo. */
    readonly step: import("@angular/core").Signal<MfaStep>;
    /** `true` mientras una llamada al backend está en curso. */
    readonly working: import("@angular/core").WritableSignal<boolean>;
    readonly mfaEnabled: import("@angular/core").WritableSignal<boolean>;
    readonly mfaMethod: import("@angular/core").WritableSignal<MFAMethod>;
    readonly userPhone: import("@angular/core").WritableSignal<string>;
    readonly backupCodesCount: import("@angular/core").WritableSignal<number>;
    /** Default true para no romper el flow viejo si el backend no devuelve el campo. */
    readonly hasPassword: import("@angular/core").WritableSignal<boolean>;
    readonly selectedMethod: import("@angular/core").WritableSignal<MFAMethod>;
    readonly totpSetup: import("@angular/core").WritableSignal<TOTPSetupResponse>;
    readonly totpQr: import("@angular/core").WritableSignal<QrResult>;
    /** Códigos de respaldo recién regenerados — se muestran una sola vez. */
    readonly regeneratedCodes: import("@angular/core").WritableSignal<string[]>;
    /** Marca momentánea cuando el secreto TOTP se acaba de copiar (feedback visual). */
    readonly copiedSecret: import("@angular/core").WritableSignal<boolean>;
    readonly resendCooldown: import("@angular/core").WritableSignal<number>;
    readonly disableCodeSent: import("@angular/core").WritableSignal<boolean>;
    readonly pinControl: FormControl<string>;
    readonly phoneControl: FormControl<string>;
    readonly pinInputProps: {
        control: FormControl<string>;
        token: string;
        length: number;
        allowNumbersOnly: boolean;
        autoFocus: boolean;
    };
    /** Form de deshabilitación — `val-form` con un campo de contraseña. */
    readonly disableFormProps: import("@angular/core").Signal<FormMetadata>;
    private resendTimer;
    constructor();
    ngOnDestroy(): void;
    /** Traduce una clave del namespace `_auth`. */
    t(key: string): string;
    /** Cierre iniciado por el user (X / backdrop). */
    close(): void;
    /**
     * Punto de entrada al abrir el modal. Con `prefillCode` (deep-link del email
     * de setup MFA-email) salta directo a la confirmación; si no, resuelve el
     * estado MFA actual.
     */
    private open;
    /** Consulta el perfil para conocer el estado MFA y posicionar el flujo. */
    private resolveStatus;
    private loadBackupCount;
    goToMethodSelect(): void;
    goToDisable(): void;
    backToStatus(): void;
    /** Continúa desde el selector de método al setup correspondiente. */
    proceedWithMethod(): void;
    private setupTotp;
    /** Verifica el código TOTP de la app de autenticación y activa MFA. */
    verifyTotp(): void;
    /** Confirma el código EMAIL/SMS y activa MFA. */
    confirmCode(): void;
    /** Reenvía el código EMAIL/SMS (re-ejecuta el setup). */
    resendCode(): void;
    /** Regenera los códigos de respaldo TOTP y los muestra una vez. */
    regenerateBackupCodes(): void;
    /** Deshabilita MFA usando la contraseña de la cuenta. */
    onDisableSubmit(event: FormSubmit): void;
    /** Deshabilita MFA usando un código TOTP — para cuentas OAuth-only sin contraseña. */
    disableWithMfaCode(): void;
    sendDisableCode(): void;
    private disable;
    /** Copia una lista de códigos de respaldo al portapapeles. */
    copyCodes(codes: string[]): Promise<void>;
    /** Copia el secreto TOTP al portapapeles + feedback visual (check) durante 2s. */
    copySecret(secret: string): Promise<void>;
    /** Etiqueta i18n legible para un método MFA. */
    methodLabel(method: MFAMethod | null): string;
    private resetFlow;
    private startCooldown;
    private stopCooldown;
    /** Mapea los códigos de error MFA del backend a mensajes del namespace `_auth`. */
    private resolveError;
    private showToast;
    static ɵfac: i0.ɵɵFactoryDeclaration<MfaModalComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<MfaModalComponent, "val-mfa-modal", never, { "isOpen": { "alias": "isOpen"; "required": false; }; "prefillCode": { "alias": "prefillCode"; "required": false; }; }, { "changed": "changed"; "enabledViaDeeplink": "enabledViaDeeplink"; "dismissed": "dismissed"; }, never, never, true, never>;
}
export {};
