<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class FlujoCaja_model extends CI_Model {

    // -------------------------------------------------------
    // SALDO INICIAL — todo lo movido ANTES del período
    // -------------------------------------------------------
    public function calcular_saldo_inicial($fecha_inicio) {
        // Cobros a clientes antes del período
        $cobros = $this->db
            ->select('IFNULL(SUM(importe), 0) as total')
            ->from('co_pago_cliente')
            ->where('fecha_pago <', $fecha_inicio)
            ->get()->row();

        // Pagos a proveedores antes del período
        $pagos_prov = $this->db
            ->select('IFNULL(SUM(importe), 0) as total')
            ->from('cp_comprobante_proveedor_pago')
            ->where('fecha_pago <', $fecha_inicio)
            ->get()->row();

        // Ingresos caja chica antes del período
        $ing_caja = $this->db
            ->select('IFNULL(SUM(monto), 0) as total')
            ->from('fn_movimiento')
            ->where('tipo', 'I')
            ->where('fecha <', $fecha_inicio)
            ->get()->row();

        // Egresos caja chica antes del período
        $egr_caja = $this->db
            ->select('IFNULL(SUM(monto), 0) as total')
            ->from('fn_movimiento')
            ->where('tipo', 'E')
            ->where('fecha <', $fecha_inicio)
            ->get()->row();

        return round(
            (float)$cobros->total
            - (float)$pagos_prov->total
            + (float)$ing_caja->total
            - (float)$egr_caja->total,
            2
        );
    }

    // -------------------------------------------------------
    // INGRESOS REALES DEL PERÍODO
    // -------------------------------------------------------
    public function ingresos_cobros_clientes($desde, $hasta) {
        return $this->db
            ->select('
                p.fecha_pago as fecha,
                p.importe,
                c.serie, c.numero,
                cli.razon_social as cliente,
                mp.nombre as medio_pago
            ')
            ->from('co_pago_cliente p')
            ->join('vt_comprobante c',  'c.id = p.comprob_id')
            ->join('vt_cliente cli',    'cli.id = c.cliente_id')
            ->join('mt_medio_pago mp',  'mp.id = p.medio_pago_id', 'left')
            ->where('p.fecha_pago >=', $desde)
            ->where('p.fecha_pago <=', $hasta)
            ->order_by('p.fecha_pago', 'ASC')
            ->get()->result();
    }

    public function ingresos_caja_chica($desde, $hasta) {
        return $this->db
            ->select('
                m.fecha,
                m.monto as importe,
                m.concepto,
                m.origen,
                b.nombre as banco_nombre,
                bc.numero_cuenta
            ')
            ->from('fn_movimiento m')
            ->join('mt_banco_cuenta bc', 'bc.id = m.banco_cuenta_id', 'left')
            ->join('mt_banco b',         'b.id = bc.banco_id',        'left')
            ->where('m.tipo', 'I')
            ->where('m.origen !=', 'APERTURA')
            ->where('m.fecha >=', $desde)
            ->where('m.fecha <=', $hasta)
            ->order_by('m.fecha', 'ASC')
            ->get()->result();
    }

    // -------------------------------------------------------
    // EGRESOS REALES DEL PERÍODO
    // -------------------------------------------------------
    public function egresos_pagos_proveedores($desde, $hasta) {
        return $this->db
            ->select('
                p.fecha_pago as fecha,
                p.importe,
                cp.tipo_comprobante,
                cp.serie, cp.numero,
                cp.tipo_gasto,
                prov.razon_social as proveedor,
                mp.nombre as medio_pago
            ')
            ->from('cp_comprobante_proveedor_pago p')
            ->join('cp_comprobante_proveedor cp', 'cp.id = p.cp_id')
            ->join('lt_proveedor prov',           'prov.id = cp.proveedor_id')
            ->join('mt_medio_pago mp',            'mp.id = p.medio_pago_id', 'left')
            ->where('p.fecha_pago >=', $desde)
            ->where('p.fecha_pago <=', $hasta)
            ->order_by('p.fecha_pago', 'ASC')
            ->get()->result();
    }

    public function egresos_caja_chica($desde, $hasta) {
        return $this->db
            ->select('
                m.fecha,
                m.monto as importe,
                m.concepto,
                m.origen,
                m.proveedor_nombre,
                m.tiene_comprobante,
                m.tipo_comprobante,
                m.nro_comprobante
            ')
            ->from('fn_movimiento m')
            ->where('m.tipo', 'E')
            ->where('m.fecha >=', $desde)
            ->where('m.fecha <=', $hasta)
            ->order_by('m.fecha', 'ASC')
            ->get()->result();
    }

    // -------------------------------------------------------
    // TOTALES RÁPIDOS PARA EL RESUMEN
    // -------------------------------------------------------
    public function total_cobros_clientes($desde, $hasta) {
        $row = $this->db
            ->select('IFNULL(SUM(importe), 0) as total')
            ->from('co_pago_cliente')
            ->where('fecha_pago >=', $desde)
            ->where('fecha_pago <=', $hasta)
            ->get()->row();
        return (float)$row->total;
    }

    public function total_ingresos_caja($desde, $hasta) {
        $row = $this->db
            ->select('IFNULL(SUM(monto), 0) as total')
            ->from('fn_movimiento')
            ->where('tipo', 'I')
            ->where('origen !=', 'APERTURA')
            ->where('fecha >=', $desde)
            ->where('fecha <=', $hasta)
            ->get()->row();
        return (float)$row->total;
    }

    public function total_pagos_proveedores($desde, $hasta) {
        $row = $this->db
            ->select('IFNULL(SUM(importe), 0) as total')
            ->from('cp_comprobante_proveedor_pago')
            ->where('fecha_pago >=', $desde)
            ->where('fecha_pago <=', $hasta)
            ->get()->row();
        return (float)$row->total;
    }

    public function total_egresos_caja($desde, $hasta) {
        $row = $this->db
            ->select('IFNULL(SUM(monto), 0) as total')
            ->from('fn_movimiento')
            ->where('tipo', 'E')
            ->where('fecha >=', $desde)
            ->where('fecha <=', $hasta)
            ->get()->row();
        return (float)$row->total;
    }

    // -------------------------------------------------------
    // PROYECTADO — POR COBRAR
    // -------------------------------------------------------
    public function proyectado_por_cobrar() {
        return $this->db
            ->select('
                c.fecvencimiento as fecha_vencimiento,
                c.saldo,
                c.serie, c.numero,
                tc.nombre_corto as tipo_comprobante,
                cli.razon_social as cliente,
                DATEDIFF(c.fecvencimiento, CURDATE()) as dias_restantes
            ')
            ->from('vt_comprobante c')
            ->join('vt_cliente cli',         'cli.id = c.cliente_id')
            ->join('mt_tipo_comprobante tc', 'tc.id = c.comprobante_id', 'left')
            ->where('c.saldo >', 0)
            ->where_in('c.estado_id', [23, 27]) // EMITIDO / ENVIADO
            ->order_by('c.fecvencimiento', 'ASC')
            ->get()->result();
    }

    // -------------------------------------------------------
    // PROYECTADO — POR PAGAR
    // -------------------------------------------------------
    public function proyectado_por_pagar() {
        return $this->db
            ->select('
                cp.fecha_vencimiento,
                cp.saldo,
                cp.tipo_comprobante,
                cp.serie, cp.numero,
                cp.tipo_gasto,
                prov.razon_social as proveedor,
                DATEDIFF(cp.fecha_vencimiento, CURDATE()) as dias_restantes
            ')
            ->from('cp_comprobante_proveedor cp')
            ->join('lt_proveedor prov', 'prov.id = cp.proveedor_id')
            ->where('cp.saldo >', 0)
            ->where('cp.estado', 1) // PENDIENTE
            ->order_by('cp.fecha_vencimiento', 'ASC')
            ->get()->result();
    }

    // -------------------------------------------------------
    // HELPER — agrupar por tramo de días
    // -------------------------------------------------------
    public function agrupar_por_tramo($items, $campo_dias) {
        $tramos = [
            'vencido'   => ['label' => 'Vencido',           'items' => [], 'total' => 0],
            'semana1'   => ['label' => 'Esta semana (0-7d)', 'items' => [], 'total' => 0],
            'semana2'   => ['label' => 'Próxima semana (8-15d)', 'items' => [], 'total' => 0],
            'quincena'  => ['label' => '16 - 30 días',      'items' => [], 'total' => 0],
            'mes'       => ['label' => 'Más de 30 días',    'items' => [], 'total' => 0],
        ];

        foreach ($items as $item) {
            $dias = (int)$item->$campo_dias;
            if ($dias < 0)       $tramo = 'vencido';
            elseif ($dias <= 7)  $tramo = 'semana1';
            elseif ($dias <= 15) $tramo = 'semana2';
            elseif ($dias <= 30) $tramo = 'quincena';
            else                 $tramo = 'mes';

            $tramos[$tramo]['items'][] = $item;
            $tramos[$tramo]['total']  += (float)$item->saldo;
        }

        return $tramos;
    }
}
