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

class Kardex extends MY_Controller {

    public function __construct() {
        parent::__construct();
        $this->load->model('almacen/Kardex_model');
        $this->load->model('configuracion/Empresa_model');
    }

    // ---------------------------------------------------------------
    // FORMULARIO DE CONSULTA
    // ---------------------------------------------------------------
    public function index() {
        $this->validar_permiso('kardex_ver');

        $data['titulo']    = 'Kardex de Inventario';
        $data['almacenes'] = $this->Kardex_model->listar_almacenes();
        $data['kardex']    = null;
        $data['producto']  = null;
        $data['filtros']   = null;
        $data['empresa']   = $this->Empresa_model->obtener_activa();
        $data['fecha_reporte'] = date('d/m/Y H:i');

        $this->layout('almacen/kardex/index', $data);
    }

    // ---------------------------------------------------------------
    // CONSULTAR KARDEX
    // ---------------------------------------------------------------
    public function consultar() {
        $this->validar_permiso('kardex_ver');

        $producto_id = $this->input->post('producto_id', TRUE);
        $almacen_id  = $this->input->post('almacen_id', TRUE);
        $fecha_desde = $this->input->post('fecha_desde', TRUE);
        $fecha_hasta = $this->input->post('fecha_hasta', TRUE);

        if (empty($producto_id) || empty($almacen_id) || empty($fecha_desde) || empty($fecha_hasta)) {
            $this->session->set_flashdata('error', 'Debes completar todos los filtros');
            redirect('almacen/kardex');
        }

        $producto        = $this->Kardex_model->obtener_producto($producto_id);
        $saldo_inicial   = $this->Kardex_model->saldo_inicial($producto_id, $almacen_id, $fecha_desde . ' 00:00:00');
        $precio_promedio = $this->Kardex_model->precio_promedio_actual($producto_id, $almacen_id);
        $movimientos     = $this->Kardex_model->movimientos($producto_id, $almacen_id, $fecha_desde . ' 00:00:00', $fecha_hasta);

        // Calcular saldo acumulado y precio promedio ponderado por fila
        $saldo_cant   = $saldo_inicial['cantidad'];
        $precio_prom  = $precio_promedio;
        $kardex_rows  = array();

        foreach ($movimientos as $mov) {
            if ($mov['entrada'] > 0) {
                // Precio promedio ponderado al ingresar
                $total_antes  = $saldo_cant * $precio_prom;
                $total_ingreso = $mov['entrada'] * $mov['precio_unitario'];
                $saldo_cant   += $mov['entrada'];
                $precio_prom   = $saldo_cant > 0
                    ? round(($total_antes + $total_ingreso) / $saldo_cant, 4)
                    : $mov['precio_unitario'];
            } else {
                $saldo_cant -= $mov['salida'];
                // Precio promedio no cambia en salida
            }

            $kardex_rows[] = array_merge($mov, array(
                'saldo'         => $saldo_cant,
                'precio_promedio'=> $precio_prom,
                'saldo_valorado' => round($saldo_cant * $precio_prom, 2)
            ));
        }

        $almacenes = $this->Kardex_model->listar_almacenes();
        $almacen   = null;
        foreach ($almacenes as $a) {
            if ($a->id == $almacen_id) { $almacen = $a; break; }
        }

        $data['titulo']        = 'Kardex de Inventario';
        $data['almacenes']     = $almacenes;
        $data['producto']      = $producto;
        $data['almacen']       = $almacen;
        $data['saldo_inicial'] = $saldo_inicial['cantidad'];
        $data['precio_inicial']= $precio_promedio;
        $data['kardex']        = $kardex_rows;
        $data['filtros']       = array(
            'producto_id' => $producto_id,
            'almacen_id'  => $almacen_id,
            'fecha_desde' => $fecha_desde,
            'fecha_hasta' => $fecha_hasta
        );
        $data['empresa']       = $this->Empresa_model->obtener_activa();
        $data['fecha_reporte'] = date('d/m/Y H:i');

        $this->layout('almacen/kardex/index', $data);
    }

    // ---------------------------------------------------------------
    // AJAX - BUSCAR PRODUCTO
    // ---------------------------------------------------------------
    public function buscar_producto() {
        if (!tiene_permiso('kardex_ver')) {
            echo json_encode(array()); return;
        }
        $term = trim($this->input->get('term', TRUE));
        if (strlen($term) < 2) { echo json_encode(array()); return; }

        $productos = $this->Kardex_model->buscar_producto($term);
        $resultado = array();
        foreach ($productos as $item) {
            $resultado[] = array(
                'id'               => $item->id,
                'label'            => $item->codigo . ' | ' . $item->nombre,
                'value'            => $item->nombre,
                'codigo'           => $item->codigo,
                'nombre'           => $item->nombre,
                'unidad_abreviado' => $item->unidad_abreviado
            );
        }
        echo json_encode($resultado);
    }
}