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

class Requerimiento_model extends CI_Model {

    public function listar() {
        return $this->db
            ->select('
                r.*,
                e.nombre as estado_nombre,
                e.codigo as estado_codigo,
                u.usuario as usuario_nombre
            ')
            ->from('lg_requerimiento r')
            ->join('estado e', 'e.id = r.estado_id')
            ->join('usuarios u', 'u.id = r.empleado_id', 'left')
            ->order_by('r.id', 'DESC')
            ->get()
            ->result();
    }

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

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

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

    public function cambiarEstado($id, $estado_id, $usuario_id) {
        return $this->db
            ->where('id', $id)
            ->update('lg_requerimiento', [
                'estado_id' => $estado_id,
                'updated_at' => date('Y-m-d H:i:s'),
                'updated_by' => $usuario_id
            ]);
    }

    public function insertar_estado($data) {
        return $this->db->insert('lg_requerimiento_estado', $data);
    }

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

    public function obtener_estado_por_tipo_codigo($tipo, $codigo) {
        return $this->db
            ->where('tipo', $tipo)
            ->where('codigo', $codigo)
            ->where('estado', 1)
            ->get('estado')
            ->row();
    }

    public function buscar_producto($term) {
        return $this->db
            ->select('
                p.id,
                p.codigo,
                p.nombre,
                p.descripcion,
                p.precio_unidad,
                um.abreviado as unidad_abreviado
            ')
            ->from('vt_producto p')
            ->join('mt_unidad_medida um', 'um.id = p.um_id_venta', 'left')
            ->where('p.estado', 1)
            ->group_start()
            ->like('p.codigo', $term)
            ->or_like('p.nombre', $term)
            ->group_end()
            ->limit(20)
            ->get()
            ->result();
    }

    public function obtener_producto($id) {
        return $this->db
            ->select('
                p.id,
                p.codigo,
                p.nombre,
                p.descripcion,
                p.precio_unidad,
                um.abreviado as unidad_abreviado
            ')
            ->from('vt_producto p')
            ->join('mt_unidad_medida um', 'um.id = p.um_id_venta', 'left')
            ->where('p.id', $id)
            ->get()
            ->row();
    }

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

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

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

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

    public function insertar_producto_almacen($data) {
        return $this->db->insert('vt_producto_almacen', $data);
    }

    public function obtener_almacen_principal() {
        return $this->db
            ->where('estado', 1)
            ->order_by('id', 'ASC')
            ->get('mt_almacen')
            ->row();
    }

    public function obtener_detalle($req_id) {
        return $this->db
            ->select('
                d.*,
                p.codigo as producto_codigo,
                p.nombre as producto_nombre,
                um.abreviado as unidad_abreviado,
                e.nombre as estado_nombre,
                e.codigo as estado_codigo
            ')
            ->from('lg_requerimiento_detalle d')
            ->join('vt_producto p', 'p.id = d.producto_id')
            ->join('mt_unidad_medida um', 'um.id = p.um_id_venta', 'left')
            ->join('estado e', 'e.id = d.estado_id', 'left')
            ->where('d.req_id', $req_id)
            ->order_by('d.id', 'ASC')
            ->get()
            ->result();
    }

    public function obtener_historial_estados($req_id) {
        return $this->db
            ->select('
                re.*,
                e.nombre as estado_nombre,
                e.codigo as estado_codigo,
                u.usuario
            ')
            ->from('lg_requerimiento_estado re')
            ->join('estado e', 'e.id = re.estado_id')
            ->join('usuarios u', 'u.id = re.usuario_id', 'left')
            ->where('re.req_id', $req_id)
            ->order_by('re.id', 'ASC')
            ->get()
            ->result();
    }

    public function obtener_completo($id) {
        return $this->db
            ->select('
                r.*,
                e.nombre as estado_nombre,
                e.codigo as estado_codigo,
                u.usuario as usuario_nombre
            ')
            ->from('lg_requerimiento r')
            ->join('estado e', 'e.id = r.estado_id')
            ->join('usuarios u', 'u.id = r.empleado_id', 'left')
            ->where('r.id', $id)
            ->get()
            ->row();
    }

    public function listar_por_orp($orp_id) {
        return $this->db
            ->select('
                r.*,
                e.nombre as estado_nombre,
                e.codigo as estado_codigo,
                u.usuario as usuario_nombre
            ')
            ->from('lg_requerimiento r')
            ->join('estado e', 'e.id = r.estado_id')
            ->join('usuarios u', 'u.id = r.empleado_id', 'left')
            ->where('r.orp_id', $orp_id)
            ->order_by('r.id', 'DESC')
            ->get()
            ->result();
    }

    public function contar_por_orp($orp_id) {
        return $this->db
            ->where('orp_id', $orp_id)
            ->count_all_results('lg_requerimiento');
    }

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

}