using DocuMed.Domain.Entities.City; using DocuMed.Domain.Entities.Hospitals; using Mapster; namespace DocuMed.PWA.Pages; public class ProfilePageViewModel( IUserUtility userUtility, IRestWrapper restWrapper, ISnackbar snackbar, NavigationManager navigationManager) : BaseViewModel { public IUserUtility UserUtility { get; } = userUtility; public IRestWrapper RestWrapper { get; } = restWrapper; public ISnackbar Snackbar { get; } = snackbar; public ApplicationUserSDto User { get; set; } = new(); public List Cities { get; private set; } = new List(); public List Universities { get; private set; } = new List(); public List Hospitals { get; private set; } = new List(); public List Sections { get; private set; } = new List(); public SectionSDto? SelectedSection { get; set; } public CitySDto? SelectedCity { get; set; } public UniversitySDto? SelectedUni { get; set; } public HospitalSDto? SelectedHospital { get; set; } public readonly string Version = Assembly.GetAssembly(typeof(Program))?.GetName()?.Version?.ToString() ?? string.Empty; public override async Task InitializeAsync() { User = await UserUtility.GetUserAsync(); var token = await UserUtility.GetBearerTokenAsync(); Cities = await RestWrapper.CrudDtoApiRest(Address.CityController).ReadAll(0, token); Universities = await RestWrapper.CrudDtoApiRest(Address.UniversityController).ReadAll(0, token); if (User.UniversityId != Guid.Empty) { SelectedUni = Universities.FirstOrDefault(u => u.Id == User.UniversityId); SelectedCity = Cities.FirstOrDefault(c => c.Id == SelectedUni?.CityId); if (SelectedHospital != null) { if (User.SectionId != Guid.Empty) { Sections = await RestWrapper.HospitalRestApi.GetSectionsAsync(SelectedHospital.Id, token); SelectedSection = Sections.FirstOrDefault(s => s.Id == User.SectionId); } } } await base.InitializeAsync(); } public async Task SubmitEditAsync() { try { IsProcessing = true; var token = await UserUtility.GetBearerTokenAsync(); var request = User.Adapt(); request.ProfileType = ProfileType.Student; if (SelectedUni != null) { request.UniversityId = SelectedUni.Id; User.UniversityId = SelectedUni.Id; } if (SelectedSection != null) { request.SectionId = SelectedSection.Id; User.SectionId = SelectedSection.Id; User.SectionName = SelectedSection.Name; } if (SelectedHospital != null) { request.HospitalId = SelectedHospital.Id; User.HospitalId = SelectedHospital.Id; User.HospitalName = SelectedHospital.Name; } await RestWrapper.UserRestApi.UpdateUserAsync(request, token); await UserUtility.SetUserAsync(User); Snackbar.Add("ویرایش حساب کاربری با موفقیت انجام شد", Severity.Success); } 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 LogoutAsync() { await UserUtility.LogoutAsync(); navigationManager.NavigateTo(""); } public async Task> SearchCity(string city) { try { if (Cities.Count == 0) { var token = await UserUtility.GetBearerTokenAsync(); Cities = await RestWrapper.CrudDtoApiRest(Address.CityController).ReadAll(0, token); } if (city.IsNullOrEmpty()) return Cities; return Cities.Where(c => c.Name.Contains(city)); } catch (ApiException ex) { var exe = await ex.GetContentAsAsync(); Snackbar.Add(exe != null ? exe.Message : ex.Content, Severity.Error); return Cities; } catch (Exception e) { Snackbar.Add(e.Message, Severity.Error); return Cities; } } public async Task> SearchSection(string section) { try { if (SelectedHospital != null) { var token = await UserUtility.GetBearerTokenAsync(); Sections = await RestWrapper.HospitalRestApi.GetSectionsAsync(SelectedHospital.Id, token); } if (section.IsNullOrEmpty()) return Sections; return Sections.Where(c => c.Name.Contains(section)); } catch (ApiException ex) { var exe = await ex.GetContentAsAsync(); Snackbar.Add(exe != null ? exe.Message : ex.Content, Severity.Error); return Sections; } catch (Exception e) { Snackbar.Add(e.Message, Severity.Error); return Sections; } } public async Task> SearchUniversity(string uni) { try { if (Universities.Count == 0) { var token = await UserUtility.GetBearerTokenAsync(); Universities = await RestWrapper.CrudDtoApiRest(Address.UniversityController).ReadAll(0, token); } if (uni.IsNullOrEmpty()) return Universities; return Universities.Where(c => c.Name.Contains(uni)); } catch (ApiException ex) { var exe = await ex.GetContentAsAsync(); Snackbar.Add(exe != null ? exe.Message : ex.Content, Severity.Error); return Universities; } catch (Exception e) { Snackbar.Add(e.Message, Severity.Error); return Universities; } } public async Task> SearchHospital(string hospital) { try { if (SelectedUni != null) { var token = await UserUtility.GetBearerTokenAsync(); Hospitals = await RestWrapper.UniversityRestApi.GetHospitalsAsync(SelectedUni.Id, token); } if (hospital.IsNullOrEmpty()) return Hospitals; return Hospitals.Where(c => c.Name.Contains(hospital)); } catch (ApiException ex) { var exe = await ex.GetContentAsAsync(); Snackbar.Add(exe != null ? exe.Message : ex.Content, Severity.Error); return Hospitals; } catch (Exception e) { Snackbar.Add(e.Message, Severity.Error); return Hospitals; } } }