<?php
// controlador/RubricaController.php

// Cargar el archivo Db.php desde la carpeta modelo
require_once __DIR__ . "/../modelo/Db.php";

// Si la clase dentro de Db.php se llama clsbdd, creamos un alias seguro para Db
if (class_exists('clsbdd') && !class_exists('Db')) {
    class_alias('clsbdd', 'Db');
}

class RubricaController {
    private $db;

    public function __construct() {
        // Instanciar la clase de conexión
        $this->db = new Db(); 
    }

    // --- LEER DATOS ---
    public function obtenerNiveles() {
        $sql = "SELECT * FROM bas_rubrica_niveles ORDER BY niv_id ASC";
        return $this->db->ejecutar_array($sql);
    }

    public function obtenerComponentesPorNivel($niv_id) {
        $niv_id = intval($niv_id);
        $sql = "SELECT c.*, t.tip_nombre FROM bas_rubrica_componentes c 
                LEFT JOIN bas_juzgamiento_tipos t ON c.tip_id = t.tip_id 
                WHERE c.niv_id = $niv_id ORDER BY c.com_id ASC";
        return $this->db->ejecutar_array($sql);
    }

    public function obtenerItemsPorComponente($com_id) {
        $com_id = intval($com_id);
        $sql = "SELECT * FROM bas_rubrica_items WHERE com_id = $com_id ORDER BY itm_id ASC";
        return $this->db->ejecutar_array($sql);
    }

    public function obtenerTiposJuzgamiento() {
        $sql = "SELECT * FROM bas_juzgamiento_tipos ORDER BY tip_id ASC";
        return $this->db->ejecutar_array($sql);
    }

    // --- OPERACIONES DE AGREGAR (INSERT) ---
    public function agregarComponente($niv_id, $tip_id, $com_nombre, $com_puntaje_max, $com_estado) {
        $niv_id = intval($niv_id);
        $tip_id = intval($tip_id);
        $com_puntaje_max = floatval($com_puntaje_max);
        $com_estado = intval($com_estado);
        $com_nombre_esc = $this->db->esc($com_nombre);

        $this->db->carga_campos("niv_id, tip_id, com_nombre, com_puntaje_max, com_estado");
        $this->db->carga_valores("$niv_id, $tip_id, '$com_nombre_esc', $com_puntaje_max, $com_estado");
        return $this->db->insertar("bas_rubrica_componentes");
    }

    public function agregarItem($com_id, $itm_descripcion, $itm_estado) {
        $com_id = intval($com_id);
        $itm_estado = intval($itm_estado);
        $itm_desc_esc = $this->db->esc($itm_descripcion);

        $this->db->carga_campos("com_id, itm_descripcion, itm_estado");
        $this->db->carga_valores("$com_id, '$itm_desc_esc', $itm_estado");
        return $this->db->insertar("bas_rubrica_items");
    }
    // --- AÑADIR A RubricaController.php ---
    
    public function agregarNivel($niv_nombre, $niv_estado = 1) {
        $niv_nombre_esc = $this->db->esc($niv_nombre);
        $niv_estado = intval($niv_estado);
    
        $this->db->carga_campos("niv_nombre, niv_estado");
        $this->db->carga_valores("'$niv_nombre_esc', $niv_estado");
        return $this->db->insertar("bas_rubrica_niveles");
    }
    
    public function editarNivel($niv_id, $niv_nombre, $niv_estado) {
        $niv_id = intval($niv_id);
        $niv_estado = intval($niv_estado);
        $niv_nombre_esc = $this->db->esc($niv_nombre);
    
        $this->db->carga_campos("niv_nombre = '$niv_nombre_esc', niv_estado = $niv_estado");
        $this->db->carga_valores("niv_id = $niv_id");
        return $this->db->actualizar("bas_rubrica_niveles");
    }
    
    public function eliminarNivel($niv_id) {
        $niv_id = intval($niv_id);
        // Eliminar también los componentes e ítems en cascada asociados
        $componentes = $this->obtenerComponentesPorNivel($niv_id);
        foreach ($componentes as $com) {
            $this->eliminarComponente($com['com_id']);
        }
        return $this->db->ejecutar("DELETE FROM bas_rubrica_niveles WHERE niv_id = $niv_id");
    }
    // --- OPERACIONES DE EDICIÓN (UPDATE) ---
    public function editarComponente($com_id, $tip_id, $com_nombre, $com_puntaje_max, $com_estado) {
        $com_id = intval($com_id);
        $tip_id = intval($tip_id);
        $com_puntaje_max = floatval($com_puntaje_max);
        $com_estado = intval($com_estado);
        $com_nombre_esc = $this->db->esc($com_nombre);

        $this->db->carga_campos("tip_id = $tip_id, com_nombre = '$com_nombre_esc', com_puntaje_max = $com_puntaje_max, com_estado = $com_estado");
        $this->db->carga_valores("com_id = $com_id");
        return $this->db->actualizar("bas_rubrica_componentes");
    }

    public function editarItem($itm_id, $itm_descripcion, $itm_estado) {
        $itm_id = intval($itm_id);
        $itm_estado = intval($itm_estado);
        $itm_desc_esc = $this->db->esc($itm_descripcion);

        $this->db->carga_campos("itm_descripcion = '$itm_desc_esc', itm_estado = $itm_estado");
        $this->db->carga_valores("itm_id = $itm_id");
        return $this->db->actualizar("bas_rubrica_items");
    }

    // --- OPERACIONES DE ELIMINACIÓN (DELETE) ---
    public function eliminarComponente($com_id) {
        $com_id = intval($com_id);
        $this->db->ejecutar("DELETE FROM bas_rubrica_items WHERE com_id = $com_id");
        return $this->db->ejecutar("DELETE FROM bas_rubrica_componentes WHERE com_id = $com_id");
    }

    public function eliminarItem($itm_id) {
        $itm_id = intval($itm_id);
        return $this->db->ejecutar("DELETE FROM bas_rubrica_items WHERE itm_id = $itm_id");
    }
}