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

class Kardex_model extends CI_Model {

    // ---------------------------------------------------------------
    // SALDO INICIAL antes del rango de fechas
    // ---------------------------------------------------------------
    public function saldo_inicial($producto_id, $almacen_id, $fecha_desde) {
        // Entradas antes de fecha_desde
        $entradas = $this->db
            ->select('IFNULL(SUM(d.cantidad), 0) as total')
            ->from('lt_parte_ingreso_det d')
            ->join('lt_parte_ingreso pi', 'pi.id = d.pi_id')
            ->where('d.producto_id', $producto_id)
            ->where('pi.almacen_id', $almacen_id)
            ->where('pi.estado', 1)
            ->where('pi.fecha <', $fecha_desde)
            ->get()->row();

        // Salidas antes de fecha_desde
        $salidas = $this->db
            ->select('IFNULL(SUM(d.cantidad), 0) as total')
            ->from('lt_parte_salida_det d')
            ->join('lt_parte_salida ps', 'ps.id = d.ps_id')
            ->where('d.producto_id', $producto_id)
            ->where('ps.almacen_id', $almacen_id)
            ->where('ps.estado', 1)
            ->where('ps.fecha <', $fecha_desde)
            ->get()->row();

        return array(
            'cantidad' => (float)$entradas->total - (float)$salidas->total
        );
    }

    // ---------------------------------------------------------------
    // PRECIO PROMEDIO ACTUAL del producto en el almacén
    // ---------------------------------------------------------------
    public function precio_promedio_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->precio_promedio : 0;
    }

    // ---------------------------------------------------------------
    // MOVIMIENTOS en el rango de fechas
    // ---------------------------------------------------------------
    public function movimientos($producto_id, $almacen_id, $fecha_desde, $fecha_hasta) {
        $fecha_hasta_fin = date('Y-m-d', strtotime($fecha_hasta)) . ' 23:59:59';

        // ENTRADAS
        $entradas = $this->db
            ->select('
                pi.fecha,
                "INGRESO" as tipo,
                pi.id as referencia_id,
                "PI" as referencia_tipo,
                pi.tipoingreso,
                d.detalle as descripcion,
                d.cantidad,
                d.precio_unitario,
                d.subtotal,
                pi.ordc_id,
                pi.req_id
            ')
            ->from('lt_parte_ingreso_det d')
            ->join('lt_parte_ingreso pi', 'pi.id = d.pi_id')
            ->where('d.producto_id', $producto_id)
            ->where('pi.almacen_id', $almacen_id)
            ->where('pi.estado', 1)
            ->where('pi.fecha >=', $fecha_desde)
            ->where('pi.fecha <=', $fecha_hasta_fin)
            ->get()->result();

        // SALIDAS
        $salidas = $this->db
            ->select('
                ps.fecha,
                "SALIDA" as tipo,
                ps.id as referencia_id,
                "PS" as referencia_tipo,
                ps.tiposalida,
                d.detalle as descripcion,
                d.cantidad,
                d.precio_unitario,
                d.subtotal,
                ps.comprob_id,
                ps.cliente_id
            ')
            ->from('lt_parte_salida_det d')
            ->join('lt_parte_salida ps', 'ps.id = d.ps_id')
            ->where('d.producto_id', $producto_id)
            ->where('ps.almacen_id', $almacen_id)
            ->where('ps.estado', 1)
            ->where('ps.fecha >=', $fecha_desde)
            ->where('ps.fecha <=', $fecha_hasta_fin)
            ->get()->result();

        // Unir y ordenar por fecha
        $movimientos = array();

        foreach ($entradas as $e) {
            $tipos_ingreso = array('C'=>'COMPRA','P'=>'PRODUCCIÓN','R'=>'REINGRESO','A'=>'TRASLADO');
            $ref = 'PI-' . str_pad($e->referencia_id, 5, '0', STR_PAD_LEFT);
            if (!empty($e->ordc_id)) $ref .= ' / OC-' . str_pad($e->ordc_id, 5, '0', STR_PAD_LEFT);
            if (!empty($e->req_id))  $ref .= ' / REQ-' . str_pad($e->req_id, 5, '0', STR_PAD_LEFT);

            $movimientos[] = array(
                'fecha'          => $e->fecha,
                'tipo'           => 'INGRESO',
                'subtipo'        => isset($tipos_ingreso[$e->tipoingreso]) ? $tipos_ingreso[$e->tipoingreso] : $e->tipoingreso,
                'referencia'     => $ref,
                'descripcion'    => $e->descripcion,
                'entrada'        => (float)$e->cantidad,
                'salida'         => 0,
                'precio_unitario'=> (float)$e->precio_unitario,
            );
        }

        foreach ($salidas as $s) {
            $tipos_salida = array('V'=>'VENTA','A'=>'TRASLADO','M'=>'MUESTRA','C'=>'CONSUMO');
            $ref = 'PS-' . str_pad($s->referencia_id, 5, '0', STR_PAD_LEFT);
            if (!empty($s->comprob_id)) $ref .= ' / COMP-' . str_pad($s->comprob_id, 5, '0', STR_PAD_LEFT);

            $movimientos[] = array(
                'fecha'          => $s->fecha,
                'tipo'           => 'SALIDA',
                'subtipo'        => isset($tipos_salida[$s->tiposalida]) ? $tipos_salida[$s->tiposalida] : $s->tiposalida,
                'referencia'     => $ref,
                'descripcion'    => $s->descripcion,
                'entrada'        => 0,
                'salida'         => (float)$s->cantidad,
                'precio_unitario'=> (float)$s->precio_unitario,
            );
        }

        // Ordenar por fecha ASC
        usort($movimientos, function($a, $b) {
            return strtotime($a['fecha']) - strtotime($b['fecha']);
        });

        return $movimientos;
    }

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

    public function buscar_producto($term) {
        $this->db->select('p.id, p.codigo, p.nombre, um.abreviado as unidad_abreviado');
        $this->db->from('vt_producto p');
        $this->db->join('mt_unidad_medida um', 'um.id = p.um_id_venta', 'left');
        $this->db->where('p.estado', 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 obtener_producto($id) {
        return $this->db
            ->select('p.*, um.nombre as unidad_nombre, 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();
    }
}
