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

class FacturaServicio_model extends CI_Model {

    public function listar() {
        return $this->db
            ->select('
                cp.*,
                p.razon_social as proveedor,
                p.nro_documento as proveedor_ruc,
                sn.nombre as sector_negocio,
                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_sector_negocio sn','sn.id = p.sn_id',      'left')
            ->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.tipo_gasto', 'S')
            ->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,
                sn.nombre as sector_negocio,
                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_sector_negocio sn', 'sn.id = p.sn_id',      'left')
            ->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_detalle($cp_id) {
        return $this->db
            ->select('
                d.*,
                sn.nombre as sector_nombre
            ')
            ->from('cp_comprobante_proveedor_det_servicio d')
            ->join('mt_sector_negocio sn', 'sn.id = d.sector_negocio_id', 'left')
            ->where('d.cp_id', $cp_id)
            ->order_by('d.id', 'ASC')
            ->get()->result();
    }

    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_detalle_batch($data) {
        return $this->db->insert_batch('cp_comprobante_proveedor_det_servicio', $data);
    }

    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;
    }

    // ---------------------------------------------------------------
    // HISTORIAL POR SECTOR — para consultas de historial
    // ---------------------------------------------------------------
    public function historial_por_sector($sector_negocio_id, $desde = null, $hasta = null) {
        $this->db
            ->select('
                d.*,
                sn.nombre as sector_nombre,
                cp.serie, cp.numero, cp.fecha_emision,
                cp.tipo_comprobante, cp.estado,
                p.razon_social as proveedor,
                m.abreviado as moneda_abreviado
            ')
            ->from('cp_comprobante_proveedor_det_servicio d')
            ->join('cp_comprobante_proveedor cp', 'cp.id = d.cp_id')
            ->join('mt_sector_negocio sn',        'sn.id = d.sector_negocio_id', 'left')
            ->join('lt_proveedor p',              'p.id = cp.proveedor_id')
            ->join('mt_moneda m',                 'm.id = cp.moneda_id', 'left')
            ->where('d.sector_negocio_id', $sector_negocio_id)
            ->where('cp.tipo_gasto', 'S')
            ->where('cp.estado !=', 3); // excluir anulados

        if ($desde) $this->db->where('cp.fecha_emision >=', $desde);
        if ($hasta) $this->db->where('cp.fecha_emision <=', $hasta . ' 23:59:59');

        return $this->db->order_by('cp.fecha_emision', 'DESC')->get()->result();
    }

    // ---------------------------------------------------------------
    // AUXILIARES
    // ---------------------------------------------------------------
    public function buscar_proveedor($term) {
        return $this->db
            ->select('p.id, p.razon_social, p.nro_documento, p.fp_id, p.moneda_id, sn.nombre as sector_negocio')
            ->from('lt_proveedor p')
            ->join('mt_sector_negocio sn', 'sn.id = p.sn_id', 'left')
            ->where('p.estado', 1)
            ->group_start()
                ->like('p.razon_social', $term)
                ->or_like('p.nro_documento', $term)
            ->group_end()
            ->limit(20)
            ->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_sectores_negocio() {
        return $this->db
            ->where('estado', 1)
            ->order_by('nombre', 'ASC')
            ->get('mt_sector_negocio')
            ->result();
    }
}
