<?php
namespace app\models;
require_once __DIR__ . '/conexion.php';

require_once 'conexion.php';

use PDO;

class user extends conexion
{
    public function all()
    {
        $db = $this->DB();
        $query = $db->prepare("SELECT * FROM users");
        $query->execute();
        return $query->fetchAll(PDO::FETCH_ASSOC);
    }

    public function usuario($username, $password)
    {
        $db = $this->DB();
        $query = $db->prepare("SELECT * FROM users WHERE (username=:username OR email=:email) AND password=:password");
        $enc_password = $password;
        $query->bindParam("username", $username);
        $query->bindParam("email", $username);
        $query->bindParam("password", $enc_password);
        $query->execute();
        return $query->fetch(PDO::FETCH_OBJ);
    }

    public function detallesUsuario($user_id)
    {
        $db = $this->DB();
        $query = $db->prepare("SELECT * FROM users WHERE user_id=:user_id");
        $query->bindParam("user_id", $user_id);
        $query->execute();
        return $query->fetch(PDO::FETCH_OBJ);
    }

    public function buscarUsuario($cedula)
    {
        $db = $this->DB();
        $query = $db->prepare("SELECT * FROM users WHERE username=:cedula");
        $query->bindParam("cedula", $cedula);
        $query->execute();
        return $query->fetch(PDO::FETCH_OBJ);
    }

    public function estadoUsuarios($valor)
    {
        $db = $this->DB();
        $query = $db->prepare("UPDATE `users` SET `activo`=:activo");
        $query->bindParam("activo", $valor);
        return $query->execute();
    }

    public function actualizarUsuario($cedula, $zona = null, $telefono = null)
    {
        $db = $this->DB();
        $query = $db->prepare("UPDATE users SET `zona`=:zona, `telefono`=:telefono WHERE (`username` =:username);");
        $query->bindParam("telefono", $telefono);
        $query->bindParam("zona", $zona);
        $query->bindParam("username", $cedula);
        return $query->execute();
    }

    public function sinvotar()
    {
        $db = $this->DB();
        $query = $db->prepare("SELECT `name`, `username`, `zona` FROM users WHERE voto != '1' OR voto IS NULL");
        $query->execute();
        return $query->fetchAll(PDO::FETCH_ASSOC);
    }

    public function limpiarVotos()
    {
        $db = $this->DB();
        $query = $db->prepare("UPDATE users SET voto = NULL, registro = NULL");
        return $query->execute();
    }

    // ================================================================
    // SPRINT 3: MÉTODOS GRACE WINDOW
    // ================================================================

    /**
     * Buscar usuario por token de votación válido.
     * @return object|false
     */
    public function buscarPorToken($token)
    {
        $db = $this->DB();
        $q = $db->prepare("
            SELECT * FROM users
            WHERE token_votacion = :token AND token_expira >= NOW() AND activo = 1
        ");
        $q->execute([":token" => $token]);
        return $q->fetch(\PDO::FETCH_OBJ);
    }

    // ================================================================
    // SPRINT 429: DESBLOQUEO AUTOMÁTICO ZOOM
    // ================================================================

    /**
     * Muta el campo email del delegado agregando o incrementando el sufijo _bvN.
     *
     * Zoom bloquea registros cuando el mismo email supera 3 intentos en el día
     * (HTTP 429). La solución es cambiar el email a una variante con sufijo _bvN,
     * lo que hace que Zoom lo trate como registrante nuevo.
     *
     * Secuencia de mutaciones:
     *   abc@dominio.co  →  abc_bv1@dominio.co  →  ...  →  abc_bv9@dominio.co
     *   abc_bv9@...     →  false  (límite — solo soporte manual)
     *   10 emails × 3 intentos Zoom = 30 intentos totales por delegado por día.
     *
     * Lookup por columna password (= código de acceso del delegado),
     * igual que el flujo de registro_quorum.php.
     *
     * @param  string       $codigo  Código de acceso del delegado (columna password)
     * @return string|false          Nuevo email si se mutó, false si se alcanzó el límite
     */
    public function mutarEmailZoom($codigo)
    {
        $db = $this->DB();

        $q = $db->prepare(
            "SELECT user_id, email FROM users WHERE password = :pass AND activo = 1 LIMIT 1"
        );
        $q->execute([':pass' => $codigo]);
        $row = $q->fetch(\PDO::FETCH_OBJ);

        if (!$row || empty($row->email)) {
            return false;
        }

        $emailActual = $row->email;

        // Separar parte local y dominio
        $atPos = strrpos($emailActual, '@');
        if ($atPos === false) {
            return false;
        }
        $local  = substr($emailActual, 0, $atPos);   // ej: "12345678" o "12345678_bv1"
        $domain = substr($emailActual, $atPos);       // ej: "@fondoenergia.co"

        // Detectar si ya tiene sufijo _bvN e incrementarlo
        if (preg_match('/^(.+)_bv(\d+)$/', $local, $m)) {
            $base = $m[1];
            $n    = (int)$m[2];
            if ($n >= 9) {
                // Límite de rotaciones alcanzado
                file_put_contents(
                    __DIR__ . '/../../zoom_debug.log',
                    date('c') . " [WARN] mutarEmailZoom: límite (_bv9) alcanzado"
                             . " | codigo=$codigo | email=$emailActual\n",
                    FILE_APPEND
                );
                return false;
            }
            $nuevoLocal = $base . '_bv' . ($n + 1);
        } else {
            // Primera mutación: agregar _bv1
            $nuevoLocal = $local . '_bv1';
        }

        $nuevoEmail = $nuevoLocal . $domain;

        $upd = $db->prepare(
            "UPDATE users SET email = :email WHERE password = :pass AND activo = 1"
        );
        $upd->execute([':email' => $nuevoEmail, ':pass' => $codigo]);

        file_put_contents(
            __DIR__ . '/../../zoom_debug.log',
            date('c') . " [INFO] mutarEmailZoom: $emailActual → $nuevoEmail | codigo=$codigo\n",
            FILE_APPEND
        );

        return $nuevoEmail;
    }
}
