<?php

declare(strict_types=1);

namespace App\Support;

use App\Models\DemoCredential;
use App\Models\User;
use Illuminate\Support\Str;

/**
 * Gestiona las contraseñas de los 3 usuarios demo compartidos.
 *
 * - rotate(): genera 3 contraseñas nuevas (alfanuméricas, sin símbolos → fáciles
 *   de teclear en móvil), las guarda cifradas en `demo_credentials` y las aplica
 *   como password de cada usuario demo (el cast `hashed` del modelo User las
 *   hashea al asignarlas). Rotación (nightly vía reset-demo).
 * - ensure(): si faltan credenciales, rota; si ya existen las 3, no toca nada
 *   (para no invalidar credenciales vigentes en cada deploy que corre setup-demo).
 * - forEmail(): devuelve [ ['role','email','password'(plano)], ... ] para el correo.
 */
class DemoCredentials
{
    public static function rotate(): void
    {
        foreach (Demo::USERS as $email => $role) {
            $plain = Str::password(12, letters: true, numbers: true, symbols: false, spaces: false);

            DemoCredential::updateOrCreate(['role' => $role], ['password' => $plain]);

            $user = User::where('email', $email)->first();
            if ($user) {
                $user->password = $plain; // cast `hashed` en User lo hashea una vez
                $user->save();
            }
        }
    }

    public static function ensure(): void
    {
        $existing = DemoCredential::whereIn('role', array_values(Demo::USERS))->count();
        if ($existing < count(Demo::USERS)) {
            self::rotate();
        }
    }

    /** @return array<int, array{role: string, email: string, password: ?string}> */
    public static function forEmail(): array
    {
        $byRole = DemoCredential::pluck('password', 'role'); // descifrado por el cast

        $out = [];
        foreach (Demo::USERS as $email => $role) {
            $out[] = ['role' => $role, 'email' => $email, 'password' => $byRole[$role] ?? null];
        }

        return $out;
    }
}
