<?php
include_once '../../config/Database.php';

class CajaController
{
    private $db;

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

    // Listar estudiantes y mostrar sus ingresos basados en el campo balance
   // Listar estudiantes y mostrar sus ingresos basados en el campo balance
   public function listarEstudiantes()
   {
       try {
           $query = "SELECT idRegistro, Cod_Estu, emailid, sname, ci, balance FROM student";
           $stmt = $this->db->prepare($query);
           $stmt->execute();
           return $stmt->fetchAll(PDO::FETCH_ASSOC);
       } catch (PDOException $e) {
           error_log("Error al listar estudiantes: " . $e->getMessage());
           return [];
       }
   }

   public function listarEstudiantesPorFecha($fecha_inicio, $fecha_fin)
    {
        try {
            $query = "SELECT idRegistro, Cod_Estu, emailid, sname, ci, balance, fecha_reg 
                    FROM student 
                    WHERE DATE(fecha_reg) BETWEEN :fecha_inicio AND :fecha_fin";
            $stmt = $this->db->prepare($query);
            $stmt->bindParam(':fecha_inicio', $fecha_inicio);
            $stmt->bindParam(':fecha_fin', $fecha_fin);
            $stmt->execute();
            return $stmt->fetchAll(PDO::FETCH_ASSOC);
        } catch (PDOException $e) {
            error_log("Error al listar estudiantes por fechas: " . $e->getMessage());
            return [];
        }
    }


    public function buscarEstudiantesPorCI($ci)
    {
        try {
            $query = "SELECT * FROM student WHERE ci = :ci";
            $stmt = $this->db->prepare($query);
            $stmt->bindParam(':ci', $ci);
            $stmt->execute();
            return $stmt->fetchAll(PDO::FETCH_ASSOC);
        } catch (PDOException $e) {
            error_log("Error al buscar estudiantes por CI: " . $e->getMessage());
            return [];
        }
    }

