using System.Data.Common; using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; using GB5Shared.ResponseStandard; using IDMSDAL.DTOs; using IDMSDAL.Interfaces; using IDMSDAL.QueryBuilders; namespace IDMSDAL.Implementations; public class SignalDAL : ISignalDAL { private readonly IQueryExecutor _QueryExecutor; public SignalDAL(IQueryExecutor queryExecutor) { _QueryExecutor = queryExecutor; } public async Task> GetActiveSignalsAsync( int engagementId, LoginDTO login, CancellationToken ct) { return await _QueryExecutor.QueryAsync( login, SignalQB.GET_ACTIVE_BY_ENGAGEMENT, new { EngagementId = engagementId }, cancellationToken: ct).ConfigureAwait(false) ?? Enumerable.Empty(); } public async Task GetSignalScoreAsync( int engagementId, LoginDTO login, CancellationToken ct) { return await _QueryExecutor.ExecuteScalarAsync( login, SignalQB.GET_SCORE_BY_ENGAGEMENT, new { EngagementId = engagementId }, cancellationToken: ct).ConfigureAwait(false); } // INSERT-only; returns new IDENTITY value. // DETECTEDON is set by GETDATE() in the SQL — no DTO field needed. public async Task InsertSignalAsync( EngagementSignalDTO dto, LoginDTO login, DbTransaction tx, CancellationToken ct) { try { dto.CreatedById = login.UserId; dto.CreatedOn = DateTime.UtcNow; int newId = await _QueryExecutor.ExecuteIdentityAsync( login, SignalQB.INSERT, dto, tx).ConfigureAwait(false); return newId; } catch (Exception) { throw; } } public async Task> ResolveSignalAsync( int signalId, int resolvedById, DateTime resolvedOn, LoginDTO login, DbTransaction tx, CancellationToken ct) { try { var param = new { SignalId = signalId, ResolvedById = resolvedById, ResolvedOn = resolvedOn }; int rows = await _QueryExecutor.ExecuteAsync( login, SignalQB.RESOLVE, param, tx, cancellationToken: ct).ConfigureAwait(false); return rows > 0 ? Result.Success("Signal resolved.") : Result.Failure("Signal not found."); } catch (Exception) { throw; } } }