using Core.Interfaces.Stock; // ILSStockScanDom using Domain.Dtos.Stock; // StockItemSearchParams, StockItemScanResultDto using Domain.Generics; // PagedResult using Microsoft.AspNetCore.Mvc; using Transversal.Services; namespace API.Controllers.Stock { [Route("api/[controller]")] [ApiController] public class LSStockScanController : ControllerBase { private readonly ILSStockScanDom _service; public LSStockScanController(ILSStockScanDom service) { _service = service; } /// /// Búsqueda paginada de ítems de stock por código/texto, lote y filtros opcionales. /// [HttpPost("search")] public async Task>> Search([FromBody] StockItemSearchParams searchParams) { var result = await _service.SearchAsync(searchParams); return Ok(result); } /// Realiza una búsqueda paginada de ítems de stock utilizando datos ya parseados /// (por ejemplo, provenientes de un código GS1 escaneado). /// /// /// Parámetros de búsqueda ya procesados y listos para filtrar en base de datos, /// incluyendo código de producto, lote, fecha de vencimiento, ubicación, etc. /// /// /// Lista paginada de ítems de stock que cumplen con los filtros especificados. /// [HttpPost("search-parsed")] public async Task>> SearchParsed([FromBody] StockItemParsedSearchParams searchParams) { var result = await _service.SearchParsedAsync(searchParams); return Ok(result); } // DTO liviano para el request RAW public record StockScanRawRequest(string Raw, int LocationId, int Page = 1, int PageSize = 10); /// /// Recibe un escaneo RAW (GS1-128/DataMatrix), lo parsea y ejecuta la búsqueda paginada. /// [HttpPost("parse-and-search")] public async Task>> ParseAndSearch([FromBody] StockScanRawRequest req) { if (string.IsNullOrWhiteSpace(req.Raw)) return BadRequest("Raw is required."); // 1) Parseo GS1 en backend var parsed = Gs1CodeParser.Parse(req.Raw.Trim()); // 2) Armar parámetros "ya parseados" var sp = new StockItemParsedSearchParams { Gtin = string.IsNullOrWhiteSpace(parsed.Gtin) ? parsed.Variant : parsed.Gtin, // (22) como fallback Batch = string.IsNullOrWhiteSpace(parsed.Lot) ? null : parsed.Lot, Expiration = parsed.ExpirationDate.HasValue ? DateOnly.FromDateTime(parsed.ExpirationDate.Value) : null, Serial = string.IsNullOrWhiteSpace(parsed.Serial) ? null : parsed.Serial, LocationId = req.LocationId, Page = req.Page, PageSize = req.PageSize }; // 3) Delegar a la misma lógica que ya tenés implementada var result = await _service.SearchParsedAsync(sp); return Ok(result); } } }