using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using FrameworkDAL.DTO.Dataset; using FrameworkDAL.Query.Dataset; using GB5Shared.DTO.Framework.Criteria; using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; using GB5Shared.Resource.Response; using GB5Shared.ResponseStandard; using GB5Shared.Validation; using Newtonsoft.Json; using static Google.Protobuf.Reflection.ExtensionRangeOptions.Types; namespace FrameworkDAL.CustomCode.Dataset { public class DatasetDAL : IDatasetDAL { private readonly IQueryExecutor _QueryExecutor; private readonly IValidation _Validation; public DatasetDAL(IQueryExecutor QueryExecutor, IValidation IValidation) { _QueryExecutor = QueryExecutor; _Validation = IValidation; } public async Task GetDataset(int DatasetId, LoginDTO LoginDTO) { try { var sql = DatasetQB.GET_DATASET; var parameters = new { datasetid = DatasetId }; var DatasetDict = new Dictionary(); var result = await _QueryExecutor.QueryMultiMapAsync( LoginDTO, sql, (parent, child) => { if (!DatasetDict.TryGetValue(parent.DatasetId, out var existingParent)) { existingParent = parent; existingParent.DatasetDetailArray = new List(); DatasetDict[parent.DatasetId] = existingParent; } if (child != null && child.DatasetDetailId != 0) { existingParent.DatasetDetailArray.Add(child); } return existingParent; }, parameters, splitOn: "DatasetDetailId" ); var finalResult = DatasetDict.Values.FirstOrDefault(); return JsonConvert.SerializeObject(finalResult); } catch (Exception ex) { throw new Exception($"Failed to retrieve Dataset data: {ex.Message}", ex); } } public async Task SaveDataset(DatasetDTO DatasetDTO, LoginDTO loginDTO) { try { string DatasetSql = DatasetQB.SAVE_DATASET; string childSql = DatasetQB.SAVE_DATASETDETAIL; var statements = new List<(string sql, object param)> { (DatasetSql, DatasetDTO) }; if (DatasetDTO.DatasetDetailArray != null && DatasetDTO.DatasetDetailArray.Count > 0) { foreach (var child in DatasetDTO.DatasetDetailArray) { child.DatasetId = DatasetDTO.DatasetId; statements.Add((childSql, child)); } } await _QueryExecutor.ExecuteInTransactionAsync(loginDTO, statements); return DatasetDTO.DatasetId; } catch (Exception ex) { throw new Exception($"{ErrorResponse.SaveErrorMessage}: {ex.Message}", ex); } } public async Task UpdateDataset(DatasetDTO DatasetDTO, LoginDTO loginDTO) { try { var statements = new List<(string sql, object param)>(); statements.Add(( DatasetQB.UPDATE_DATASET, DatasetDTO )); var parameters = new { datasetid = DatasetDTO.DatasetId }; var maxId = await _QueryExecutor.ExecuteScalarAsync( loginDTO, DatasetQB.GET_MAX_DATASETDETAILID, parameters ); maxId = maxId - 1; if (DatasetDTO.DatasetDetailArray != null) { foreach (var child in DatasetDTO.DatasetDetailArray) { if (child.DatasetDetailId == 0) { child.DatasetDetailId = maxId--; statements.Add(( DatasetQB.SAVE_DATASETDETAIL, child )); } else { statements.Add(( DatasetQB.UPDATE_DATASETDETAIL, child )); } } } await _QueryExecutor.ExecuteInTransactionAsync(loginDTO, statements); return DatasetDTO.DatasetId; } catch (Exception ex) { throw new Exception($"{ErrorResponse.UpdateErrorMessage}: {ex.Message}", ex); } } public async Task> DeleteDataset(int DatasetId, LoginDTO LoginDTO) { try { string childsql = DatasetQB.DELETE_DATASETDETAIL; string parentSql = DatasetQB.DELETE_DATASET; var parameter = new { datasetid = DatasetId }; var childresult = await _QueryExecutor.ExecuteAsync(LoginDTO, childsql, parameter); var parentresult = await _QueryExecutor.ExecuteAsync(LoginDTO, parentSql, parameter); if (parentresult > 0) { return Result.Success("Dataset Details Deleted Successfully."); } else { return Result.Failure("Dataset not found or could not be deleted."); } } catch (Exception ex) { throw new Exception("Error while deleting Dataset Details", ex); } } public async Task GetSelectListDataset(int FirstNumber, int MaxResult, CriteriaDTO CriteriaDTO, LoginDTO LoginDTO, bool IsCount = false) { try { string Json = ""; if (IsCount == false) { string SQL = DatasetQB.GET_SELECTLIST_DATASET; var parameter = new { firstnumber = FirstNumber, maxresult = MaxResult }; List DatasetPicklistDTO = (await _QueryExecutor.QueryAsync(LoginDTO, SQL, parameter)).ToList(); Json = JsonConvert.SerializeObject(DatasetPicklistDTO); } else { int Count = 0; Json = Count.ToString(); } return Json; } catch (Exception) { throw; } } } }