<?php
if (session_status() === PHP_SESSION_NONE) { 
    session_start(); 
}

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

if (!isset($_SESSION['usu_id'])) {
    echo '<div class="alert alert-danger small p-2 mb-0">⚠️ Error: Sesión expirada. Por favor, <a href="/stage/login.php">inicie sesión nuevamente</a>.</div>';
    exit();
}

$id_juez_sesion = intval($_SESSION['usu_id']);
$bd = new clsbdd();
$tipo_juez_sesion = $_SESSION['usu_tipo_juez'] ?? 'TODOS'; 

$mensaje = '';
$tipo_mensaje = '';
$evento_recargado = ''; 
$guardado_exitoso_js = false; 
$participante_evaluado_js = 0;

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'guardar_calificacion_detallada') {
    
    $ins_id = isset($_POST['participante_id']) ? intval($_POST['participante_id']) : 0;
    $usu_id = isset($id_juez_sesion) ? intval($id_juez_sesion) : 0; 
    $evento_recargado = isset($_POST['evento_id']) ? intval($_POST['evento_id']) : ''; 
    $tiempo_registro = $_POST['tiempo_empleado'] ?? '00:00';
    $observaciones = htmlspecialchars(trim($_POST['observaciones'] ?? ''), ENT_QUOTES, 'UTF-8');

    if ($ins_id <= 0 || $usu_id <= 0) {
        $mensaje = "ID de inscripción o sesión de juez no válidos.";
        $tipo_mensaje = "danger";
    } else {
        $pnt_estilo = 0.00;       
        $pnt_dificultad = 0.00;   
        $total_penalidades = 0.00;
        $desglose_detallado = [];
        $componentes_valores = [];

        if (isset($_POST['componentes']) && is_array($_POST['componentes'])) {
            $com_ids_raw = array_keys($_POST['componentes']);
            $com_ids_clean = array_map('intval', $com_ids_raw);
            
            if (!empty($com_ids_clean)) {
                $lista_ids_sql = implode(',', $com_ids_clean);
                
                $sql_bulk_c = "SELECT c.com_id, c.com_nombre, t.tip_nombre 
                               FROM bas_rubrica_componentes c
                               INNER JOIN bas_juzgamiento_tipos t ON c.tip_id = t.tip_id
                               WHERE c.com_id IN ($lista_ids_sql)";
                
                $res_bulk = $bd->ejecutar_array($sql_bulk_c);
                $mapa_componentes = [];
                if (!empty($res_bulk)) {
                    foreach ($res_bulk as $item) {
                        $mapa_componentes[intval($item['com_id'])] = $item;
                    }
                }

                foreach ($_POST['componentes'] as $com_id => $valor) {
                    $com_id = intval($com_id);
                    $valor_calificado = floatval($valor);
                    $componentes_valores[$com_id] = $valor_calificado;

                    if (isset($mapa_componentes[$com_id])) {
                        $comp = $mapa_componentes[$com_id];
                        $tipo_comp = strtoupper(trim($comp['tip_nombre']));
                        
                        if ($tipo_comp === 'TÉCNICO' || $tipo_comp === 'TECNICO') $pnt_estilo += $valor_calificado;
                        if ($tipo_comp === 'COREOGRÁFICO' || $tipo_comp === 'COREOGRAFICO') $pnt_dificultad += $valor_calificado;
                        if ($tipo_comp === 'PENALIDADES') $total_penalidades += $valor_calificado;
                        
                        $desglose_detallado[] = "{$comp['com_nombre']}: {$valor_calificado}";
                    }
                }
            }
        }
        
        $cadena_desglose = "[Juez: $tipo_juez_sesion][Tiempo: {$tiempo_registro}] [" . implode(', ', $desglose_detallado) . "] - Obs: " . $observaciones;
        $cal_observaciones = $bd->esc($cadena_desglose);
        $cal_total = max(0, ($pnt_estilo + $pnt_dificultad) - $total_penalidades);

        // CABECERA: Forzamos la inserción o actualización aprovechando el índice UNIQUE `juez_por_presentacion`
        $sql_cabecera = "INSERT INTO bas_calificaciones_jueces 
                         (ins_id, usu_id, pnt_estilo, pnt_precision, pnt_ritmo, pnt_sincronizacion, pnt_dificultad, pen_caida_baston, pen_cruze_padres, pen_gritos, cal_total, cal_observaciones, updated_at) 
                         VALUES 
                         ($ins_id, $usu_id, $pnt_estilo, 0, 0, 0, $pnt_dificultad, 0, 0, 0, $cal_total, '$cal_observaciones', NOW())
                         ON DUPLICATE KEY UPDATE 
                         pnt_estilo = $pnt_estilo,
                         pnt_dificultad = $pnt_dificultad,
                         cal_total = $cal_total,
                         cal_observaciones = '$cal_observaciones',
                         updated_at = NOW()";

        $res_cabecera = $bd->ejecutar($sql_cabecera);

        if ($res_cabecera) {
            // Obtenemos el `cal_id` de manera segura e infalible
            $res_id = $bd->ejecutar_array("SELECT cal_id FROM bas_calificaciones_jueces WHERE ins_id = $ins_id AND usu_id = $usu_id LIMIT 1");
            $cal_id_real = !empty($res_id) ? intval($res_id[0]['cal_id']) : 0;

            if ($cal_id_real > 0 && !empty($componentes_valores)) {
                // DETALLES: Guardamos cada componente usando el índice UNIQUE `cal_componente`[cite: 1]
                foreach ($componentes_valores as $com_id => $det_valor) {
                    $sql_det = "INSERT INTO bas_calificaciones_detalles (cal_id, com_id, det_puntaje) 
                                VALUES ($cal_id_real, $com_id, $det_valor)
                                ON DUPLICATE KEY UPDATE det_puntaje = $det_valor";
                    $bd->ejecutar($sql_det);
                }

                // ACTUALIZACIÓN DE PROMEDIOS GENERALES DE LA INSCRIPCIÓN
                $resPromedio = $bd->ejecutar_array("SELECT ROUND(AVG(cal_total), 2) as promedio_general FROM bas_calificaciones_jueces WHERE ins_id = $ins_id");
                $promedio_final = !empty($resPromedio) ? $resPromedio[0]['promedio_general'] : 0.00;

                $bd->ejecutar("UPDATE bas_inscripciones_niveles SET puntaje_final = '$promedio_final', calificado = 1 WHERE ins_id = $ins_id");

                $mensaje = "Evaluación guardada con éxito.";
                $tipo_mensaje = "success";
                $guardado_exitoso_js = true;
                $participante_evaluado_js = $ins_id;
            } else {
                $mensaje = "Error al recuperar el ID de la cabecera para los detalles.";
                $tipo_mensaje = "danger";
            }
        } else {
            $mensaje = "Error al almacenar la cabecera de calificación.";
            $tipo_mensaje = "danger";
        }
    }
}
?>