<?php
include_once __DIR__ . '/../config/database.php';

class MateriaController
{
    private $db;

    public function __construct()
    {
        $database = new Database();
        $this->db = $database->getConnection();
    }

    public function listarMaterias($carrera_id = null)
    {
        try {
            $query = "SELECT 
                        m.codigo_reg_int AS materia_id,
                        m.nombre_mat_varchar AS materia_nombre,
                        m.semestre,
                        mo.modalidad AS modalidad_nombre,
                        t.turno AS turno_nombre,
                        c.carrera AS carrera_nombre,
                        GROUP_CONCAT(CONCAT(h.dia, ' ', TIME_FORMAT(h.hora_ingreso, '%H:%i'), '-', TIME_FORMAT(h.hora_salida, '%H:%i')) SEPARATOR '; ') AS horarios
                    FROM 
                        materias m
                    JOIN 
                        modalidad mo ON m.modalidad_id = mo.id
                    JOIN 
                        turnos t ON m.turno_id = t.id
                    JOIN 
                        carrera c ON m.cod_carrera_int = c.id
                    LEFT JOIN 
                        materia_horarios h ON m.codigo_reg_int = h.materia_id";

            if (!is_null($carrera_id)) {
                $query .= " WHERE m.cod_carrera_int = :carrera_id";
            }

            $query .= " GROUP BY m.codigo_reg_int, m.nombre_mat_varchar, m.semestre, mo.modalidad, t.turno, c.carrera";

            $stmt = $this->db->prepare($query);

            if (!is_null($carrera_id)) {
                $stmt->bindParam(':carrera_id', $carrera_id, PDO::PARAM_INT);
            }

            $stmt->execute();

            $materias = $stmt->fetchAll(PDO::FETCH_ASSOC);

            return $materias;
        } catch (PDOException $e) {
            error_log("Error al listar materias: " . $e->getMessage());
            return [];
        }
    }


    
    

    public function agregarMateria($cod_carrera_int, $codigo_mat_int, $sigla_mat_varchar, $nombre_mat_varchar, $codigo_nivel_int, $estado_bt, $sucursal_varchar, $semestre, $modalidad_id, $turno_id, $horarios)
    {
        try {
            // Insertar en la tabla materias
            $query = "INSERT INTO materias (cod_carrera_int, codigo_mat_int, sigla_mat_varchar, nombre_mat_varchar, codigo_nivel_int, estado_bt, sucursal_varchar, semestre, modalidad_id, turno_id) 
                      VALUES (:cod_carrera_int, :codigo_mat_int, :sigla_mat_varchar, :nombre_mat_varchar, :codigo_nivel_int, :estado_bt, :sucursal_varchar, :semestre, :modalidad_id, :turno_id)";
            $stmt = $this->db->prepare($query);
            $stmt->bindParam(':cod_carrera_int', $cod_carrera_int);
            $stmt->bindParam(':codigo_mat_int', $codigo_mat_int);
            $stmt->bindParam(':sigla_mat_varchar', $sigla_mat_varchar);
            $stmt->bindParam(':nombre_mat_varchar', $nombre_mat_varchar);
            $stmt->bindParam(':codigo_nivel_int', $codigo_nivel_int);
            $stmt->bindParam(':estado_bt', $estado_bt);
            $stmt->bindParam(':sucursal_varchar', $sucursal_varchar);
            $stmt->bindParam(':semestre', $semestre);
            $stmt->bindParam(':modalidad_id', $modalidad_id);
            $stmt->bindParam(':turno_id', $turno_id);
            $stmt->execute();
    
            // Obtener el ID de la materia recién creada
            $materia_id = $this->db->lastInsertId();
    
            // Insertar horarios en la tabla materia_horarios
            $query_horarios = "INSERT INTO materia_horarios (materia_id, dia, hora_ingreso, hora_salida) 
                               VALUES (:materia_id, :dia, :hora_ingreso, :hora_salida)";
            $stmt_horarios = $this->db->prepare($query_horarios);
    
            foreach ($horarios as $horario) {
                $stmt_horarios->bindParam(':materia_id', $materia_id);
                $stmt_horarios->bindParam(':dia', $horario['dia']);
                $stmt_horarios->bindParam(':hora_ingreso', $horario['hora_ingreso']);
                $stmt_horarios->bindParam(':hora_salida', $horario['hora_salida']);
                $stmt_horarios->execute();
            }
    
            return true;
        } catch (PDOException $e) {
            error_log("Error al agregar materia: " . $e->getMessage());
            return false;
        }
    }
    

