using System.Text.Json; using GB5Shared.DTO.Framework.Login; using GB5Shared.ScanIdentifier; using WiDAL.CustomCode.Workstation; namespace WiBLL.ScanTarget; // Phase 1 resolver for the Scan-Identifier & Label Platform (GB5Shared/ScanIdentifier) — "MWORKSTATION". public class WorkstationResolver : IScanTargetResolver { private readonly IWorkstationDAL _dal; public WorkstationResolver(IWorkstationDAL dal) => _dal = dal; public IEnumerable SupportedEntityTypes => new[] { "MWORKSTATION" }; public async Task ExistsAsync(string entityId, LoginDTO login, CancellationToken ct) => int.TryParse(entityId, out var workstationId) && await _dal.GetByIdAsync(workstationId, login, ct).ConfigureAwait(false) is not null; public async Task GetDisplayAsync(string entityId, LoginDTO login, CancellationToken ct) { if (!int.TryParse(entityId, out var workstationId)) return null; var ws = await _dal.GetByIdAsync(workstationId, login, ct).ConfigureAwait(false); return ws is null ? null : new ScanTargetDisplayDTO { EntityId = entityId, Code = ws.WorkstationCode, Name = ws.WorkstationName, ExtraFields = new Dictionary { ["WorkCenterName"] = ws.WorkCenterName ?? string.Empty } }; } // GetListAsync(workCenterId=-1, activeOnly=true) has no text-search parameter — filters in // memory, same MVP shortcut as WiEntityResolver.SearchAsync. public async Task> SearchAsync(string? term, LoginDTO login, CancellationToken ct) { var json = await _dal.GetListAsync(-1, true, login, ct).ConfigureAwait(false); var rows = JsonSerializer.Deserialize>(json, JsonOpts) ?? []; var filtered = string.IsNullOrWhiteSpace(term) ? rows : rows.Where(r => r.WorkstationCode.Contains(term, StringComparison.OrdinalIgnoreCase) || r.WorkstationName.Contains(term, StringComparison.OrdinalIgnoreCase)); return filtered.Take(20).Select(r => new ScanTargetDisplayDTO { EntityId = r.WorkstationId.ToString(), Code = r.WorkstationCode, Name = r.WorkstationName }); } private static readonly JsonSerializerOptions JsonOpts = new(JsonSerializerDefaults.Web); private sealed class WorkstationListRow { public int WorkstationId { get; set; } public string WorkstationCode { get; set; } = string.Empty; public string WorkstationName { get; set; } = string.Empty; } }