    public function obtenerEstudiantePorId($id)
    {
        try {
            $query = "SELECT * FROM student WHERE idRegistro = :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 estudiante: " . $e->getMessage());
            return null;
        }
    }

    public function actualizarBalance($id, $nuevo_balance)
    {
        try {
            $query = "UPDATE student SET balance = :balance WHERE idRegistro = :id";
            $stmt = $this->db->prepare($query);
            $stmt->bindParam(':balance', $nuevo_balance);
            $stmt->bindParam(':id', $id);
            return $stmt->execute();
        } catch (PDOException $e) {
            error_log("Error al actualizar balance: " . $e->getMessage());
            return false;
        }
    }

    public function registrarDeposito($id_estudiante, $nombre_estudiante, $banco, $fecha_deposito, $monto_deposito, $detalle, $usuario, $sucursal)
    {
        try {
            $query = "INSERT INTO fees_transaction (stdid, nombre_estudiante, paid_deposito, transcation_remark, estado, usuario, otros_ingresos, sucursal_varchar)
                  VALUES (:stdid, :nombre_estudiante, :paid_deposito, :detalle, 1, :usuario, 1, :sucursal)";
            $stmt = $this->db->prepare($query);
            $stmt->bindParam(':stdid', $id_estudiante);
            $stmt->bindParam(':nombre_estudiante', $nombre_estudiante);
            $stmt->bindParam(':paid_deposito', $monto_deposito);
            $stmt->bindParam(':detalle', $detalle);
            $stmt->bindParam(':usuario', $usuario);
            $stmt->bindParam(':sucursal', $sucursal);
            return $stmt->execute();
        } catch (PDOException $e) {
            error_log("Error al registrar depósito: " . $e->getMessage());
            return false;
        }
    }

    public function registrarPago($id, $monto_pagado, $detalle)
    {
        try {
            $query = "INSERT INTO pagos (id_estudiante, monto, detalle) VALUES (:id_estudiante, :monto, :detalle)";
            $stmt = $this->db->prepare($query);
            $stmt->bindParam(':id_estudiante', $id);
            $stmt->bindParam(':monto', $monto_pagado);
            $stmt->bindParam(':detalle', $detalle);
            return $stmt->execute();
        } catch (PDOException $e) {
            error_log("Error al registrar pago: " . $e->getMessage());
            return false;
        }
    }

    public function listarTransaccionesPorFecha($fecha_inicio, $fecha_fin)
    {
        try {
            $query = "SELECT submitdate, paid, paid_deposito, transcation_remark 
                        FROM fees_transaction 
                        WHERE DATE(submitdate) BETWEEN :fecha_inicio AND :fecha_fin AND estado = 1";
            $stmt = $this->db->prepare($query);
            $stmt->bindParam(':fecha_inicio', $fecha_inicio);
            $stmt->bindParam(':fecha_fin', $fecha_fin);
            $stmt->execute();
            return $stmt->fetchAll(PDO::FETCH_ASSOC);
        } catch (PDOException $e) {
            error_log("Error al listar transacciones por fechas: " . $e->getMessage());
            return [];
        }
    }


    public function obtenerUltimoStdId()
    {
        try {
            $query = "SELECT MAX(CAST(stdid AS UNSIGNED)) AS ultimo_id FROM fees_transaction";
            $stmt = $this->db->prepare($query);
            $stmt->execute();
            $resultado = $stmt->fetch(PDO::FETCH_ASSOC);
            return $resultado['ultimo_id'] ?? 0; // Si no hay registros, retorna 0
        } catch (PDOException $e) {
            error_log("Error al obtener el último stdid: " . $e->getMessage());
            return 0; // Manejo de errores, devolver 0
        }
    }


    // Método para listar todos los egresos
    public function listarEgresos()
    {
        try {
            $query = "SELECT * FROM egresos";
            $stmt = $this->db->prepare($query);
            $stmt->execute();
            return $stmt->fetchAll(PDO::FETCH_ASSOC);
        } catch (PDOException $e) {
            error_log("Error al listar egresos: " . $e->getMessage());
            return [];
        }
    }

    // Método para obtener un egreso por ID
    public function obtenerEgresoPorId($id)
    {
        try {
            $query = "SELECT * FROM egresos WHERE idegreso = :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 egreso: " . $e->getMessage());
            return null;
        }
    }

    // Método para guardar (insertar/actualizar) un egreso
    public function guardarEgreso($data)
    {
        try {
            if (isset($data['idegreso']) && $data['idegreso']) {
                // Actualizar egreso existente
                $query = "UPDATE egresos SET proveedor = :proveedor, fecha_recibo = :fecha_recibo, monto = :monto, detalle = :detalle, nro_recibo = :nro_recibo, estado = :estado, usuario = :usuario, sucursal_varchar = :sucursal_varchar WHERE idegreso = :idegreso";
                $stmt = $this->db->prepare($query);
                $stmt->bindParam(':idegreso', $data['idegreso']);
            } else {
                // Insertar nuevo egreso
                $query = "INSERT INTO egresos (proveedor, fecha_recibo, monto, detalle, nro_recibo, estado, usuario, sucursal_varchar) VALUES (:proveedor, :fecha_recibo, :monto, :detalle, :nro_recibo, :estado, :usuario, :sucursal_varchar)";
                $stmt = $this->db->prepare($query);
            }
            $stmt->bindParam(':proveedor', $data['proveedor']);
            $stmt->bindParam(':fecha_recibo', $data['fecha_recibo']);
            $stmt->bindParam(':monto', $data['monto']);
            $stmt->bindParam(':detalle', $data['detalle']);
            $stmt->bindParam(':nro_recibo', $data['nro_recibo']);
            $stmt->bindParam(':estado', $data['estado']);
            $stmt->bindParam(':usuario', $data['usuario']);
            $stmt->bindParam(':sucursal_varchar', $data['sucursal_varchar']);
            return $stmt->execute();
        } catch (PDOException $e) {
            error_log("Error al guardar egreso: " . $e->getMessage());
            return false;
        }
    }

    // Método para eliminar un egreso
    public function eliminarEgreso($id)
    {
        try {
            $query = "DELETE FROM egresos WHERE idegreso = :id";
            $stmt = $this->db->prepare($query);
            $stmt->bindParam(':id', $id);
            return $stmt->execute();
        } catch (PDOException $e) {
            error_log("Error al eliminar egreso: " . $e->getMessage());
            return false;
        }
    }

    // Método para listar egresos por fecha
    public function listarEgresosPorFecha($fecha_inicio, $fecha_fin)
    {
        try {
            $query = "SELECT * FROM egresos WHERE fecha_recibo BETWEEN :fecha_inicio AND :fecha_fin";
            $stmt = $this->db->prepare($query);
            $stmt->bindParam(':fecha_inicio', $fecha_inicio);
            $stmt->bindParam(':fecha_fin', $fecha_fin);
            $stmt->execute();
            return $stmt->fetchAll(PDO::FETCH_ASSOC);
        } catch (PDOException $e) {
            error_log("Error al listar egresos por fecha: " . $e->getMessage());
            return [];
        }
    }

    public function listarBancos()
    {
        try {
            $query = "SELECT * FROM depositos_banco WHERE estado = 1";
            $stmt = $this->db->prepare($query);
            $stmt->execute();
            return $stmt->fetchAll(PDO::FETCH_ASSOC);
        } catch (PDOException $e) {
            error_log("Error al listar bancos: " . $e->getMessage());
            return [];
        }
    }
}