    public function actualizarMateria($codigo_reg_int, $nombre_mat_varchar, $semestre, $modalidad_id, $turno_id, $horarios)
    {
        try {
            // Actualizar los datos principales de la materia
            $query = "UPDATE materias 
                    SET nombre_mat_varchar = :nombre_mat_varchar,
                        semestre = :semestre,
                        modalidad_id = :modalidad_id,
                        turno_id = :turno_id
                    WHERE codigo_reg_int = :codigo_reg_int";
            $stmt = $this->db->prepare($query);
            $stmt->bindParam(':codigo_reg_int', $codigo_reg_int);
            $stmt->bindParam(':nombre_mat_varchar', $nombre_mat_varchar);
            $stmt->bindParam(':semestre', $semestre);
            $stmt->bindParam(':modalidad_id', $modalidad_id);
            $stmt->bindParam(':turno_id', $turno_id);
            $stmt->execute();

            // Gestionar los horarios
            $query_delete = "DELETE FROM materia_horarios WHERE materia_id = :materia_id";
            $stmt_delete = $this->db->prepare($query_delete);
            $stmt_delete->bindParam(':materia_id', $codigo_reg_int);
            $stmt_delete->execute();

            $query_insert = "INSERT INTO materia_horarios (materia_id, dia, hora_ingreso, hora_salida) 
                            VALUES (:materia_id, :dia, :hora_ingreso, :hora_salida)";
            $stmt_insert = $this->db->prepare($query_insert);

            foreach ($horarios as $horario) {
                $stmt_insert->bindParam(':materia_id', $codigo_reg_int);
                $stmt_insert->bindParam(':dia', $horario['dia']);
                $stmt_insert->bindParam(':hora_ingreso', $horario['hora_ingreso']);
                $stmt_insert->bindParam(':hora_salida', $horario['hora_salida']);
                $stmt_insert->execute();
            }

            return true;
        } catch (PDOException $e) {
            error_log("Error al actualizar materia: " . $e->getMessage());
            return false;
        }
    }



    public function agregarHorarios($materia_id, $horarios)
    {
        try {
            // Eliminar horarios existentes para la materia
            $query_delete = "DELETE FROM materia_horarios WHERE materia_id = :materia_id";
            $stmt_delete = $this->db->prepare($query_delete);
            $stmt_delete->bindParam(':materia_id', $materia_id);
            $stmt_delete->execute();

            // Insertar nuevos horarios
            $query_insert = "INSERT INTO materia_horarios (materia_id, dia, hora_ingreso, hora_salida) 
                            VALUES (:materia_id, :dia, :hora_ingreso, :hora_salida)";
            $stmt_insert = $this->db->prepare($query_insert);

            foreach ($horarios as $horario) {
                $stmt_insert->bindParam(':materia_id', $materia_id);
                $stmt_insert->bindParam(':dia', $horario['dia']);
                $stmt_insert->bindParam(':hora_ingreso', $horario['hora_ingreso']);
                $stmt_insert->bindParam(':hora_salida', $horario['hora_salida']);
                $stmt_insert->execute();
            }

            return true;
        } catch (PDOException $e) {
            error_log("Error al agregar horarios: " . $e->getMessage());
            return false;
        }
    }



    public function obtenerMateriaPorId($codigo_reg_int)
    {
        try {
            $query = "SELECT * FROM materias WHERE codigo_reg_int = :codigo_reg_int";
            $stmt = $this->db->prepare($query);
            $stmt->bindParam(':codigo_reg_int', $codigo_reg_int);
            $stmt->execute();
            return $stmt->fetch(PDO::FETCH_ASSOC);
        } catch (PDOException $e) {
            error_log("Error al obtener materia: " . $e->getMessage());
            return false;
        }
    }

        public function obtenerHorariosPorMateriaId($materia_id)
    {
        try {
            $query = "SELECT dia, hora_ingreso, hora_salida 
                    FROM materia_horarios 
                    WHERE materia_id = :materia_id";
            $stmt = $this->db->prepare($query);
            $stmt->bindParam(':materia_id', $materia_id);
            $stmt->execute();
            return $stmt->fetchAll(PDO::FETCH_ASSOC);
        } catch (PDOException $e) {
            error_log("Error al obtener horarios: " . $e->getMessage());
            return [];
        }
    }

    public function listarMateriasPorCarrera($carrera_id)
    {
        try {
            $query = "SELECT 
                        m.codigo_reg_int AS materia_id,
                        m.nombre_mat_varchar AS nombre,
                        m.semestre,
                        mo.modalidad AS modalidad,
                        t.turno AS turno,
                        GROUP_CONCAT(CONCAT(h.dia, ' ', TIME_FORMAT(h.hora_ingreso, '%H:%i'), '-', TIME_FORMAT(h.hora_salida, '%H:%i')) SEPARATOR '; ') AS horarios
                      FROM 
                        materias m
                      JOIN 
                        modalidad mo ON m.modalidad_id = mo.id
                      JOIN 
                        turnos t ON m.turno_id = t.id
                      LEFT JOIN 
                        materia_horarios h ON m.codigo_reg_int = h.materia_id
                      WHERE 
                        m.cod_carrera_int = :carrera_id
                      GROUP BY 
                        m.codigo_reg_int, m.nombre_mat_varchar, m.semestre, mo.modalidad, t.turno";
    
            $stmt = $this->db->prepare($query);
            $stmt->bindParam(':carrera_id', $carrera_id);
            $stmt->execute();
            return $stmt->fetchAll(PDO::FETCH_ASSOC);
        } catch (PDOException $e) {
            error_log("Error al listar materias por carrera: " . $e->getMessage());
            return [];
        }
    }
    


}
?>
