<?php
// modelos/Tutorial.php
//
// Modelo para el sistema de onboarding/tutorial guiado.
// Se apoya en las columnas `tutorial_visto` (TINYINT) y `tutorial_progreso` (TEXT)
// de la tabla `usuario`, agregadas por sql/tutorial_onboarding.sql.
//
// IMPORTANTE — degradación elegante:
// Los bloques try/catch en cada método son INTENCIONALES, no descuido.
// Si la migración sql/tutorial_onboarding.sql aún no fue aplicada en este
// tenant, las columnas `tutorial_visto` y `tutorial_progreso` no existen y la
// query MySQL falla. En PHP 8, ese fallo de query encadena un Error fatal
// (`fetch_assoc() on bool`) que el operador "@" NO atrapa — solo try/catch
// sobre \Throwable lo hace. La política aquí es: si la migración no está
// aplicada, el sistema sigue funcionando con tutorial_visto=0 y el tour
// simplemente vuelve a ofrecerse en cada login (comportamiento aceptable
// hasta que el administrador ejecute la migración manualmente).

require_once __DIR__ . "/../config/Conexion.php";

class Tutorial
{
    public function __construct() {}

    public function estado($idusuario)
    {
        $idusuario = (int)$idusuario;
        $sql = "SELECT tutorial_visto, tutorial_progreso
                FROM usuario
                WHERE idusuario = $idusuario
                LIMIT 1";
        $row = null;
        try {
            $row = @ejecutarConsultaSimpleFila($sql);
        } catch (\Throwable $e) {
            $row = null;
        }
        if (!$row) {
            return [
                "tutorial_visto"    => 0,
                "tutorial_progreso" => null
            ];
        }
        return [
            "tutorial_visto"    => isset($row['tutorial_visto']) ? (int)$row['tutorial_visto'] : 0,
            "tutorial_progreso" => isset($row['tutorial_progreso']) ? $row['tutorial_progreso'] : null
        ];
    }

    public function marcarVisto($idusuario)
    {
        $idusuario = (int)$idusuario;
        try {
            $r = @updateTableRow("usuario", ["tutorial_visto" => 1], "idusuario = $idusuario");
        } catch (\Throwable $e) {
            return false;
        }
        return $r === "Exito!";
    }

    public function reset($idusuario)
    {
        $idusuario = (int)$idusuario;
        try {
            $r = @updateTableRow("usuario", [
                "tutorial_visto"    => 0,
                "tutorial_progreso" => null
            ], "idusuario = $idusuario");
        } catch (\Throwable $e) {
            return false;
        }
        return $r === "Exito!";
    }

    public function guardarProgreso($idusuario, $progresoJson)
    {
        $idusuario    = (int)$idusuario;
        $progresoJson = mb_substr((string)$progresoJson, 0, 2000);
        try {
            $r = @updateTableRow("usuario", ["tutorial_progreso" => $progresoJson], "idusuario = $idusuario");
        } catch (\Throwable $e) {
            return false;
        }
        return $r === "Exito!";
    }
}
?>
