package es.tatvil.taiageweb.config;

import es.tatvil.taiageweb.modelo.Usuario;
import es.tatvil.taiageweb.repositorio.UsuarioRepository;
import org.springframework.boot.CommandLineRunner;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Component;

import java.util.HashSet;
import java.util.Set;

/**
 * Inicializa datos mínimos en base de datos al arrancar la aplicación.
 *
 * <p>Si no existe ningún usuario con el email {@code admin@taiage.es}, crea
 * automáticamente la cuenta de administrador con credenciales predeterminadas.</p>
 *
 * <p><strong>IMPORTANTE:</strong> cambia la contraseña por defecto en cuanto
 * sea posible desde el panel {@code /admin/usuarios}.</p>
 */
@Component
public class DataInitializer implements CommandLineRunner {

    private final UsuarioRepository repo;
    private final PasswordEncoder encoder;

    /**
     * Constructor con inyección de dependencias.
     *
     * @param repo    repositorio de usuarios
     * @param encoder encoder de contraseñas BCrypt
     */
    public DataInitializer(UsuarioRepository repo, PasswordEncoder encoder) {
        this.repo = repo;
        this.encoder = encoder;
    }

    /**
     * Crea el usuario administrador si todavía no existe en la base de datos.
     *
     * @param args argumentos de línea de comandos (no se utilizan)
     */
    @Override
    public void run(String... args) {
        if (repo.findByEmail("admin@taiage.es").isEmpty()) {
            Usuario admin = new Usuario();
            admin.setEmail("admin@taiage.es");
            admin.setPassword(encoder.encode("Cambiar1!"));
            admin.setHabilitado(true);
            admin.setRoles(new HashSet<>(Set.of("ROLE_ADMIN", "ROLE_PAGADO", "ROLE_USER")));
            repo.save(admin);
            System.out.println("""
                    ╔══════════════════════════════════════════════╗
                    ║  ADMIN creado → admin@taiage.es / Cambiar1!  ║
                    ║  Cambia la contraseña en /admin/usuarios      ║
                    ╚══════════════════════════════════════════════╝
                    """);
        }
    }
}
