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
*
* ```
*/
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;
/**
* 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;
/** Emite cuando el user cierra el modal (botón X o backdrop). */
dismissed: EventEmitter;
private auth;
private toast;
private i18n;
private i18nHelper;
private qrGen;
private readonly _step;
/** Paso actual del flujo. */
readonly step: import("@angular/core").Signal;
/** `true` mientras una llamada al backend está en curso. */
readonly working: import("@angular/core").WritableSignal;
readonly mfaEnabled: import("@angular/core").WritableSignal;
readonly mfaMethod: import("@angular/core").WritableSignal;
readonly userPhone: import("@angular/core").WritableSignal;
readonly backupCodesCount: import("@angular/core").WritableSignal;
/** Default true para no romper el flow viejo si el backend no devuelve el campo. */
readonly hasPassword: import("@angular/core").WritableSignal;
readonly selectedMethod: import("@angular/core").WritableSignal;
readonly totpSetup: import("@angular/core").WritableSignal;
readonly totpQr: import("@angular/core").WritableSignal;
/** Códigos de respaldo recién regenerados — se muestran una sola vez. */
readonly regeneratedCodes: import("@angular/core").WritableSignal;
/** Marca momentánea cuando el secreto TOTP se acaba de copiar (feedback visual). */
readonly copiedSecret: import("@angular/core").WritableSignal;
readonly resendCooldown: import("@angular/core").WritableSignal;
readonly disableCodeSent: import("@angular/core").WritableSignal;
readonly pinControl: FormControl;
readonly phoneControl: FormControl;
readonly pinInputProps: {
control: FormControl;
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;
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;
/** Copia el secreto TOTP al portapapeles + feedback visual (check) durante 2s. */
copySecret(secret: string): Promise;
/** 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;
static ɵcmp: i0.ɵɵComponentDeclaration;
}
export {};