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

class AjusteInventario_model extends CI_Model {

    public function listar() {
        return $this->db
            ->select('
                aj.*,
                a.nombre as almacen,
                m.nombre as motivo,
                u.usuario as usuario_creador
            ')
            ->from('lt_ajuste_inventario aj')
            ->join('mt_almacen a',       'a.id = aj.almacen_id')
            ->join('mt_motivo_ajuste m', 'm.id = aj.motivo_ajuste_id')
            ->join('usuarios u',         'u.id = aj.created_by', 'left')
            ->order_by('aj.id', 'DESC')
            ->get()->result();
    }

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

    public function obtener_completo($id) {
        return $this->db
            ->select('
                aj.*,
                a.nombre as almacen,
                m.nombre as motivo,
                u.usuario as usuario_creador,
                ua.usuario as usuario_aprobador
            ')
            ->from('lt_ajuste_inventario aj')
            ->join('mt_almacen a',       'a.id = aj.almacen_id')
            ->join('mt_motivo_ajuste m', 'm.id = aj.motivo_ajuste_id')
            ->join('usuarios u',         'u.id = aj.created_by',  'left')
            ->join('usuarios ua',        'ua.id = aj.updated_by', 'left')
            ->where('aj.id', $id)
            ->get()->row();
    }

    public function obtener_detalle($aj_id) {
        return $this->db
            ->select('
                d.*,
                p.codigo as producto_codigo,
                p.nombre as producto_nombre,
                um.abreviado as unidad_abreviado
            ')
            ->from('lt_ajuste_inventario_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.aj_id', $aj_id)
            ->order_by('d.id', 'ASC')
            ->get()->result();
    }

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

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

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

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

    // ---------------------------------------------------------------
    // STOCK
    // ---------------------------------------------------------------
    public function aplicar_ajuste_stock($producto_id, $almacen_id, $diferencia) {
        $registro = $this->db
            ->where('producto_id', $producto_id)
            ->where('almacen_id', $almacen_id)
            ->get('vt_producto_almacen')->row();

        if ($registro) {
            $nuevo_stock = max(0, (float)$registro->cantidad_stock + (float)$diferencia);
            $this->db->where('producto_id', $producto_id)
                     ->where('almacen_id', $almacen_id)
                     ->update('vt_producto_almacen', array(
                         'cantidad_stock' => $nuevo_stock,
                         'updated_at'     => date('Y-m-d H:i:s'),
                         'updated_by'     => $this->session->userdata('id')
                     ));
        } else {
            $cant = max(0, (float)$diferencia);
            $this->db->insert('vt_producto_almacen', array(
                'producto_id'           => $producto_id,
                'almacen_id'            => $almacen_id,
                'cantidad_stock'        => $cant,
                'precio_promedio'       => 0,
                'cantidad_reposicion'   => 0,
                'cantidad_comprometida' => 0,
                'cantidad_minima'       => 0,
                'cantidad_maxima'       => 0,
                'created_by'            => $this->session->userdata('id')
            ));
        }
    }

    public function revertir_ajuste_stock($producto_id, $almacen_id, $diferencia) {
        $registro = $this->db
            ->where('producto_id', $producto_id)
            ->where('almacen_id', $almacen_id)
            ->get('vt_producto_almacen')->row();

        if (!$registro) return;

        $nuevo_stock = max(0, (float)$registro->cantidad_stock - (float)$diferencia);
        $this->db->where('producto_id', $producto_id)
                 ->where('almacen_id', $almacen_id)
                 ->update('vt_producto_almacen', array(
                     'cantidad_stock' => $nuevo_stock,
                     'updated_at'     => date('Y-m-d H:i:s'),
                     'updated_by'     => $this->session->userdata('id')
                 ));
    }

    public function obtener_stock_actual($producto_id, $almacen_id) {
        $registro = $this->db
            ->where('producto_id', $producto_id)
            ->where('almacen_id', $almacen_id)
            ->get('vt_producto_almacen')->row();

        return $registro ? (float)$registro->cantidad_stock : 0;
    }

    public function obtener_precio_promedio($producto_id, $almacen_id) {
        $registro = $this->db
            ->where('producto_id', $producto_id)
            ->where('almacen_id', $almacen_id)
            ->get('vt_producto_almacen')->row();

        return $registro ? (float)$registro->precio_promedio : 0;
    }

    // ---------------------------------------------------------------
    // AUXILIARES
    // ---------------------------------------------------------------
    public function listar_almacenes() {
        return $this->db->where('estado', 1)->order_by('nombre', 'ASC')->get('mt_almacen')->result();
    }

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

    public function buscar_producto($term, $almacen_id = null) {
        $this->db->select('
            p.id, p.codigo, p.nombre, p.maneja_stock,
            um.abreviado as unidad_abreviado,
            IFNULL(pa.cantidad_stock, 0) as stock_actual,
            IFNULL(pa.precio_promedio, 0) as precio_promedio
        ');
        $this->db->from('vt_producto p');
        $this->db->join('mt_unidad_medida um', 'um.id = p.um_id_venta', 'left');
        if ($almacen_id) {
            $this->db->join('vt_producto_almacen pa',
                'pa.producto_id = p.id AND pa.almacen_id = ' . (int)$almacen_id, 'left');
        } else {
            $this->db->join('vt_producto_almacen pa', 'pa.producto_id = p.id', 'left');
        }
        $this->db->where('p.estado', 1);
        $this->db->where('p.maneja_stock', 1);
        $this->db->group_start();
        $this->db->like('p.codigo', $term);
        $this->db->or_like('p.nombre', $term);
        $this->db->group_end();
        $this->db->limit(20);
        return $this->db->get()->result();
    }

    public function es_autorizador_ajuste($usuario_id) {
        $proceso_id = 6; // Proceso AJUSTE INVENTARIO en mt_proceso
        return $this->db
            ->where('proceso_id', $proceso_id)
            ->where('usuario_id', $usuario_id)
            ->where('estado', 1)
            ->get('visadores')->num_rows() > 0;
    }
}
