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

class AsignarMateriaController
{
    private $db;

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

    // Listar todas las materias
    public function listarMaterias()
    {
        try {
            $query = "SELECT * FROM materias";
            $stmt = $this->db->prepare($query);
            $stmt->execute();
            return $stmt->fetchAll(PDO::FETCH_ASSOC);
        } catch (PDOException $e) {
            error_log("Error al listar materias: " . $e->getMessage());
            return [];
        }
    }

    // Listar todos los docentes
    public function listarDocentes()
    {
        try {
            $query = "SELECT cod_docente_int AS docente_id, nombre_docente_varchar AS docente_nombre FROM docentes";
            $stmt = $this->db->prepare($query);
            $stmt->execute();
            return $stmt->fetchAll(PDO::FETCH_ASSOC);
        } catch (PDOException $e) {
            error_log("Error al listar docentes: " . $e->getMessage());
            return [];
        }
    }

    // Listar estudiantes por carrera
    public function listarEstudiantesPorCarrera($carrera_id)
    {
        try {
            $query = "SELECT idRegistro AS id, nombre_varchar AS nombre FROM students WHERE cod_carrera_int = :carrera_id";
            $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 estudiantes: " . $e->getMessage());
            return [];
        }
    }

    // Asignar estudiante y docente a una materia
    public function asignarMateria($materia_id, $student_id, $docente_id)
    {
        try {
            // Verificar si ya existe una asignación para el mismo estudiante, materia y docente
            $query = "SELECT COUNT(*) AS total FROM asignar_materias WHERE materia_id = :materia_id AND student_id = :student_id AND docente_id = :docente_id";
            $stmt = $this->db->prepare($query);
            $stmt->bindParam(':materia_id', $materia_id);
            $stmt->bindParam(':student_id', $student_id);
            $stmt->bindParam(':docente_id', $docente_id);
            $stmt->execute();
            $result = $stmt->fetch(PDO::FETCH_ASSOC);

            if ($result['total'] > 0) {
                // Ya existe una asignación duplicada
                echo "<script>alert('Error: Ya existe una asignación para el mismo estudiante, materia y docente.');</script>";
                return false;
            }

            // Si no existe asignación duplicada, proceder a insertar la nueva asignación
            $query = "INSERT INTO asignar_materias (materia_id, student_id, docente_id, fecha_asignacion, estado) 
                    VALUES (:materia_id, :student_id, :docente_id, NOW(), 1)";
            $stmt = $this->db->prepare($query);
            $stmt->bindParam(':materia_id', $materia_id);
            $stmt->bindParam(':student_id', $student_id);
            $stmt->bindParam(':docente_id', $docente_id);
            $stmt->execute();
            return true;
        } catch (PDOException $e) {
            error_log("Error al asignar materia: " . $e->getMessage());
            return false;
        }
    }


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

    public function listarAsignaciones()
    {
        try {
            $query = "SELECT 
                        a.id, 
                        e.sname AS estudiante_nombre, 
                        d.nombres_varchar AS docente_nombre, 
                        m.nombre_mat_varchar AS materia_nombre, 
                        a.fecha_asignacion, 
                        a.estado 
                    FROM asignar_materias a
                    JOIN student e ON a.student_id = e.idRegistro
                    JOIN docentes d ON a.docente_id = d.cod_docente_int
                    JOIN materias m ON a.materia_id = m.codigo_reg_int";
            $stmt = $this->db->prepare($query);
            $stmt->execute();
            return $stmt->fetchAll(PDO::FETCH_ASSOC);
        } catch (PDOException $e) {
            error_log("Error al listar asignaciones: " . $e->getMessage());
            return [];
        }
    }

