using System.Collections.Generic;
using System.Data.Common;
using System.Threading.Tasks;
using GB5Shared.DTO.Framework.Login;
using GB5Shared.DTO.GOP;
namespace FrameworkDAL.CustomCode.GOP
{
public interface IGopQueueDAL
{
// Queue + Header (atomic, returns both IDs)
Task<(int QueueId, int ExecutionId)> SubmitToQueue(
GopExecutionQueueDTO QueueDTO,
GopExecutionHeaderDTO HeaderDTO,
LoginDTO LoginDTO);
// Queue status
Task UpdateQueueStatus(int ClientId, int QueueId, string Status, string? ErrorMessage, LoginDTO LoginDTO);
// Execution header
Task UpdateExecutionStatus(int ClientId, int ExecutionId, string Status, string? ErrorMessage, long? TotalDurationMs, LoginDTO LoginDTO, string? LastOutputPayloadJson = null);
Task UpdateExecutionCurrentNode(int ClientId, int ExecutionId, int NodeId, string NodeCode, LoginDTO LoginDTO);
/// Pauses an execution at an Approval-gate node — Status becomes 'PendingApproval'.
Task UpdateExecutionApprovalPending(int ClientId, int ExecutionId, int NodeId, string NodeCode, string? LastOutputPayloadJson, string? AssignedRole, int? AssignedToUserId, LoginDTO LoginDTO);
/// Resumes a 'PendingApproval' execution by setting Status back to 'Queued' so the worker re-picks it up.
Task ResumeExecutionAfterApproval(int ClientId, int ExecutionId, LoginDTO LoginDTO);
Task GetExecutionById(int ClientId, int ExecutionId, LoginDTO LoginDTO);
Task> GetExecutionsByStatus(int ClientId, string? Status, int Page, int PageSize, LoginDTO LoginDTO);
// Node logs
Task InsertNodeLog(GopExecutionNodeLogDTO NodeLogDTO, LoginDTO LoginDTO);
Task UpdateNodeLog(int ClientId, int NodeLogId, string Status, string? ResponsePayload, int? HttpStatusCode, long DurationMs, string? ErrorCode, string? ErrorMessage, LoginDTO LoginDTO);
Task> GetNodeLogsByExecution(int ClientId, int ExecutionId, LoginDTO LoginDTO);
// State log
Task InsertStateLog(int ClientId, int ExecutionId, string? PreviousStatus, string NewStatus, string? ReasonCode, string ChangedBy, LoginDTO LoginDTO);
Task> GetStateLogsByExecution(int ClientId, int ExecutionId, LoginDTO LoginDTO);
// Metrics
Task InsertExecutionMetrics(GopExecutionMetricsDTO MetricsDTO, LoginDTO LoginDTO);
Task InsertNodeMetrics(GopExecutionNodeMetricsDTO NodeMetricsDTO, LoginDTO LoginDTO);
// Dead letter
Task InsertDeadLetter(GopDeadLetterDTO DlqDTO, LoginDTO LoginDTO);
Task> GetDeadLetters(int ClientId, LoginDTO LoginDTO);
Task ResolveDeadLetter(int ClientId, int DlqId, string ResolvedBy, LoginDTO LoginDTO);
// Remediation
Task InsertRemediation(GopRemediationDTO RemediationDTO, LoginDTO LoginDTO);
Task UpdateRemediation(int ClientId, int RemediationId, string Status, string ResolutionNotes, string ResolvedBy, LoginDTO LoginDTO);
Task> GetOpenRemediations(int ClientId, LoginDTO LoginDTO);
// Lock
Task AcquireLock(int ClientId, int ExecutionId, string LockedBy, int LockDurationSeconds, LoginDTO LoginDTO);
Task ReleaseLock(int ClientId, int ExecutionId, LoginDTO LoginDTO);
// Worker polling
Task> GetPendingExecutions(int limit, LoginDTO loginDTO);
Task ResetExpiredLocks(LoginDTO loginDTO);
// Dashboard
Task> GetQueueDashboard(int ClientId, LoginDTO LoginDTO);
// Source file
Task InsertSourceFile(GopSourceFileDTO FileDTO, LoginDTO LoginDTO);
Task UpdateSourceFileStatus(int ClientId, int FileId, string Status, int? QueueId, LoginDTO LoginDTO);
}
}