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

class SinMovimiento_model extends CI_Model {

    public function listar($almacen_id = null, $dias = 90) {
        $fecha_corte = date('Y-m-d H:i:s', strtotime('-' . (int)$dias . ' days'));

        // Subconsulta: último movimiento por producto y almacén
        $sql_ultimo_mov = "
            SELECT producto_id, almacen_id, MAX(fecha) as ultimo_movimiento
            FROM (
                SELECT d.producto_id, pi.almacen_id, pi.fecha
                FROM lt_parte_ingreso_det d
                JOIN lt_parte_ingreso pi ON pi.id = d.pi_id
                WHERE pi.estado = 1

                UNION ALL

                SELECT d.producto_id, ps.almacen_id, ps.fecha
                FROM lt_parte_salida_det d
                JOIN lt_parte_salida ps ON ps.id = d.ps_id
                WHERE ps.estado = 1
            ) movimientos
            GROUP BY producto_id, almacen_id
        ";

        $query = "
            SELECT
                p.codigo,
                p.nombre as producto,
                cat.nombre as categoria,
                a.nombre as almacen,
                a.id as almacen_id,
                um.abreviado as unidad,
                IFNULL(pa.cantidad_stock, 0) as stock_actual,
                IFNULL(pa.precio_promedio, 0) as precio_promedio,
                mov.ultimo_movimiento,
                CASE
                    WHEN mov.ultimo_movimiento IS NULL THEN NULL
                    ELSE DATEDIFF(NOW(), mov.ultimo_movimiento)
                END as dias_sin_movimiento
            FROM vt_producto p
            LEFT JOIN mt_producto_categoria cat ON cat.id = p.categoria_id
            LEFT JOIN mt_unidad_medida um       ON um.id = p.um_id_venta
            JOIN vt_producto_almacen pa         ON pa.producto_id = p.id
            JOIN mt_almacen a                   ON a.id = pa.almacen_id
            LEFT JOIN ({$sql_ultimo_mov}) mov   ON mov.producto_id = p.id AND mov.almacen_id = pa.almacen_id
            WHERE p.estado = 1
              AND p.maneja_stock = 1
              AND (
                  mov.ultimo_movimiento IS NULL
                  OR mov.ultimo_movimiento < '{$fecha_corte}'
              )
        ";

        if ($almacen_id) {
            $query .= " AND pa.almacen_id = " . (int)$almacen_id;
        }

        $query .= " ORDER BY dias_sin_movimiento DESC, p.nombre ASC";

        return $this->db->query($query)->result();
    }

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