using GB5Shared.DTO.Framework.Login;
using GB5Shared.Resource.Response;
using Microsoft.Extensions.Logging;
using TCMSBLL.Interfaces;
using TCMSDAL.DTO;
using TCMSDAL.Interfaces;
namespace TCMSBLL.Implementations;
///
/// Business logic for MTCMSPROJECT.
/// Validates uniqueness of ProjectCode per tenant before save.
///
public class TCMSProjectBLL : ITCMSProjectBLL
{
private readonly ITCMSProjectDAL _Dal;
private readonly ILogger _Logger;
public TCMSProjectBLL(ITCMSProjectDAL dal, ILogger logger)
{
_Dal = dal;
_Logger = logger;
}
public async Task GetProjectAsync(
int projectId, LoginDTO login, CancellationToken ct)
=> await _Dal.GetProjectAsync(projectId, login, ct).ConfigureAwait(false);
public async Task> GetProjectListAsync(
string? projectType, string? status, bool? isActive,
LoginDTO login, CancellationToken ct)
=> await _Dal.GetProjectListAsync(projectType, status, isActive, login, ct).ConfigureAwait(false);
public async Task> GetSelectListAsync(
LoginDTO login, CancellationToken ct)
=> await _Dal.GetSelectListAsync(login, ct).ConfigureAwait(false);
public async Task SaveProjectAsync(
TCMSProjectDTO dto, LoginDTO login, CancellationToken ct)
{
try
{
// Validation
if (string.IsNullOrWhiteSpace(dto.ProjectCode))
return "Project Code is required.";
if (string.IsNullOrWhiteSpace(dto.ProjectName))
return "Project Name is required.";
bool codeExists = await _Dal.CodeExistsAsync(dto.ProjectCode, dto.ProjectId > 0 ? dto.ProjectId : null, login, ct).ConfigureAwait(false);
if (codeExists)
return $"Project Code '{dto.ProjectCode}' already exists.";
bool isNew = dto.ProjectId == 0;
if (isNew)
{
int newId = await _Dal.SaveProjectAsync(dto, login, ct).ConfigureAwait(false);
return $"{SuccessResponse.SaveSuccessMessage} {newId}";
}
else
{
await _Dal.UpdateProjectAsync(dto, login, ct).ConfigureAwait(false);
return SuccessResponse.UpdateSuccess;
}
}
catch (Exception ex)
{
_Logger.LogError(ex, "SaveProject failed for code {Code}", dto.ProjectCode);
throw;
}
}
}