<?php
require_once dirname(__DIR__, 2) . '/config/conexion.php';
require_once dirname(__DIR__, 2) . '/config/db.php';

class VentaModel {

    /**
     * Ejecuta una consulta SQL con parámetros y devuelve el resultado
     */
    private function ejecutarConsulta($sql, $params, $ipEncriptada)
    {
        $conn = conectarSeguro($ipEncriptada);
        if (!$conn) return ["error" => "No se pudo conectar."];

        $stmt = sqlsrv_query($conn, $sql, $params);
        if ($stmt === false) return ["error" => sqlsrv_errors()];

        $data = [];
        while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
            $data[] = $row;
        }

        return $data;
    }

    /**
     * Construye SQL con TOP N o TOP X%
     */
    private function aplicarTop($sqlBase, $top)
    {
        $topClause = "";

        // TOP N
        if (is_numeric($top) && $top > 0) {
            $topClause = "TOP $top";
        }
        // TOP PERCENT
        elseif (is_string($top) && strpos($top, "%") !== false) {
            $percent = intval(rtrim($top, "%"));
            if ($percent > 0 && $percent <= 100) {
                $topClause = "TOP $percent PERCENT";
            }
        }

        // Insertar TOP después del SELECT
        if ($topClause !== "") {
            return str_replace("SELECT", "SELECT $topClause", $sqlBase);
        }

        return $sqlBase; // sin top
    }

    /**
     * Reporte de ventas por día
     */
    public function obtenerReporteFacturas($fechaInicio, $fechaFin, $ipEncriptada)
    {
        $sql = "SELECT 
                    CONVERT(char(10), fcc_fechaemision, 103) AS FECHA,
                    COUNT(*) AS comprobantes,
                    SUM(fcc_total_comprobante) AS total
                FROM factura_cliente_Cabecera
                WHERE CONVERT(date, fcc_fechaemision) BETWEEN CONVERT(date, ?) AND CONVERT(date, ?)
                GROUP BY fcc_fechaemision
                ORDER BY fcc_fechaemision";

        return $this->ejecutarConsulta($sql, [$fechaInicio, $fechaFin], $ipEncriptada);
    }


    /**
     * Últimos comprobantes
     */
    public function obtenerUltimosComprobantes($fechaInicio, $fechaFin, $ipEncriptada)
    {
        $sql = "SELECT 
                    (CASE
                        WHEN FCC_IdDocumento='03' THEN 'B' + SUBSTRING(FCC_NroDocumento,1,3) + '-' + SUBSTRING(FCC_NroDocumento,4,8)
                        WHEN FCC_IdDocumento='01' THEN 'F' + SUBSTRING(FCC_NroDocumento,1,3) + '-' + SUBSTRING(FCC_NroDocumento,4,8)
                        WHEN FCC_IdDocumento='07' THEN 'N' + SUBSTRING(FCC_NroDocumento,1,3) + '-' + SUBSTRING(FCC_NroDocumento,4,8)
                    END) AS Numero,
                    CONVERT(CHAR(10), FCC_FechaEmision, 103) AS Fecha,
                    FCC_IdDocumento AS Tipo
                FROM Factura_Cliente_Cabecera
                WHERE FCC_IdEstado='2'
                    AND CONVERT(date, fcc_fechaemision) BETWEEN CONVERT(date, ?) AND CONVERT(date, ?)
                ORDER BY FCC_FechaEmision DESC, FCC_IdDocumento, FCC_NroDocumento";

        return $this->ejecutarConsulta($sql, [$fechaInicio, $fechaFin], $ipEncriptada);
    }

    /**
     * Últimos comprobantes
     */
    public function obtenerComprobantesActivos($fechaInicio, $fechaFin, $ipEncriptada)
    {
        $sql = "SELECT   
                    (CASE
                        WHEN FCC_IdDocumento='03' THEN 'B' + SUBSTRING(FCC_NroDocumento,1,3) + '-' + SUBSTRING(FCC_NroDocumento,4,8)
                        WHEN FCC_IdDocumento='01' THEN 'F' + SUBSTRING(FCC_NroDocumento,1,3) + '-' + SUBSTRING(FCC_NroDocumento,4,8)
                        WHEN FCC_IdDocumento='07' THEN 'N' + SUBSTRING(FCC_NroDocumento,1,3) + '-' + SUBSTRING(FCC_NroDocumento,4,8)
                    END) AS Numero,
                    CONVERT(CHAR(10), FCC_FechaEmision, 103) AS Fecha,
                    FCC_IdDocumento AS Tipo,
                    FCC_NombreCliente,
                    FCC_Total_Comprobante
                from Factura_Cliente_Cabecera
                WHERE FCC_IdEstado<>'2'
                    AND CONVERT(date, fcc_fechaemision) BETWEEN CONVERT(date, ?) AND CONVERT(date, ?)
                order by FCC_FechaEmision,FCC_IdDocumento,FCC_NroDocumento";

        return $this->ejecutarConsulta($sql, [$fechaInicio, $fechaFin], $ipEncriptada);
    }

    /**
     * Top ventas por cliente
     */
    public function obtenerTopVentasClientes($fechaInicio, $fechaFin, $ipEncriptada, $top)
    {
        $sqlBase = "SELECT
                        (FCC_RUC+FCC_DNI) as FCC_IdCliente,
                        FCC_NombreCliente,
                        SUM(FCC_Total_Comprobante) AS FCC_Total_Comprobante
                    FROM factura_cliente_Cabecera
                    WHERE CONVERT(date, fcc_fechaemision) BETWEEN CONVERT(date, ?) AND CONVERT(date, ?)
                    and FCC_IdEstado<>'2'
                    GROUP BY (FCC_RUC+FCC_DNI), FCC_NombreCliente
                    ORDER BY FCC_Total_Comprobante DESC";

                    

        $sqlFinal = $this->aplicarTop($sqlBase, $top);

        return $this->ejecutarConsulta($sqlFinal, [$fechaInicio, $fechaFin], $ipEncriptada);
    }

    /**
     * Top ventas por Producto
     */
    public function obtenerTopVentasProducto($fechaInicio, $fechaFin, $ipEncriptada, $top)
    {
        $sqlBase = "SELECT  
                        FCD_IdArticulo,
                        (RTRIM(AR_Descripcion)+' '+RTRIM(AR_Presentacion)+' '+RTRIM(MA_Descripcion)+' * ['+RTRIM(UN_Abr)+']') as AR_Descripcion,
                        sum(FCD_Cantidad) as Cantidad,
                        SUM(FCD_Importe) AS Importe
                    from Factura_Cliente_Detalle
                    inner join Factura_Cliente_Cabecera
                    on FCC_IdDocumento =FCD_IdDocumento and FCD_NroDocumento=FCC_NroDocumento
                    inner join Articulo on AR_IdArticulo=Fcd_IdArticulo
                    inner join Marca on MA_IdMarca=AR_IdMarca
                    inner join Unidad on UN_IdUnidad=AR_IdUnidad
                    WHERE CONVERT(date, fcc_fechaemision) BETWEEN CONVERT(date, ?) AND CONVERT(date, ?)
                    group by 
                        FCD_IdArticulo,
                        (RTRIM(AR_Descripcion)+' '+RTRIM(AR_Presentacion)+' '+RTRIM(MA_Descripcion)+' * ['+RTRIM(UN_Abr)+']')
                    order by SUM(FCD_Importe) DESC";

        $sqlFinal = $this->aplicarTop($sqlBase, $top);

        return $this->ejecutarConsulta($sqlFinal, [$fechaInicio, $fechaFin], $ipEncriptada);
    }


    /**
     *  Total creditos Pendientes
     */
    public function obtenerTotalCreditos($fechaInicio, $fechaFin, $ipEncriptada )
    {
        $sqlBase = "SELECT sum(CXC_Saldo) as CXC_Saldo from CuentasxCobrar
                    where CXC_Movimiento='C' AND CXC_Saldo<>0";
 
        return $this->ejecutarConsulta($sqlFinal, [$fechaInicio, $fechaFin], $ipEncriptada);
    }


    /**
     *  Total creditos Pendientes fecha
     */
    public function obtenerTotalCreditos_Fecha($fechaInicio, $fechaFin, $ipEncriptada )
    {
        $sqlBase = "SELECT sum(CXC_Saldo) as CXC_Saldo from CuentasxCobrar
                    where CXC_Movimiento='C' 
                    AND CXC_Saldo<>0
                    AND CONVERT(date, CXC_FechaEmision) BETWEEN CONVERT(date, ?) AND CONVERT(date, ?)";
 
        return $this->ejecutarConsulta($sqlFinal, [$fechaInicio, $fechaFin], $ipEncriptada);
    }

    /**
     *  creditos Pendientes por fecha
     */
    public function obtenerCreditos($fechaInicio, $fechaFin, $ipEncriptada )
    {
        $sqlBase = "SELECT
                    (case
                        when FCC_IdDocumento='03' then 'B'+substring(FCC_NroDocumento,1,3)+'-'+substring(FCC_NroDocumento,4,8)
                        when FCC_IdDocumento='01' then 'F'+substring(FCC_NroDocumento,1,3)+'-'+substring(FCC_NroDocumento,4,8)
                        WHEN FCC_IdDocumento='07' then 'N'+substring(FCC_NroDocumento,1,3)+'-'+substring(FCC_NroDocumento,4,8)
                    END) AS FCC_NroDocumento,
                    CONVERT(CHAR(10),CXC_FechaEmision,103) as CXC_FechaEmision,
                    FCC_NombreCliente,
                    FCC_Total_Comprobante,
                    CXC_Cargo,
                    CXC_Abono,
                    CXC_Saldo
                    from CuentasxCobrar
                    inner join Factura_Cliente_Cabecera
                    on FCC_IdDocumento=CXC_IdDocumento and CXC_NroDocumento=FCC_NroDocumento
                    where CXC_Movimiento='C' AND CXC_Saldo<>0
                    and CONVERT(date, CXC_FechaEmision) BETWEEN CONVERT(date, ?) AND CONVERT(date, ?)
                    order by CXC_Saldo desc";
 
        return $this->ejecutarConsulta($sqlBase, [$fechaInicio, $fechaFin], $ipEncriptada);
    }


    /**
     *  Forma de pago por fecha
     */
    public function obtenerFormaPago_fecha($fechaInicio, $fechaFin, $ipEncriptada )
    {
        $sqlBase = "SELECT 
                    (case
                        when FCC_IdCondicion='1' then 'CONTADO'
                        when FCC_IdCondicion='2' then 'CREDITO'
                        when FCC_IdCondicion<>'2' and FCC_IdCondicion<>'1' then 'POR IMPRIMIR'
                    end)
                    FCC_IdCondicion ,
                    sum(FCC_PagoEfectivo) + sum(FCC_PagoTarjeta)+ sum(FCC_PagoCheque)as Total
                    from Factura_Cliente_Cabecera
                    where CONVERT(date, FCC_FechaEmision) BETWEEN CONVERT(date, ?) AND CONVERT(date, ?)
                    and FCC_IdEstado<>'2'
                    group by FCC_IdCondicion ";
 
        return $this->ejecutarConsulta($sqlBase, [$fechaInicio, $fechaFin], $ipEncriptada);
    }


    public function obtenerCobranzasEefectuadas($fechaInicio, $fechaFin, $ipEncriptada )
    {
        $sqlBase = "SELECT
                        'Cobranzas' as Tipo,
                        SUM(CXC_Abono) as Total
                    from CuentasxCobrar
                    WHERE CXC_Movimiento='A'
                    AND CONVERT(date, CXC_FechaEmision) BETWEEN CONVERT(date, ?) AND CONVERT(date, ?)";
 
        return $this->ejecutarConsulta($sqlBase, [$fechaInicio, $fechaFin], $ipEncriptada);
    }

    public function obtenerRecordVentasVendedor($fechaInicio, $fechaFin, $ipEncriptada )
    {
        $sqlBase = "SELECT  
                    RTRIM(LTRIM(ASU_Nombre)) as Vendedor,
                    RTRIM(LTRIM(FCC_Usuario)) as IdVendedor,
                    sum(FCC_Total_Comprobante) as TotalVentas
                    from Factura_Cliente_Cabecera
                    inner join Acceso_Sistema_Usuario
                    on ASU_IdUsuario=FCC_Usuario
                    where CONVERT(date, FCC_FechaEmision) BETWEEN CONVERT(date, ?) AND CONVERT(date, ?)
                    and FCC_Idestado<>'2'
                    group by  ASU_Nombre,FCC_Usuario
                    order by TotalVentas desc";
 
        return $this->ejecutarConsulta($sqlBase, [$fechaInicio, $fechaFin], $ipEncriptada);
    }


    public function obtenerRecordVentasVendedor_idPrecio($fechaInicio, $fechaFin, $ipEncriptada )
    {
        $sqlBase = "SELECT
                    RTRIM(LTRIM(ASU_Nombre)) as Vendedor,
                    RTRIM(LTRIM(FCC_Usuario)) as IdVendedor, 
                    FCD_IdPrecio,
                    sum(FCD_Importe)as TotalComprobante
                    from Factura_Cliente_Cabecera
                    inner join Factura_Cliente_Detalle on 
                    FCC_IdDocumento=FCD_IdDocumento and FCD_NroDocumento=FCC_NroDocumento
                    inner join Acceso_Sistema_Usuario
                    on ASU_IdUsuario=FCC_Usuario
                    where CONVERT(date, FCC_FechaEmision) BETWEEN CONVERT(date, ?) AND CONVERT(date, ?)
                    and FCC_Idestado<>'2'
                    group by  ASU_Nombre,FCC_Usuario,FCD_IdPrecio
                    order by IdVendedor desc";
 
        return $this->ejecutarConsulta($sqlBase, [$fechaInicio, $fechaFin], $ipEncriptada);
    }


    public function obtenerVentasVendedor_mesAnterior($fechaInicio, $ipEncriptada )
    {
        $sqlBase = "SELECT  
                    RTRIM(LTRIM(ASU_Nombre)) as Vendedor,
                    RTRIM(LTRIM(FCC_Usuario)) as IdVendedor,
                    sum(FCC_Total_Comprobante) as TotalVentas
                    from Factura_Cliente_Cabecera
                    inner join Acceso_Sistema_Usuario
                    on ASU_IdUsuario=FCC_Usuario
					WHERE FCC_FechaEmision >= DATEADD(MONTH, DATEDIFF(MONTH, 0, ?) - 1, 0)
					AND FCC_FechaEmision <  DATEADD(MONTH, DATEDIFF(MONTH, 0, ?), 0)
                    and FCC_Idestado<>'2'
                    group by  ASU_Nombre,FCC_Usuario
                    order by TotalVentas desc";
 
        return $this->ejecutarConsulta($sqlBase, [$fechaInicio, $fechaInicio ], $ipEncriptada);
    }

    public function obtenerVentasVendedor_PromediomesAnterior($fechaInicio, $ipEncriptada )
    {
        $sqlBase = "SELECT  
                        RTRIM(LTRIM(ASU_Nombre)) AS Vendedor,
                        RTRIM(LTRIM(FCC_Usuario)) AS IdVendedor,
                        DAY(DATEADD(DAY, -1, DATEADD(MONTH, DATEDIFF(MONTH, 0, ?), 0)))  as numDias,
                        SUM(FCC_Total_Comprobante) AS TotalVentas,
                        -- 👉 Promedio diario mes anterior
                        CAST(SUM(FCC_Total_Comprobante) AS DECIMAL(18,2)) / DAY(DATEADD(DAY, -1, DATEADD(MONTH, DATEDIFF(MONTH, 0, ?), 0))) 
                        AS PromedioDiario
                    FROM Factura_Cliente_Cabecera
                    INNER JOIN Acceso_Sistema_Usuario ON ASU_IdUsuario = FCC_Usuario
                    WHERE FCC_FechaEmision >= DATEADD(MONTH, DATEDIFF(MONTH, 0, ?) - 1, 0)
                    AND FCC_FechaEmision <  DATEADD(MONTH, DATEDIFF(MONTH, 0, ?), 0)
                    GROUP BY ASU_Nombre, FCC_Usuario
                    ORDER BY TotalVentas DESC";
 
        return $this->ejecutarConsulta($sqlBase, [$fechaInicio, $fechaInicio,$fechaInicio, $fechaInicio ], $ipEncriptada);
    }



}
?>
