using GB5Shared.DTO.Framework.AutoNumber; using GB5Shared.DTO.Framework.Criteria; using GB5Shared.DTO.Framework.Login; using GB5Shared.GenerateAutoNumber; using GB5Shared.Resource.Response; using GB5Shared.Validation; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WiDAL.CustomCode.WiStep; using WiDAL.DTOs; namespace WiBLL.WiStep { public class WiStepBLL : IWiStepBLL { private readonly IWiStepDAL _dal; private readonly AutoNumber _autoNumber; private readonly IValidation _validation; public WiStepBLL(IWiStepDAL dal, AutoNumber autoNumber, IValidation validation) { _dal = dal; _autoNumber = autoNumber; _validation = validation; } public async Task GetById(int WiStepId, LoginDTO login, CancellationToken ct) => await _dal.GetById(WiStepId, login, ct).ConfigureAwait(false); public async Task Save(WiStepDTO dto, LoginDTO login, CancellationToken ct) { if (dto == null) throw new ArgumentNullException(nameof(dto)); AutoNumberDTO? autoNumberDTO = null; try { bool isNew = dto.WiStepId == 0; if (isNew) { autoNumberDTO = await _autoNumber.GetNumberAsync(1, "WISTEP", login); dto.WiStepId = autoNumberDTO.StartNumber; } // ✅ pass isNew to DAL await _dal.Save(dto, isNew, login, ct); return isNew ? $"{SuccessResponse.SaveSuccess}" : $"{SuccessResponse.UpdateSuccess}"; } catch { if (autoNumberDTO != null && dto.WiStepId > 0) { await _autoNumber.RollbackAutoNumber("WISTEP", dto.WiStepId, login); } throw; } } public async Task GetSelectListWiStep(CriteriaDTO criteriaDTO, LoginDTO login, CancellationToken ct) => await _dal.GetSelectListWiStep(criteriaDTO, login, ct); public async Task DeleteWiStep(int WiStepId, LoginDTO loginDTO) { try { return await _dal.DeleteWiStep(WiStepId, loginDTO); } catch (Exception) { throw; } } public async Task SaveStepWithContent(WiStepDTO dto,LoginDTO login,CancellationToken ct) { if (dto == null) throw new ArgumentNullException(nameof(dto)); AutoNumberDTO? stepAutoNumberDTO = null; AutoNumberDTO? contentAutoNumberDTO = null; try { bool isNew = dto.WiStepId == 0; if (isNew) { // WiStepId and WiStepContentId are unrelated PK spaces — reserve each from its // own entity code (was previously one combined "WISTEPEXECUTION" block covering // both, colliding with the real WiStepExecutionId sequence). stepAutoNumberDTO = await _autoNumber.GetNumberAsync(1, "WISTEP", login); dto.WiStepId = stepAutoNumberDTO.StartNumber; if (dto.Contents is { Count: > 0 }) { contentAutoNumberDTO = await _autoNumber.GetNumberAsync(dto.Contents.Count, "WISTEPCONTENT", login); int nextContentId = contentAutoNumberDTO.StartNumber; foreach (var content in dto.Contents) { content.WiStepContentId = nextContentId++; content.WiStepId = dto.WiStepId; } } } else { var newContents = dto.Contents?.Where(x => x.WiStepContentId == 0).ToList(); if (newContents != null && newContents.Any()) { contentAutoNumberDTO = await _autoNumber.GetNumberAsync(newContents.Count,"WISTEPCONTENT",login); int nextId = contentAutoNumberDTO.StartNumber; foreach (var content in newContents) { content.WiStepContentId = nextId++; content.WiStepId = dto.WiStepId; } } } await _dal.SaveStepWithContent(dto,isNew,login,ct); return isNew ? $"{SuccessResponse.SaveSuccess}" : $"{SuccessResponse.UpdateSuccess}"; } catch { if (stepAutoNumberDTO != null) await _autoNumber.RollbackAutoNumber("WISTEP", stepAutoNumberDTO.StartNumber, login); if (contentAutoNumberDTO != null) await _autoNumber.RollbackAutoNumber("WISTEPCONTENT", contentAutoNumberDTO.StartNumber, login); throw; } } } }