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

class Cobranzas_model extends CI_Model {

    public function listar($cliente_id = null, $estado_cobro = null, $fecha_desde = null, $fecha_hasta = null) {
        $this->db->select('
            c.*,
            cl.razon_social as cliente,
            cl.nro_documento as cliente_ruc,
            tc.nombre as tipo_comprobante,
            fp.nombre as forma_pago,
            m.abreviado as moneda,
            DATEDIFF(c.fecvencimiento, CURDATE()) as dias_para_vencer
        ');
        $this->db->from('vt_comprobante c');
        $this->db->join('vt_cliente cl',          'cl.id = c.cliente_id');
        $this->db->join('mt_tipo_comprobante tc',  'tc.id = c.comprobante_id', 'left');
        $this->db->join('mt_forma_pago fp',        'fp.id = c.fp_id',          'left');
        $this->db->join('mt_moneda m',             'm.id = c.moneda_id',        'left');
        $this->db->where_in('c.estado_id', array(23, 27)); // EMITIDO / ENVIADO
        $this->db->where('c.saldo IS NOT NULL');

        if ($cliente_id) {
            $this->db->where('c.cliente_id', $cliente_id);
        }
        if ($estado_cobro !== null && $estado_cobro !== '') {
            $this->db->where('c.estado_cobro', $estado_cobro);
        }
        if ($fecha_desde) {
            $this->db->where('c.fecha >=', $fecha_desde);
        }
        if ($fecha_hasta) {
            $this->db->where('c.fecha <=', $fecha_hasta . ' 23:59:59');
        }

        $this->db->order_by('c.fecvencimiento', 'ASC');
        $this->db->order_by('c.id', 'DESC');

        return $this->db->get()->result();
    }

    public function obtener($id) {
        return $this->db->where('id', $id)->get('vt_comprobante')->row();
    }

    public function obtener_completo($id) {
        return $this->db
            ->select('
                c.*,
                cl.razon_social as cliente,
                cl.nro_documento as cliente_ruc,
                (SELECT cc.email FROM vt_cliente_contacto cc
                 WHERE cc.cliente_id = cl.id AND cc.estado = 1
                 ORDER BY cc.id ASC LIMIT 1) as cliente_email,
                (SELECT cc.celular FROM vt_cliente_contacto cc
                 WHERE cc.cliente_id = cl.id AND cc.estado = 1
                 ORDER BY cc.id ASC LIMIT 1) as cliente_telefono,
                tc.nombre as tipo_comprobante,
                fp.nombre as forma_pago,
                m.abreviado as moneda,
                u.usuario as usuario_creador
            ')
            ->from('vt_comprobante c')
            ->join('vt_cliente cl',         'cl.id = c.cliente_id')
            ->join('mt_tipo_comprobante tc', 'tc.id = c.comprobante_id', 'left')
            ->join('mt_forma_pago fp',       'fp.id = c.fp_id',          'left')
            ->join('mt_moneda m',            'm.id = c.moneda_id',        'left')
            ->join('usuarios u',             'u.id = c.created_by',       'left')
            ->where('c.id', $id)
            ->get()->row();
    }

    public function obtener_cuotas($comprob_id) {
        return $this->db
            ->where('comprob_id', $comprob_id)
            ->order_by('nro_cuota', 'ASC')
            ->get('vt_comprobante_cuota')
            ->result();
    }

    public function obtener_cobros($comprob_id) {
        return $this->db
            ->select('
                co.*,
                mp.nombre as medio_pago,
                CONCAT(b.nombre, " - ", bc.descripcion, " - ", bc.numero_cuenta) as cuenta_bancaria,
                u.usuario as usuario_cobro
            ')
            ->from('co_pago_cliente co')
            ->join('mt_medio_pago mp',  'mp.id = co.medio_pago_id')
            ->join('mt_banco_cuenta bc','bc.id = co.banco_cuenta_id', 'left')
            ->join('mt_banco b',        'b.id = bc.banco_id',         'left')
            ->join('usuarios u',        'u.id = co.created_by',       'left')
            ->where('co.comprob_id', $comprob_id)
            ->order_by('co.fecha_pago', 'ASC')
            ->get()->result();
    }

    public function registrar_cobro($data) {
        $this->db->insert('co_pago_cliente', $data);
        return $this->db->insert_id();
    }

    public function actualizar_saldo($comprob_id, $nuevo_saldo) {
        $estado_cobro = $nuevo_saldo <= 0 ? 1 : 2; // 1=COBRADO / 2=PARCIAL

        $data = array(
            'saldo'        => $nuevo_saldo,
            'estado_cobro' => $estado_cobro
        );

        // Si está completamente cobrado, actualizar también el estado del comprobante
        if ($nuevo_saldo <= 0) {
            $data['estado_id'] = 26; // COBRADO en tabla estado
        }

        return $this->db->where('id', $comprob_id)->update('vt_comprobante', $data);
    }

    public function actualizar_cuota($cuota_id, $nuevo_saldo) {
        return $this->db->where('id', $cuota_id)->update('vt_comprobante_cuota', array(
            'importe_cuota' => $nuevo_saldo
        ));
    }

    public function listar_clientes_con_saldo() {
        return $this->db
            ->select('cl.id, cl.razon_social, cl.nro_documento')
            ->from('vt_comprobante c')
            ->join('vt_cliente cl', 'cl.id = c.cliente_id')
            ->where_in('c.estado_id', array(23, 27))
            ->where('c.saldo IS NOT NULL')
            ->group_by('cl.id')
            ->order_by('cl.razon_social', 'ASC')
            ->get()->result();
    }

    public function listar_medios_pago() {
        return $this->db->where('estado', 1)->order_by('nombre', 'ASC')->get('mt_medio_pago')->result();
    }

    public function listar_cuentas_bancarias() {
        return $this->db
            ->select('bc.id, bc.numero_cuenta, bc.descripcion, b.nombre as banco, m.abreviado as moneda')
            ->from('mt_banco_cuenta bc')
            ->join('mt_banco b',  'b.id = bc.banco_id')
            ->join('mt_moneda m', 'm.id = bc.moneda_id')
            ->where('bc.estado', 1)
            ->order_by('b.nombre', 'ASC')
            ->get()->result();
    }
}
