using FrameworkDAL.DTO.MessageHubService.UpdateHandleStatus;
using FrameworkDAL.Query.MessageHubService.TemplateApproval;
using GB5Shared.DTO.Framework.Login;
using GB5Shared.QueryExecutor;
using Microsoft.Extensions.Logging;
using System;
using System.Threading.Tasks;
namespace FrameworkDAL.CustomCode.MessageHubService.TemplateApproval
{
///
/// Data Access Layer for Template Approval and Call Ticket Assignment operations.
/// Handles Accept, Reject, and Forward actions on TCALL.
/// Supports CallId-based approvals.
///
public class TemplateApprovalDAL : ITemplateApprovalDAL
{
private readonly IQueryExecutor _queryExecutor;
private readonly ILogger _logger;
public TemplateApprovalDAL(IQueryExecutor queryExecutor, ILogger logger)
{
_queryExecutor = queryExecutor ?? throw new ArgumentNullException(nameof(queryExecutor));
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
}
///
/// Accepts a call approval ticket.
/// Sets TCALL.STATUS = 1, ACTIONTAKEN = 'ACCEPT'.
///
public async Task AcceptTemplateApproval(TemplateApprovalDTO dto, LoginDTO loginDTO)
{
if (dto == null) throw new ArgumentNullException(nameof(dto));
if (loginDTO == null) throw new ArgumentNullException(nameof(loginDTO));
_logger.LogInformation("AcceptTemplateApproval called | CallId={CallId} | DTO={@DTO}", dto.TicketNumber, dto);
try
{
var sql = TemplateApprovalQB.ACCEPT_TEMPLATE_APPROVAL;
var result = await _queryExecutor.ExecuteAsync(loginDTO, sql, dto);
_logger.LogInformation("AcceptTemplateApproval executed. Rows affected: {Result}", result);
return result;
}
catch (Exception ex)
{
_logger.LogError(ex, "Error in AcceptTemplateApproval | CallId={CallId}", dto.TicketNumber);
throw;
}
}
///
/// Rejects a call approval ticket.
/// Sets TCALL.STATUS = 2, ACTIONTAKEN = 'REJECT'.
///
public async Task RejectTemplateApproval(TemplateApprovalDTO dto, LoginDTO loginDTO)
{
if (dto == null) throw new ArgumentNullException(nameof(dto));
if (loginDTO == null) throw new ArgumentNullException(nameof(loginDTO));
_logger.LogInformation("RejectTemplateApproval called | CallId={CallId} | DTO={@DTO}", dto.TicketNumber, dto);
try
{
var sql = TemplateApprovalQB.REJECT_TEMPLATE_APPROVAL;
var result = await _queryExecutor.ExecuteAsync(loginDTO, sql, dto);
_logger.LogInformation("RejectTemplateApproval executed. Rows affected: {Result}", result);
return result;
}
catch (Exception ex)
{
_logger.LogError(ex, "Error in RejectTemplateApproval | CallId={CallId}", dto.TicketNumber);
throw;
}
}
///
/// Forwards a call approval ticket.
/// Sets TCALL.STATUS = 3, ACTIONTAKEN = 'FORWARD', updates CUSTOMERREMARKS.
///
public async Task ForwardTemplate(TemplateApprovalDTO dto, LoginDTO loginDTO)
{
if (dto == null) throw new ArgumentNullException(nameof(dto));
if (loginDTO == null) throw new ArgumentNullException(nameof(loginDTO));
_logger.LogInformation("ForwardTemplate called | CallId={CallId} | Remarks={Remarks}", dto.TicketNumber, dto.Remarks);
try
{
var sql = TemplateApprovalQB.FORWARD_TEMPLATE;
var result = await _queryExecutor.ExecuteAsync(loginDTO, sql, dto);
_logger.LogInformation("ForwardTemplate executed. Rows affected: {Result}", result);
return result;
}
catch (Exception ex)
{
_logger.LogError(ex, "Error in ForwardTemplate | CallId={CallId}", dto.TicketNumber);
throw;
}
}
}
}