<?php

require_once __DIR__ . '/../database/database.php';

class logInModel {

    private $db;

    // ESTABLECER CONECCIÓN CON BASE DE DATOS

    public function __construct() {
        $this->db = Database::getConnection(); // Guardamos el objeto PDO en $db
    }

    // BUSCAR USUARIO

    public function buscarPorUsuario($usuario) {
        
        $sql = "SELECT * FROM usuarios WHERE (usuario = :usuario) AND (usuarios.activo = true) LIMIT 1"; // LIMIT 1, más que nada por seguridad u optimizacón. :usuario es reemplazado luego con el valor real

        $stmt = $this->db->prepare($sql); // Uso de prepare para evitar SQL Injection

        $stmt->bindParam(':usuario', $usuario, PDO::PARAM_STR); // Asocia la variable $usuario con el placeholder :usuario en la consulta.

        $stmt->execute(); // Ejecuta la consulta ya preparada con los parámetros vinculados

        return $stmt->fetch(PDO::FETCH_ASSOC); // Obtiene la primera fila del resultado como un array asociativo
    }

    // INVALIDAR POR USUARIO

    public function invalidarPorUsuario(int $id): bool {

        $sql = "UPDATE recuperacion_cuenta
                    SET usado = 1 
                WHERE (id_usuario = :id_usuario)";

        $stmt = $this->db->prepare($sql);

        return $stmt->execute([':id_usuario' => $id]);
    }

    // CREAR RECUPERACIÓN

    public function crear(array $data): bool {

        $sql = "INSERT INTO recuperacion_cuenta (id_usuario, codigo, expira_a, usado) VALUES (:id_usuario, :codigo, :expira_a, 0)";

        $stmt = $this->db->prepare($sql);

        return $stmt->execute([
            ':id_usuario' => $data['id_usuario'],
            ':codigo' => $data['codigo'],
            ':expira_a' => $data['expira_a']
        ]);
    }

    // OBTENER ÚLTIMO CÓDIGO VÁLIDO

    public function obtenerCodigoValido(int $idUsuario): ?array {

        $sql = "SELECT id, codigo, expira_a, usado FROM recuperacion_cuenta
                    WHERE (id_usuario = :id_usuario) AND (usado = 0)
                ORDER BY id DESC LIMIT 1";

        $stmt = $this->db->prepare($sql);

        $stmt->execute([':id_usuario' => $idUsuario]);

        return $stmt->fetch(PDO::FETCH_ASSOC) ?: null;
    }

    // MARCAR COMO USADO

    public function marcarComoUsado(int $id): bool {

        $sql = "UPDATE recuperacion_cuenta 
                    SET usado = 1 
                WHERE id = :id";

        $stmt = $this->db->prepare($sql);

        return $stmt->execute([':id' => $id]);
    }
}