<?php
//Incluímos inicialmente la conexión a la base de datos
require "../config/Conexion.php";

class OdontPago
{
    //Implementamos nuestro constructor
    public function __construct()
    {
    }

    //Insertar un pago
    public function insertar($idpresupuesto, $monto, $idforma_pago, $numero_referencia, $observaciones, $idusuario)
    {
        $sql = "INSERT INTO odont_pago (idpresupuesto, fecha_pago, monto, idforma_pago, numero_referencia, observaciones, idusuario)
		VALUES ('$idpresupuesto', current_timestamp(), '$monto', '$idforma_pago', '$numero_referencia', '$observaciones', '$idusuario')";
        return ejecutarConsulta_retornarID($sql);
    }

    //Listar pagos de un presupuesto
    public function listarPorPresupuesto($idpresupuesto)
    {
        $sql = "SELECT p.idpago, p.fecha_pago, p.monto, p.numero_referencia, p.observaciones, 
                fp.nombre as forma_pago, 
                CONCAT(per.nombre, ' ', per.apaterno) as usuario
                FROM odont_pago p
                INNER JOIN odont_forma_pago fp ON p.idforma_pago = fp.idforma_pago
                INNER JOIN persona per ON p.idusuario = per.idpersona
                WHERE p.idpresupuesto = '$idpresupuesto'
                ORDER BY p.fecha_pago DESC";
        return ejecutarConsulta($sql);
    }

    //Obtener total pagado de un presupuesto
    public function totalPagado($idpresupuesto)
    {
        $sql = "SELECT COALESCE(SUM(monto), 0) as total_pagado 
                FROM odont_pago 
                WHERE idpresupuesto = '$idpresupuesto'";
        return ejecutarConsultaSimpleFila($sql);
    }

    //Listar formas de pago activas
    public function listarFormasPago()
    {
        $sql = "SELECT * FROM odont_forma_pago WHERE estado = 1 ORDER BY nombre ASC";
        return ejecutarConsulta($sql);
    }

    //Aplicar pago a cuotas pendientes
    public function aplicarPagoACuotas($idpago, $monto_disponible, $idplan_cuotas)
    {
        // Obtener cuotas pendientes ordenadas por fecha de vencimiento
        $sql = "SELECT * FROM odont_cuota 
                WHERE idplan_cuotas = '$idplan_cuotas' 
                AND estado IN ('Pendiente', 'Parcial', 'Vencida')
                ORDER BY fecha_vencimiento ASC";

        $cuotas = ejecutarConsulta($sql);
        $monto_restante = $monto_disponible;

        while ($cuota = $cuotas->fetch_object()) {
            if ($monto_restante <= 0)
                break;

            $saldo_cuota = $cuota->monto - $cuota->monto_pagado;
            $monto_aplicar = min($monto_restante, $saldo_cuota);

            // Registrar aplicación del pago a la cuota
            $sql_aplicar = "INSERT INTO odont_pago_cuota (idpago, idcuota, monto_aplicado)
                           VALUES ('$idpago', '$cuota->idcuota', '$monto_aplicar')";
            ejecutarConsulta($sql_aplicar);

            // Actualizar monto pagado de la cuota
            $nuevo_monto_pagado = $cuota->monto_pagado + $monto_aplicar;
            $nuevo_estado = ($nuevo_monto_pagado >= $cuota->monto) ? 'Pagada' : 'Parcial';

            $sql_actualizar = "UPDATE odont_cuota 
                              SET monto_pagado = '$nuevo_monto_pagado', 
                                  estado = '$nuevo_estado',
                                  fecha_pago = " . ($nuevo_estado == 'Pagada' ? "current_timestamp()" : "NULL") . "
                              WHERE idcuota = '$cuota->idcuota'";
            ejecutarConsulta($sql_actualizar);

            $monto_restante -= $monto_aplicar;
        }

        return true;
    }

    //Actualizar saldo pendiente del presupuesto
    public function actualizarSaldoPresupuesto($idpresupuesto)
    {
        $sql = "UPDATE odont_presupuesto p
                SET p.saldo_pendiente = p.total - (
                    SELECT COALESCE(SUM(monto), 0) 
                    FROM odont_pago 
                    WHERE idpresupuesto = p.idpresupuesto
                ),
                p.estado_pago = CASE 
                    WHEN p.total <= (SELECT COALESCE(SUM(monto), 0) FROM odont_pago WHERE idpresupuesto = p.idpresupuesto) THEN 'Pagado'
                    WHEN (SELECT COALESCE(SUM(monto), 0) FROM odont_pago WHERE idpresupuesto = p.idpresupuesto) > 0 THEN 'Parcial'
                    ELSE 'Pendiente'
                END
                WHERE p.idpresupuesto = '$idpresupuesto'";
        return ejecutarConsulta($sql);
    }
}
