<?php
// vista/eventos_propios/get_resultados_categoria.php
date_default_timezone_set('America/Guayaquil');

ini_set('display_errors', 0);
error_reporting(E_ALL);

header('Content-Type: application/json; charset=utf-8');

try {
    require_once __DIR__ . "/../../modelo/Db.php";
    $bd = new clsbdd();

    $evp_id = isset($_GET['evp_id']) ? intval($_GET['evp_id']) : 2; 
    $modalidad_buscada = isset($_GET['categoria']) ? trim($_GET['categoria']) : 'SOLISTAS'; 
    $nivel_buscado = isset($_GET['nivel']) ? trim($_GET['nivel']) : ''; 

    $modalidad_escapada = $bd->esc($modalidad_buscada);
    $termino_like = "%" . strtoupper($modalidad_escapada) . "%";

    $where_nivel = "";
    if (!empty($nivel_buscado)) {
        $nivel_escapado = $bd->esc($nivel_buscado);
        $where_nivel = " AND UPPER(iniv.niv_categoria) LIKE UPPER('%$nivel_escapado%') ";
    }

    // Consulta SQL Original (Garantiza que cargue el podio sin errores)
    $sql = "SELECT 
                iniv.niv_id,
                ai.ins_id,
                ai.ins_nombre_academia AS registro_participante,
                ai.ins_responsable AS institucion_responsable,
                iniv.niv_categoria AS subcategoria_nivel,
                COUNT(DISTINCT cj.cal_id) AS total_jueces_votaron
            FROM bas_inscripciones_niveles iniv
            INNER JOIN bas_academias_inscritas ai ON iniv.ins_id = ai.ins_id
            LEFT JOIN bas_calificaciones_jueces cj ON (cj.ins_id = iniv.ins_id OR cj.ins_id = ai.ins_id)
            WHERE ai.evp_id = $evp_id 
              AND (
                  UPPER(ai.ins_nombre_academia) LIKE UPPER('$termino_like')
                  OR UPPER(iniv.niv_categoria) LIKE UPPER('$termino_like')
              )
              $where_nivel
            GROUP BY iniv.niv_id, ai.ins_id, ai.ins_nombre_academia, ai.ins_responsable, iniv.niv_categoria";

    $filas = $bd->ejecutar_array($sql);

    $podio_raw = [];
    $podio_final = [];
    $total_global = 0;
    $evaluados_global = 0;

    if (!empty($filas)) {
        foreach ($filas as $fila) {
            $total_global++;
            $ins_id_actual = intval($fila['ins_id']);
            $votaron = intval($fila['total_jueces_votaron']);
            
            if ($votaron > 0) {
                $evaluados_global++;
            }

            // Búsqueda independiente del teléfono para no romper la consulta principal
            $telefono = "";
            $nom_acad_esc = $bd->esc($fila['registro_participante']);
            $sql_tel = "SELECT bas_rep_telefono 
                        FROM bas_bastoneras 
                        WHERE UPPER(CONCAT(TRIM(bas_nombres), ' ', TRIM(bas_apellidos))) LIKE UPPER('%$nom_acad_esc%') 
                           OR TRIM(bas_nombres) LIKE UPPER('%$nom_acad_esc%')
                        LIMIT 1";
            $res_tel = $bd->ejecutar_array($sql_tel);
            if (!empty($res_tel) && isset($res_tel[0]['bas_rep_telefono'])) {
                $telefono = preg_replace('/[^0-9]/', '', $res_tel[0]['bas_rep_telefono']);
            }

            $sql_jueces = "SELECT 
                               cj.cal_id,
                               cj.usu_id,
                               u.usu_nombre AS juez_nombre,
                               u.usu_tipo_juez AS juez_tipo,
                               cj.cal_total,
                               cj.pnt_estilo,
                               cj.pnt_dificultad,
                               cj.pen_caida_baston,
                               cj.pen_cruze_padres,
                               cj.pen_gritos,
                               cj.cal_observaciones
                           FROM bas_calificaciones_jueces cj
                           LEFT JOIN bas_usuarios u ON cj.usu_id = u.usu_id
                           WHERE cj.ins_id = $ins_id_actual
                           ORDER BY cj.usu_id ASC";
                           
            $desglose_jueces_raw = $bd->ejecutar_array($sql_jueces);
            $desglose_jueces = [];
            
            $suma_puntos_positivos = 0;
            $suma_penalidades = 0;

            if (!empty($desglose_jueces_raw)) {
                foreach ($desglose_jueces_raw as $juez) {
                    $tipo_juez = strtoupper(trim(!empty($juez['juez_tipo']) ? $juez['juez_tipo'] : 'GENERAL'));
                    $cal_total_float = (float)$juez['cal_total'];
                    $obs = $juez['cal_observaciones'] ?? '';

                    $penalizacion_columnas = floatval($juez['pen_caida_baston']) + floatval($juez['pen_cruze_padres']) + floatval($juez['pen_gritos']);
                    
                    $penalidad_parseada = 0;
                    if (preg_match_all('/\[(CAÍDA|CAIDA|CRUCE|GRITOS|DESCALIFICACION|FUERA_DE_TIEMPO|SANCION|PENALIZACION)[^\]]*:\s*(\d+(?:\.\d+)?)\]/i', $obs, $coincidencias)) {
                        if (!empty($coincidencias[2])) {
                            foreach ($coincidencias[2] as $val_pen) {
                                $penalidad_parseada += floatval($val_pen);
                            }
                        }
                    }

                    if (strpos($tipo_juez, 'PENALIDADES') !== false) {
                        if ($penalizacion_columnas > 0) {
                            $penalizacion_juez = $penalizacion_columnas;
                        } else if ($penalidad_parseada > 0) {
                            $penalizacion_juez = $penalidad_parseada;
                        } else {
                            $penalizacion_juez = $cal_total_float;
                        }

                        $suma_penalidades += $penalizacion_juez;
                        $puntaje_representativo = -$penalizacion_juez;
                    } else {
                        $suma_puntos_positivos += $cal_total_float;
                        $penalizacion_juez = ($penalizacion_columnas > 0) ? $penalizacion_columnas : $penalidad_parseada;
                        $suma_penalidades += $penalizacion_juez;
                        $puntaje_representativo = $cal_total_float;
                    }

                    $desglose_jueces[] = [
                        "cal_id"        => intval($juez['cal_id']),
                        "juez_id"       => intval($juez['usu_id']),
                        "juez_nombre"   => !empty($juez['juez_nombre']) ? $juez['juez_nombre'] : "Juez #" . $juez['usu_id'],
                        "juez_tipo"     => $tipo_juez,
                        "puntaje"       => number_format((float)$puntaje_representativo, 2, '.', ''),
                        "penalizacion"  => $penalizacion_juez,
                        "observaciones" => $obs
                    ];
                }
            }

            $puntaje_calculado = $suma_puntos_positivos - $suma_penalidades;
            if ($puntaje_calculado < 0) {
                $puntaje_calculado = 0;
            }

            $participante = $fila['registro_participante'];
            $institucion  = !empty($fila['institucion_responsable']) ? $fila['institucion_responsable'] : 'STAGE DANCE CORP';
            $categoria    = $fila['subcategoria_nivel'];
            $puntaje_str  = number_format((float)$puntaje_calculado, 2, '.', '');

            $podio_raw[] = [
                "ins_id"                 => $ins_id_actual,
                "ins_bastonera"          => $participante,
                "ins_institucion"        => $institucion,
                "ins_nivel"              => $categoria,
                "telefono_representante" => $telefono,
                "puntaje_num"            => (float)$puntaje_calculado,
                "puntaje_final"          => $puntaje_str,
                "participante"           => $participante,
                "bastonera"              => $participante,
                "institucion"            => $institucion,
                "categoria"              => $categoria,
                "nivel"                  => $categoria,
                "puntaje"                => $puntaje_str,
                "jueces_calificados"     => $votaron,
                "total_penalidades"      => $suma_penalidades,
                "desglose_jueces"        => $desglose_jueces
            ];
        }

        usort($podio_raw, function($a, $b) {
            if ($a['puntaje_num'] == $b['puntaje_num']) return 0;
            return ($a['puntaje_num'] > $b['puntaje_num']) ? -1 : 1;
        });

        $posicion = 1;
        foreach ($podio_raw as $item) {
            $item['lugar'] = $posicion;
            $item['pos']   = $posicion;
            $podio_final[] = $item;
            $posicion++;
        }
    } else {
        $podio_final = [];
    }

    $es_completado = ($total_global > 0) && ($evaluados_global >= $total_global);
    $porcentaje_progreso = $total_global > 0 ? round(($evaluados_global / $total_global) * 100) : 100;

    echo json_encode([
        "success"    => true,
        "completado" => $es_completado,
        "progreso"   => [
            "porcentaje" => $porcentaje_progreso,
            "evaluados"  => $evaluados_global,
            "total"      => $total_global
        ],
        "podio"      => $podio_final,
        "error"      => ""
    ], JSON_UNESCAPED_UNICODE);

} catch (Exception $e) {
    echo json_encode([
        "success"    => false,
        "completado" => false,
        "progreso"   => [
            "porcentaje" => 0,
            "evaluados"  => 0,
            "total"      => 0
        ],
        "podio"      => [],
        "error"      => $e->getMessage()
    ], JSON_UNESCAPED_UNICODE);
}
?>