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

class NotaCredito_model extends CI_Model {

    // Grupos de tipos de NC según comportamiento
    public $grupo_a = array('01','02','06'); // Anulación total — carga automática sin edición
    public $grupo_b = array('05','07','09'); // Por ítem — carga automática + editable
    public $grupo_c = array('04','08');      // Global — solo importe y sustento
    public $grupo_d = array('03','10','11','12','13'); // Solo sustento

    public function listar() {
        return $this->db
            ->select('
                nc.*,
                tnc.descripcion as tipo_nc,
                tnc.codigo as tipo_nc_codigo,
                cl.razon_social as cliente,
                cl.nro_documento as cliente_ruc,
                c.serie as comprob_serie,
                c.numero as comprob_numero,
                tc.nombre as tipo_comprobante,
                m.abreviado as moneda
            ')
            ->from('vt_nota_credito nc')
            ->join('mt_tipo_nota_credito tnc', 'tnc.id = nc.tipo_nc_id')
            ->join('vt_cliente cl',            'cl.id = nc.cliente_id')
            ->join('vt_comprobante c',         'c.id = nc.comprob_id')
            ->join('mt_tipo_comprobante tc',   'tc.id = c.comprobante_id', 'left')
            ->join('mt_moneda m',              'm.id = nc.moneda_id',      'left')
            ->order_by('nc.id', 'DESC')
            ->get()->result();
    }

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

    public function obtener_completo($id) {
        return $this->db
            ->select('
                nc.*,
                tnc.descripcion as tipo_nc,
                tnc.codigo as tipo_nc_codigo,
                cl.razon_social as cliente,
                cl.nro_documento as cliente_ruc,
                cl.domicilio_fiscal as cliente_direccion,
                c.serie as comprob_serie,
                c.numero as comprob_numero,
                c.fecha as comprob_fecha,
                tc.nombre as tipo_comprobante,
                m.nombre as moneda,
                m.abreviado as moneda_abreviado,
                u.usuario as usuario_creador
            ')
            ->from('vt_nota_credito nc')
            ->join('mt_tipo_nota_credito tnc', 'tnc.id = nc.tipo_nc_id')
            ->join('vt_cliente cl',            'cl.id = nc.cliente_id')
            ->join('vt_comprobante c',         'c.id = nc.comprob_id')
            ->join('mt_tipo_comprobante tc',   'tc.id = c.comprobante_id', 'left')
            ->join('mt_moneda m',              'm.id = nc.moneda_id',      'left')
            ->join('usuarios u',               'u.id = nc.created_by',     'left')
            ->where('nc.id', $id)
            ->get()->row();
    }

    public function obtener_detalle($nc_id) {
        return $this->db
            ->select('
                d.*,
                p.codigo as producto_codigo,
                p.nombre as producto_nombre,
                um.abreviado as unidad
            ')
            ->from('vt_nota_credito_det d')
            ->join('vt_producto p',       'p.id = d.producto_id')
            ->join('mt_unidad_medida um', 'um.id = p.um_id_venta', 'left')
            ->where('d.nc_id', $nc_id)
            ->order_by('d.id', 'ASC')
            ->get()->result();
    }

    // Obtener ítems del comprobante de referencia
    public function obtener_items_comprobante($comprob_id) {
        return $this->db
            ->select('
                d.*,
                p.codigo as producto_codigo,
                p.nombre as producto_nombre,
                um.abreviado as unidad
            ')
            ->from('vt_comprobante_detalle d')
            ->join('vt_producto p',       'p.id = d.producto_id')
            ->join('mt_unidad_medida um', 'um.id = p.um_id_venta', 'left')
            ->where('d.comprob_id', $comprob_id)
            ->order_by('d.id', 'ASC')
            ->get()->result();
    }

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

    public function insertar_detalle_batch($data) {
        return $this->db->insert_batch('vt_nota_credito_det', $data);
    }

    public function actualizar($id, $data) {
        return $this->db->where('id', $id)->update('vt_nota_credito', $data);
    }

    public function eliminar_detalle($nc_id) {
        return $this->db->where('nc_id', $nc_id)->delete('vt_nota_credito_det');
    }

    // Obtener siguiente número correlativo
    public function siguiente_numero($tipo_comprobante_id, $serie) {
        $this->db->select_max('CAST(numero AS UNSIGNED)', 'max_num');
        $this->db->from('vt_nota_credito');
        $this->db->where('serie', $serie);
        $row = $this->db->get()->row();
        $siguiente = ($row && $row->max_num) ? (int)$row->max_num + 1 : 1;
        return str_pad($siguiente, 8, '0', STR_PAD_LEFT);
    }

    // Buscar comprobante por serie-número para autocomplete
    public function buscar_comprobante($term) {
        $this->db->select('
            c.id,
            c.serie,
            c.numero,
            c.fecha,
            c.pago_neto as total,
            c.moneda_id,
            c.cliente_id,
            cl.razon_social as cliente,
            cl.nro_documento as cliente_ruc,
            tc.nombre as tipo_comprobante,
            m.abreviado as moneda
        ');
        $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_moneda m',          'm.id = c.moneda_id',        'left');
        $this->db->where_in('c.estado_id', array(23, 26, 27));
        $this->db->group_start();
        $this->db->like('c.numero', $term);
        $this->db->or_like('c.serie', $term);
        $this->db->or_like('cl.razon_social', $term);
        $this->db->group_end();
        $this->db->limit(20);
        return $this->db->get()->result();
    }

    public function listar_tipos_nc() {
        return $this->db->where('estado', 1)->order_by('codigo', 'ASC')->get('mt_tipo_nota_credito')->result();
    }

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

    public function obtener_serie_nc($comprob_id) {
        $comprob = $this->db->select('serie')->where('id', $comprob_id)->get('vt_comprobante')->row();
        if (!$comprob) return 'F001';
        return $comprob->serie;
    }

    public function obtener_completo_comprobante($id) {
        return $this->db
            ->select('
                c.*,
                cl.razon_social as cliente,
                cl.nro_documento as cliente_ruc,
                cl.domicilio_fiscal as cliente_direccion,
                tc.nombre as tipo_comprobante,
                m.nombre as moneda,
                m.abreviado as moneda_abreviado
            ')
            ->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_moneda m',            'm.id = c.moneda_id',        'left')
            ->where('c.id', $id)
            ->get()->row();
    }
}
