using DocuMed.PWA.Shared.Dialogs; using Mapster; using Microsoft.JSInterop; namespace DocuMed.PWA.Pages; public class MedicalHistoryActionPageViewModel : BaseViewModel { private readonly IRestWrapper _restWrapper; private readonly NavigationManager _navigationManager; private readonly ISnackbar _snackbar; private readonly IUserUtility _userUtility; private readonly Guid _medicalHistoryId; private readonly IDialogService? _dialogService; private readonly IJSRuntime? _jsRuntime; public bool DisableBackButton { get; set; } = true; public MedicalHistoryActionPageViewModel(IRestWrapper restWrapper, NavigationManager navigationManager, ISnackbar snackbar, IUserUtility userUtility) { _restWrapper = restWrapper; _navigationManager = navigationManager; _snackbar = snackbar; _userUtility = userUtility; } public MedicalHistoryActionPageViewModel(IRestWrapper restWrapper, NavigationManager navigationManager, ISnackbar snackbar, IUserUtility userUtility, IDialogService dialogService, IJSRuntime jsRuntime, Guid medicalHistoryId) { _dialogService = dialogService; _jsRuntime = jsRuntime; _restWrapper = restWrapper; _navigationManager = navigationManager; _snackbar = snackbar; _userUtility = userUtility; _medicalHistoryId = medicalHistoryId; IsEditing = true; } private MedicalHistoryTemplateSDto _selectedTemplate = new(); public MedicalHistoryTemplateSDto SelectedTemplate { get => _selectedTemplate; set { _selectedTemplate = value; PageDto.ChiefComplaint = _selectedTemplate.ChiefComplaint; } } public MedicalHistoryTemplateLDto SelectedTemplateLDto { get; set; } = new(); public bool IsEditing { get; set; } = false; public SectionSDto? SelectedSelection { get; set; } public List PiAnswers { get; set; } = new(); public List PdhAnswers { get; set; } = new(); public List PshAnswers { get; set; } = new(); public List FhAnswers { get; set; } = new(); public List DhAnswers { get; set; } = new(); public List HhAnswers { get; set; } = new(); public List GaAnswers { get; set; } = new(); public List RosAnswers { get; set; } = new(); public MudCarousel? Carousel { get; set; } public int CurrentStep { get; set; } = 0; public string StepCounter { get; set; } = "1 / 5"; public bool MedicalHistorySubmitted { get; set; } = false; public override async Task InitializeAsync() { if (_medicalHistoryId != Guid.Empty && IsEditing) { try { IsProcessing = true; var token = await _userUtility.GetBearerTokenAsync(); var dto = await _restWrapper.CrudDtoApiRest(Address.MedicalHistoryController) .ReadOne(_medicalHistoryId, token); PageDto = dto; SelectedSelection = dto.Section; PiAnswers.AddRange(dto.Answers.Where(q => q.Part == MedicalHistoryPart.PresentIllness)); PdhAnswers.AddRange(dto.Answers.Where(q => q.Part == MedicalHistoryPart.PastDiseasesHistory)); PshAnswers.AddRange(dto.Answers.Where(q => q.Part == MedicalHistoryPart.PastSurgeryHistory)); FhAnswers.AddRange(dto.Answers.Where(q => q.Part == MedicalHistoryPart.FamilyHistory)); DhAnswers.AddRange(dto.Answers.Where(q => q.Part == MedicalHistoryPart.DrugHistory)); HhAnswers.AddRange(dto.Answers.Where(q => q.Part == MedicalHistoryPart.AddictionHistory)); GaAnswers.AddRange(dto.Answers.Where(q => q.Part == MedicalHistoryPart.GeneralAppearance)); RosAnswers.AddRange(dto.Answers.Where(q => q.Part == MedicalHistoryPart.ReviewOfSystem)); if (dto.MedicalHistoryTemplateId != Guid.Empty) { SelectedTemplate = new MedicalHistoryTemplateSDto { Id = dto.MedicalHistoryTemplateId }; await SelectTemplateAsync(); } } catch (ApiException ex) { var exe = await ex.GetContentAsAsync(); _snackbar.Add(exe != null ? exe.Message : ex.Content, Severity.Error); } catch (Exception e) { _snackbar.Add(e.Message, Severity.Error); } finally { IsProcessing = false; } } else { var user = await _userUtility.GetUserAsync(); if (user.SectionId != Guid.Empty) { var token = await _userUtility.GetBearerTokenAsync(); var section = await _restWrapper.CrudDtoApiRest(Address.SectionController) .ReadOne(user.SectionId, token); SelectedSelection = section; } } await base.InitializeAsync(); } public async Task CompleteStepClicked() { CurrentStep++; StepCounter = $"{CurrentStep + 1} / 5"; if (CurrentStep == 1) { try { if (PageDto.FirstName.IsNullOrEmpty()) throw new Exception("نام بیمار را وارد کنید"); if (PageDto.LastName.IsNullOrEmpty()) throw new Exception("نام خانوادگی بیمار را وارد کنید"); if (SelectedSelection == null) throw new Exception("بخش بیمار را وارد کنید"); if (PageDto.ChiefComplaint.IsNullOrEmpty()) throw new Exception("شکایت اصلی بیمار را وارد کنید"); await SelectTemplateAsync(); } catch (Exception e) { _snackbar.Add(e.Message, Severity.Error); CurrentStep--; } } if (CurrentStep == 5) { if (IsEditing) await EditMedicalHistoryAsync(); else await SubmitMedicalHistoryAsync(); MedicalHistorySubmitted = true; } Carousel?.MoveTo(CurrentStep); DisableBackButton = false; } private async Task SelectTemplateAsync() { try { if (SelectedTemplate.Id == Guid.Empty) return; IsProcessing = true; var token = await _userUtility.GetBearerTokenAsync(); var dto = await _restWrapper.CrudDtoApiRest(Address.MedicalHistoryTemplateController) .ReadOne(SelectedTemplate.Id, token); SelectedTemplateLDto = dto; SelectedTemplate = dto.Adapt(); PageDto.ChiefComplaint = dto.ChiefComplaint; } catch (ApiException ex) { var exe = await ex.GetContentAsAsync(); _snackbar.Add(exe != null ? exe.Message : ex.Content, Severity.Error); } catch (Exception e) { _snackbar.Add(e.Message, Severity.Error); } finally { IsProcessing = false; } } public async Task SubmitMedicalHistoryAsync() { try { IsProcessing = true; if (SelectedSelection == null) throw new Exception("لطفا بخش مورد نظر را انتخاب نمایید"); PageDto.SectionId = SelectedSelection.Id; PageDto.MedicalHistoryTemplateId = SelectedTemplate.Id; var token = await _userUtility.GetBearerTokenAsync(); PageDto.Answers.AddRange(PiAnswers); PageDto.Answers.AddRange(PdhAnswers); PageDto.Answers.AddRange(PshAnswers); PageDto.Answers.AddRange(FhAnswers); PageDto.Answers.AddRange(DhAnswers); PageDto.Answers.AddRange(HhAnswers); PageDto.Answers.AddRange(GaAnswers); PageDto.Answers.AddRange(RosAnswers); await _restWrapper.CrudDtoApiRest(Address.MedicalHistoryController) .Create(PageDto, token); } catch (ApiException ex) { var exe = await ex.GetContentAsAsync(); _snackbar.Add(exe != null ? exe.Message : ex.Content, Severity.Error); } catch (Exception e) { _snackbar.Add(e.Message, Severity.Error); } finally { IsProcessing = false; } } public async Task EditMedicalHistoryAsync() { try { IsProcessing = true; if (SelectedSelection == null) throw new Exception("لطفا بخش مورد نظر را انتخاب نمایید"); PageDto.SectionId = SelectedSelection.Id; var token = await _userUtility.GetBearerTokenAsync(); PageDto.SectionId = SelectedSelection.Id; PageDto.Answers.AddRange(PiAnswers); PageDto.Answers.AddRange(PdhAnswers); PageDto.Answers.AddRange(PshAnswers); PageDto.Answers.AddRange(FhAnswers); PageDto.Answers.AddRange(DhAnswers); PageDto.Answers.AddRange(HhAnswers); PageDto.Answers.AddRange(GaAnswers); PageDto.Answers.AddRange(RosAnswers); await _restWrapper.CrudDtoApiRest(Address.MedicalHistoryController) .Update(PageDto, token); } catch (ApiException ex) { var exe = await ex.GetContentAsAsync(); _snackbar.Add(exe != null ? exe.Message : ex.Content, Severity.Error); } catch (Exception e) { _snackbar.Add(e.Message, Severity.Error); } finally { IsProcessing = false; } } public async Task DeleteMedicalHistoryAsync() { if(_dialogService==null) return; var options = new DialogOptions { CloseOnEscapeKey = true }; var parameters = new DialogParameters(); parameters.Add(x => x.ContentText, "آیا از حذف شرح حال اطمینان دارید ?"); var dialogReference = await _dialogService.ShowAsync("حذف شرح حال", parameters, options); var result = await dialogReference.Result; if (!result.Canceled) { try { IsProcessing = true; var token = await _userUtility.GetBearerTokenAsync(); await _restWrapper.CrudDtoApiRest(Address.MedicalHistoryController) .Delete(PageDto.Id, token); _snackbar.Add("حذف شرح حال با موفقیت انجام شد", Severity.Success); if (_jsRuntime != null) await _jsRuntime.InvokeVoidAsync("history.back"); } catch (ApiException ex) { var exe = await ex.GetContentAsAsync(); _snackbar.Add(exe != null ? exe.Message : ex.Content, Severity.Error); } catch (Exception e) { _snackbar.Add(e.Message, Severity.Error); } finally { IsProcessing = false; } } } public void RollBackStepClicked() { if(CurrentStep==0) return; Carousel?.MoveTo(--CurrentStep); StepCounter = $"{CurrentStep + 1} / 5"; if (CurrentStep == 0) DisableBackButton = true; } public void CompleteCreateMedicalHistory() { _navigationManager.NavigateTo("HomePage"); } }