using EnablementDAL.CustomCode.Show; using EnablementDAL.DTO; using EnablementDAL.Query.Show; using GB5Shared.DTO.Framework.Criteria; using GB5Shared.DTO.Framework.Login; using GB5Shared.Resource.Response; using Newtonsoft.Json; namespace EnablementBLL.Show { // Moved from GB5Framework/FrameworkBLL/TourShow/TourShowBLL.cs. Adds nature-driven // field-applicability validation (multi-step natures must have at least one step) — the only // save-time rule that existed before this move was a non-empty ShowName check. public class ShowBLL : IShowBLL { private readonly IShowDAL _ShowDAL; public ShowBLL(IShowDAL ShowDAL) { _ShowDAL = ShowDAL; } public async Task GetShow(int ShowId, LoginDTO loginDTO) { try { string sql = ShowQB.GET_SHOW; var parameters = new { showid = ShowId }; var result = await _ShowDAL.GetShow(loginDTO, sql, parameters); return JsonConvert.SerializeObject(result); } catch (Exception) { throw; } } public async Task GetSelectListShow(CriteriaDTO criteriaDTO, LoginDTO loginDTO) { try { var data = await _ShowDAL.GetSelectListShow(criteriaDTO, loginDTO); return JsonConvert.SerializeObject(data); } catch (Exception) { throw; } } /// /// Save or Update Show along with its related entities /// public async Task SaveShow(TShowDTO showDTO, LoginDTO loginDTO) { if (showDTO == null) throw new ArgumentNullException(nameof(showDTO)); if (string.IsNullOrWhiteSpace(showDTO.ShowName)) throw new ArgumentException("ShowName is required."); if (ShowNatureConstant.IsMultiStep(showDTO.ShowNature) && showDTO.ShowStepArray.Count == 0) throw new ArgumentException("At least one step is required for this Show type."); if (showDTO.ShowId == 0) { showDTO.CreatedById = loginDTO.UserId; showDTO.CreatedOn = DateTime.UtcNow; showDTO.ModifiedById = loginDTO.UserId; showDTO.ModifiedOn = DateTime.UtcNow; int showId = await _ShowDAL.SaveCompleteShow(showDTO, loginDTO); return $"{SuccessResponse.SaveSuccessMessage} {showId}"; } showDTO.ModifiedById = loginDTO.UserId; showDTO.ModifiedOn = DateTime.UtcNow; await _ShowDAL.UpdateCompleteShow(showDTO, loginDTO); return $"{SuccessResponse.UpdateSuccessMessage} {showDTO.ShowId}"; } /// /// Soft-deletes a Show (STATUS = 0). Blocked while any run is InProgress — /// a user actively mid-flow should not have the Show pulled out from under them. /// public async Task DeleteShow(int showId, LoginDTO loginDTO) { if (showId <= 0) throw new ArgumentException("Invalid ShowId for delete."); int activeRuns = await _ShowDAL.GetActiveRunCountForShow(showId, loginDTO); if (activeRuns > 0) throw new InvalidOperationException(ErrorResponse.DeleteErrorMessage); int affected = await _ShowDAL.SoftDeleteShow(showId, loginDTO); return affected > 0 ? SuccessResponse.DeleteSuccessMessage : ErrorResponse.DeleteNotFoundMessage; } public async Task GetShowPicklist(LoginDTO loginDTO) => await _ShowDAL.GetShowPicklist(loginDTO); } }