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

class Cobranzas extends MY_Controller {

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

    protected function validar_permiso_ajax($slug) {
        if (!tiene_permiso($slug)) {
            echo json_encode(array('status' => false, 'message' => 'No tienes permisos'));
            exit;
        }
    }

    // ---------------------------------------------------------------
    // LISTADO
    // ---------------------------------------------------------------
    public function index() {
        $this->validar_permiso('cobranzas_ver');

        $cliente_id   = $this->input->get('cliente_id', TRUE) ?: null;
        $estado_cobro = $this->input->get('estado_cobro', TRUE);
        $fecha_desde  = $this->input->get('fecha_desde', TRUE) ?: null;
        $fecha_hasta  = $this->input->get('fecha_hasta', TRUE) ?: null;

        $comprobantes = $this->Cobranzas_model->listar(
            $cliente_id, $estado_cobro, $fecha_desde, $fecha_hasta
        );

        // Totales
        $total_saldo   = 0;
        $total_cobrado = 0;
        foreach ($comprobantes as $c) {
            $total_saldo   += (float)$c->saldo;
            $total_cobrado += (float)$c->pago_neto - (float)$c->saldo;
        }

        $data['titulo']        = 'Cobranzas';
        $data['comprobantes']  = $comprobantes;
        $data['clientes']      = $this->Cobranzas_model->listar_clientes_con_saldo();
        $data['cliente_id']    = $cliente_id;
        $data['estado_cobro']  = $estado_cobro;
        $data['fecha_desde']   = $fecha_desde;
        $data['fecha_hasta']   = $fecha_hasta;
        $data['total_saldo']   = $total_saldo;
        $data['total_cobrado'] = $total_cobrado;
        $data['fecha_reporte'] = date('d/m/Y H:i');
        $data['empresa']       = $this->Empresa_model->obtener_activa();

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

    // ---------------------------------------------------------------
    // VER
    // ---------------------------------------------------------------
    public function ver($id) {
        $this->validar_permiso('cobranzas_ver');

        $comprobante = $this->Cobranzas_model->obtener_completo($id);
        if (!$comprobante) show_404();

        $data['titulo']       = 'Detalle Cobranza';
        $data['comprobante']  = $comprobante;
        $data['cuotas']       = $this->Cobranzas_model->obtener_cuotas($id);
        $data['cobros']       = $this->Cobranzas_model->obtener_cobros($id);
        $data['medios_pago']  = $this->Cobranzas_model->listar_medios_pago();
        $data['cuentas']      = $this->Cobranzas_model->listar_cuentas_bancarias();

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

    // ---------------------------------------------------------------
    // REGISTRAR COBRO (AJAX)
    // ---------------------------------------------------------------
    public function registrar_cobro() {
        $this->validar_permiso_ajax('cobranzas_cobrar');

        $comprob_id     = $this->input->post('comprob_id', TRUE);
        $cuota_id       = $this->input->post('cuota_id', TRUE) ?: null;
        $fecha_pago     = $this->input->post('fecha_pago', TRUE);
        $medio_pago_id  = $this->input->post('medio_pago_id', TRUE);
        $banco_cuenta_id= $this->input->post('banco_cuenta_id', TRUE) ?: null;
        $importe        = (float)$this->input->post('importe', TRUE);
        $referencia     = trim($this->input->post('referencia', TRUE));
        $observaciones  = trim($this->input->post('observaciones', TRUE));

        if ($importe <= 0) {
            echo json_encode(array('status' => false, 'message' => 'El importe debe ser mayor a 0'));
            return;
        }

        $comprobante = $this->Cobranzas_model->obtener($comprob_id);
        if (!$comprobante) {
            echo json_encode(array('status' => false, 'message' => 'Comprobante no encontrado'));
            return;
        }

        if ($importe > (float)$comprobante->saldo) {
            echo json_encode(array('status' => false, 'message' => 'El importe supera el saldo pendiente (' . number_format($comprobante->saldo, 2) . ')'));
            return;
        }

        $this->db->trans_begin();

        // Registrar cobro y capturar el id inmediatamente
        $this->Cobranzas_model->registrar_cobro(array(
            'comprob_id'      => $comprob_id,
            'cuota_id'        => $cuota_id,
            'fecha_pago'      => $fecha_pago,
            'medio_pago_id'   => $medio_pago_id,
            'banco_cuenta_id' => $banco_cuenta_id,
            'importe'         => $importe,
            'referencia'      => $referencia !== '' ? $referencia : null,
            'observaciones'   => $observaciones !== '' ? $observaciones : null,
            'created_by'      => $this->session->userdata('id')
        ));
        $pago_id = $this->db->insert_id(); // ← capturar AQUÍ antes de cualquier otro query

        // Actualizar saldo del comprobante
        $nuevo_saldo = round((float)$comprobante->saldo - $importe, 2);
        $this->Cobranzas_model->actualizar_saldo($comprob_id, $nuevo_saldo);

        // Si quedó en 0 registrar historial de estado COBRADO
        if ($nuevo_saldo <= 0) {
            $this->db->insert('vt_comprobante_estado', array(
                'comprob_id'          => $comprob_id,
                'estado_id'           => 26,
                'comprob_fechaestado' => date('Y-m-d H:i:s'),
                'usuario_id'          => $this->session->userdata('id')
            ));
        }

        // Si tiene cuota, actualizar saldo de la cuota
        if ($cuota_id) {
            $cuota = $this->db->where('id', $cuota_id)->get('vt_comprobante_cuota')->row();
            if ($cuota) {
                $nuevo_saldo_cuota = max(0, round((float)$cuota->importe_cuota - $importe, 2));
                $this->Cobranzas_model->actualizar_cuota($cuota_id, $nuevo_saldo_cuota);
            }
        }

        if ($this->db->trans_status() === FALSE) {
            $this->db->trans_rollback();
            echo json_encode(array('status' => false, 'message' => 'Error al registrar el cobro'));
            return;
        }

        $this->db->trans_commit();

        // Generar comisión automáticamente (fuera de la transacción)
        $this->_generar_comision($pago_id, $comprob_id, $importe);

        echo json_encode(array(
            'status'      => true,
            'message'     => 'Cobro registrado correctamente',
            'nuevo_saldo' => number_format($nuevo_saldo, 2),
            'cobrado'     => $nuevo_saldo <= 0
        ));
    }

    private function _generar_comision($pago_id, $comprob_id, $importe_abonado) {
        if ($this->Comisiones_model->pago_tiene_comision($pago_id)) return;
 
        $comprobante = $this->db
            ->select('vendedor_id, subtotal')
            ->where('id', $comprob_id)
            ->get('vt_comprobante')
            ->row();
 
        if (!$comprobante || !$comprobante->vendedor_id) return;
 
        $config = $this->Comisiones_model->obtener_config_empresa();
        if ((float)$config->comision_porcentaje <= 0) return;
 
        $monto_comision = round($importe_abonado * (float)$config->comision_porcentaje / 100, 2);
 
        $this->Comisiones_model->registrar_comision([
            'vendedor_id'      => $comprobante->vendedor_id,
            'comprob_id'       => $comprob_id,
            'pago_id'          => $pago_id,
            'fecha_pago'       => date('Y-m-d'),
            'subtotal_comprob' => $comprobante->subtotal,
            'importe_abonado'  => $importe_abonado,
            'pct_comision'     => $config->comision_porcentaje,
            'monto_comision'   => $monto_comision,
            'created_by'       => $this->session->userdata('id'),
            'created_at'       => date('Y-m-d H:i:s'),
        ]);
    }

}