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

class ComprobanteProveedor_model extends CI_Model {

    public function listar() {
        return $this->db
            ->select('
                cp.*,
                p.razon_social as proveedor,
                p.nro_documento as proveedor_ruc,
                m.nombre as moneda,
                m.abreviado as moneda_abreviado,
                fp.nombre as forma_pago
            ')
            ->from('cp_comprobante_proveedor cp')
            ->join('lt_proveedor p',   'p.id = cp.proveedor_id')
            ->join('mt_moneda m',      'm.id = cp.moneda_id',  'left')
            ->join('mt_forma_pago fp', 'fp.id = cp.fp_id',     'left')
            ->order_by('cp.id', 'DESC')
            ->get()->result();
    }

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

    public function obtener_completo($id) {
        return $this->db
            ->select('
                cp.*,
                p.razon_social as proveedor,
                p.nro_documento as proveedor_ruc,
                p.contacto, p.telefono as proveedor_telefono,
                m.nombre as moneda,
                m.abreviado as moneda_abreviado,
                fp.nombre as forma_pago,
                u.usuario as usuario_creador
            ')
            ->from('cp_comprobante_proveedor cp')
            ->join('lt_proveedor p',   'p.id = cp.proveedor_id')
            ->join('mt_moneda m',      'm.id = cp.moneda_id',  'left')
            ->join('mt_forma_pago fp', 'fp.id = cp.fp_id',     'left')
            ->join('usuarios u',       'u.id = cp.created_by', 'left')
            ->where('cp.id', $id)
            ->get()->row();
    }

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

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

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

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

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

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

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

    public function existe_comprobante($proveedor_id, $tipo, $serie, $numero, $id = null) {
        $this->db->where('proveedor_id', $proveedor_id);
        $this->db->where('tipo_comprobante', $tipo);
        $this->db->where('serie', $serie);
        $this->db->where('numero', $numero);
        if ($id !== null) $this->db->where('id !=', $id);
        return $this->db->get('cp_comprobante_proveedor')->num_rows() > 0;
    }

    // ---------------------------------------------------------------
    // AUXILIARES
    // ---------------------------------------------------------------
    public function buscar_proveedor($term) {
        $this->db->select('id, razon_social, nro_documento, fp_id, fp_descripcion, moneda_id');
        $this->db->from('lt_proveedor');
        $this->db->where('estado', 1);
        $this->db->group_start();
        $this->db->like('razon_social', $term);
        $this->db->or_like('nro_documento', $term);
        $this->db->group_end();
        $this->db->limit(20);
        return $this->db->get()->result();
    }

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

    public function listar_formas_pago() {
        return $this->db->where('estado', 1)->order_by('nombre', 'ASC')->get('mt_forma_pago')->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();
    }

    public function listar_oc_autorizadas_proveedor($proveedor_id) {
        return $this->db
            ->select('id, codigo, fecha, total')
            ->from('lt_orden_compra')
            ->where('proveedor_id', $proveedor_id)
            ->where_in('estado_id', array(18, 19, 20)) // AUT, PAR, EJE — excluir CERRADO(21)
            ->order_by('id', 'DESC')
            ->get()->result();
    }

    public function listar_partes_ingreso_proveedor($proveedor_id) {
        return $this->db
            ->select('id, fecha')
            ->from('lt_parte_ingreso')
            ->where('proveedor_id', $proveedor_id)
            ->where('estado', 1)
            ->where('facturado', 0) // Solo los no facturados
            ->order_by('id', 'DESC')
            ->get()->result();
    }

    public function cerrar_oc($ordc_id) {
        return $this->db->where('id', $ordc_id)->update('lt_orden_compra', array(
            'estado_id'  => 21, // CERRADO
            'updated_at' => date('Y-m-d H:i:s'),
            'updated_by' => $this->session->userdata('id')
        ));
    }

    public function marcar_pi_facturado($pi_id) {
        return $this->db->where('id', $pi_id)->update('lt_parte_ingreso', array(
            'facturado'  => 1,
            'updated_at' => date('Y-m-d H:i:s'),
            'updated_by' => $this->session->userdata('id')
        ));
    }

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