    public function agregarAsignacion($student_id, $docente_id, $materia_id, $fecha_asignacion, $estado)
    {
        try {
            // Verificar si ya existe una asignación para el mismo estudiante, materia y docente
            $query = "SELECT COUNT(*) AS total FROM asignar_materias WHERE materia_id = :materia_id AND student_id = :student_id AND docente_id = :docente_id";
            $stmt = $this->db->prepare($query);
            $stmt->bindParam(':materia_id', $materia_id);
            $stmt->bindParam(':student_id', $student_id);
            $stmt->bindParam(':docente_id', $docente_id);
            $stmt->execute();
            $result = $stmt->fetch(PDO::FETCH_ASSOC);

            if ($result['total'] > 0) {
                // Ya existe una asignación duplicada
                echo "<script>alert('Error: Ya existe una asignación para el mismo estudiante, materia y docente.');</script>";
                return false;
            }

            // Si no existe asignación duplicada, proceder a insertar la nueva asignación
            $query = "INSERT INTO asignar_materias (student_id, docente_id, materia_id, fecha_asignacion, estado) 
                    VALUES (:student_id, :docente_id, :materia_id, :fecha_asignacion, :estado)";
            $stmt = $this->db->prepare($query);
            $stmt->bindParam(':student_id', $student_id);
            $stmt->bindParam(':docente_id', $docente_id);
            $stmt->bindParam(':materia_id', $materia_id);
            $stmt->bindParam(':fecha_asignacion', $fecha_asignacion);
            $stmt->bindParam(':estado', $estado);
            $stmt->execute();
            return true;
        } catch (PDOException $e) {
            error_log("Error al agregar asignación: " . $e->getMessage());
            return false;
        }
    }


    public function actualizarAsignacion($id, $student_id, $docente_id, $materia_id, $fecha_asignacion, $estado)
    {
        try {
            // Verificar si ya existe una asignación para el mismo estudiante, materia y docente, excluyendo la actual
            $query = "SELECT COUNT(*) AS total FROM asignar_materias WHERE materia_id = :materia_id AND student_id = :student_id AND docente_id = :docente_id AND id != :id";
            $stmt = $this->db->prepare($query);
            $stmt->bindParam(':materia_id', $materia_id);
            $stmt->bindParam(':student_id', $student_id);
            $stmt->bindParam(':docente_id', $docente_id);
            $stmt->bindParam(':id', $id);
            $stmt->execute();
            $result = $stmt->fetch(PDO::FETCH_ASSOC);

            if ($result['total'] > 0) {
                // Ya existe una asignación duplicada
                echo "<script>alert('Error: Ya existe una asignación para el mismo estudiante, materia y docente.');</script>";
                return false;
            }

            // Si no existe asignación duplicada, proceder a actualizar la asignación
            $query = "UPDATE asignar_materias 
                    SET student_id = :student_id, docente_id = :docente_id, materia_id = :materia_id, fecha_asignacion = :fecha_asignacion, estado = :estado 
                    WHERE id = :id";
            $stmt = $this->db->prepare($query);
            $stmt->bindParam(':id', $id);
            $stmt->bindParam(':student_id', $student_id);
            $stmt->bindParam(':docente_id', $docente_id);
            $stmt->bindParam(':materia_id', $materia_id);
            $stmt->bindParam(':fecha_asignacion', $fecha_asignacion);
            $stmt->bindParam(':estado', $estado);
            $stmt->execute();
            return true;
        } catch (PDOException $e) {
            error_log("Error al actualizar asignación: " . $e->getMessage());
            return false;
        }
    }



    public function obtenerAsignacionPorId($id)
    {
        try {
            $query = "SELECT 
                        a.id, 
                        a.student_id, 
                        e.sname AS estudiante_nombre, 
                        a.docente_id, 
                        d.nombres_varchar AS docente_nombre, 
                        a.materia_id, 
                        m.nombre_mat_varchar AS materia_nombre, 
                        a.fecha_asignacion, 
                        a.estado 
                    FROM asignar_materias a
                    JOIN student e ON a.student_id = e.idRegistro
                    JOIN docentes d ON a.docente_id = d.cod_docente_int
                    JOIN materias m ON a.materia_id = m.codigo_reg_int
                    WHERE a.id = :id";
            $stmt = $this->db->prepare($query);
            $stmt->bindParam(':id', $id);
            $stmt->execute();
            return $stmt->fetch(PDO::FETCH_ASSOC);
        } catch (PDOException $e) {
            error_log("Error al obtener asignación por ID: " . $e->getMessage());
            return null;
        }
    }
}
?>
