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

class AntiguedadSaldos extends MY_Controller {

    public function __construct() {
        parent::__construct();
        $this->load->model('cobranzas/AntiguedadSaldos_model');
        $this->load->model('configuracion/Empresa_model');
    }

    // Definición de los rangos (buckets) del aging report
    private function _bucket($dias) {
        if ($dias === null || $dias <= 0) return 'corriente';
        if ($dias <= 30)  return 'b1_30';
        if ($dias <= 60)  return 'b31_60';
        if ($dias <= 90)  return 'b61_90';
        return 'b90_mas';
    }

    public function index() {
        $this->validar_permiso('antiguedad_saldos_ver');

        $cliente_id  = $this->input->get('cliente_id', TRUE) ?: null;
        $fecha_corte = $this->input->get('fecha_corte', TRUE) ?: date('Y-m-d');

        $comprobantes = $this->AntiguedadSaldos_model->listar($cliente_id, $fecha_corte);

        $buckets_def = array(
            'corriente' => 'Corriente (no vencido)',
            'b1_30'     => '1 - 30 días',
            'b31_60'    => '31 - 60 días',
            'b61_90'    => '61 - 90 días',
            'b90_mas'   => 'Más de 90 días',
        );

        $agrupado = array();
        $totales_buckets = array_fill_keys(array_keys($buckets_def), 0.0);
        $total_general = 0.0;

        foreach ($comprobantes as $c) {
            $dias   = !empty($c->fecvencimiento) ? (int)$c->dias_vencido : null;
            $bucket = $this->_bucket($dias);
            $saldo  = (float)$c->saldo;

            $key = $c->cliente_id;
            if (!isset($agrupado[$key])) {
                $agrupado[$key] = array(
                    'cliente'     => $c->cliente,
                    'cliente_ruc' => $c->cliente_ruc,
                    'buckets'     => array_fill_keys(array_keys($buckets_def), 0.0),
                    'total'       => 0.0,
                    'items'       => array(),
                );
            }

            $agrupado[$key]['buckets'][$bucket] += $saldo;
            $agrupado[$key]['total']            += $saldo;
            $agrupado[$key]['items'][]           = array(
                'tipo_comprobante' => $c->tipo_comprobante,
                'serie'            => $c->serie,
                'numero'           => $c->numero,
                'fecha'            => $c->fecha,
                'fecvencimiento'   => $c->fecvencimiento,
                'dias_vencido'     => $dias,
                'bucket'           => $bucket,
                'saldo'            => $saldo,
                'moneda'           => $c->moneda,
                'id'               => $c->id,
            );

            $totales_buckets[$bucket] += $saldo;
            $total_general            += $saldo;
        }

        // Ordenar clientes por total de mayor a menor deuda
        uasort($agrupado, function($a, $b) {
            return $b['total'] <=> $a['total'];
        });

        $data['titulo']          = 'Antigüedad de Saldos por Cobrar';
        $data['agrupado']        = $agrupado;
        $data['buckets_def']     = $buckets_def;
        $data['totales_buckets'] = $totales_buckets;
        $data['total_general']   = $total_general;
        $data['clientes']        = $this->AntiguedadSaldos_model->listar_clientes_con_saldo();
        $data['cliente_id']      = $cliente_id;
        $data['fecha_corte']     = $fecha_corte;
        $data['fecha_reporte']   = date('d/m/Y H:i');
        $data['empresa']         = $this->Empresa_model->obtener_activa();

        $this->layout('cobranzas/antiguedad_saldos/index', $data);
    }
}
