using Gestor.Application.Servicos.Ferramentas; using Gestor.Application.Servicos.Generic; using Gestor.Application.ViewModels.Generic; using Gestor.Common.Validation; using Gestor.Model.Common; using Gestor.Model.Domain.Ferramentas; using Gestor.Model.Domain.Generic; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics; using System.Linq; using System.Runtime.CompilerServices; using System.Threading.Tasks; namespace Gestor.Application.ViewModels.Drawer { public class AgendaViewModel : BaseSegurosViewModel { private readonly AgendaServico _servico; private Agenda _selectedAgenda; private ObservableCollection _telefones = new ObservableCollection(); private ObservableCollection _emails = new ObservableCollection(); private long _ultimoId; public Agenda CancelAgenda; private ObservableCollection _agendasFiltradas = new ObservableCollection(); private bool _carregando; public List Agendas { get; set; } public ObservableCollection AgendasFiltradas { get { return this._agendasFiltradas; } set { this._agendasFiltradas = value; base.OnPropertyChanged("AgendasFiltradas"); } } public bool Carregando { get { return this._carregando; } set { this._carregando = value; base.IsEnabled = !value; base.EnableMenu = !value; base.OnPropertyChanged("Carregando"); } } public ObservableCollection Emails { get { return this._emails; } set { this._emails = value; base.OnPropertyChanged("Emails"); } } public Agenda SelectedAgenda { get { return this._selectedAgenda; } set { long? nullable; this._selectedAgenda = value; if (value != null) { nullable = new long?(value.get_Id()); } else { nullable = null; } base.VerificarEnables(nullable); base.OnPropertyChanged("SelectedAgenda"); } } public ObservableCollection Telefones { get { return this._telefones; } set { this._telefones = value; base.OnPropertyChanged("Telefones"); } } public AgendaViewModel() { this._servico = new AgendaServico(); this.Seleciona(); } public void CancelarAlteracao() { this.Carregando = true; if (this.SelectedAgenda.get_Id() != 0) { DomainBase.Copy(this.Agendas.First((Agenda x) => x.get_Id() == this.CancelAgenda.get_Id()), this.CancelAgenda); if (this.AgendasFiltradas.Count <= 0 || !this.AgendasFiltradas.Any((Agenda x) => x.get_Id() == this.CancelAgenda.get_Id())) { this.AgendasFiltradas.Add(this.CancelAgenda); } else { DomainBase.Copy(this.AgendasFiltradas.First((Agenda x) => x.get_Id() == this.CancelAgenda.get_Id()), this.CancelAgenda); } this.AgendasFiltradas = new ObservableCollection(this.AgendasFiltradas); this.SelectedAgenda = this.AgendasFiltradas.First((Agenda x) => x.get_Id() == this.CancelAgenda.get_Id()); } else if (this.AgendasFiltradas.Count <= 0 || !this.AgendasFiltradas.Any((Agenda x) => x.get_Id() == this._ultimoId)) { if (this.Agendas.Count <= 0 || !this.Agendas.Any((Agenda x) => x.get_Id() == this._ultimoId)) { this.SelectedAgenda = new Agenda(); ObservableCollection observableCollection = new ObservableCollection(); AgendaTelefone agendaTelefone = new AgendaTelefone(); agendaTelefone.set_Agenda(this.SelectedAgenda); agendaTelefone.set_Tipo(new TipoTelefone?(1)); observableCollection.Add(agendaTelefone); this.Telefones = observableCollection; ObservableCollection observableCollection1 = new ObservableCollection(); AgendaEmail agendaEmail = new AgendaEmail(); agendaEmail.set_Agenda(this.SelectedAgenda); observableCollection1.Add(agendaEmail); this.Emails = observableCollection1; base.Alterar(false); this.Carregando = false; return; } this.AgendasFiltradas.Add(this.Agendas.First((Agenda x) => x.get_Id() == this._ultimoId)); this.SelectedAgenda = this.AgendasFiltradas.First((Agenda x) => x.get_Id() == this._ultimoId); } else { this.SelectedAgenda = this.AgendasFiltradas.First((Agenda x) => x.get_Id() == this._ultimoId); } base.Alterar(false); this.Carregando = false; } public async Task Excluir() { bool flag; if (this.SelectedAgenda == null || this.SelectedAgenda.get_Id() == 0) { flag = false; } else if (await base.ShowMessage("DESEJA EXCLUIR?", "SIM", "NÃO", false)) { this.Carregando = true; if (await this._servico.Delete(this.SelectedAgenda)) { int num = this.AgendasFiltradas.IndexOf(this.SelectedAgenda); this.Agendas.Remove(this.SelectedAgenda); this.AgendasFiltradas.Remove(this.SelectedAgenda); this.AgendasFiltradas = new ObservableCollection(this.AgendasFiltradas); if (this.AgendasFiltradas.Count <= 0) { this.SelectedAgenda = new Agenda(); this.Telefones = new ObservableCollection(); this.Emails = new ObservableCollection(); base.Alterar(false); } else if (num >= this.AgendasFiltradas.Count) { await this.SelecionaAgenda(this.AgendasFiltradas.Last()); } else { await this.SelecionaAgenda(this.AgendasFiltradas.ElementAt(num)); } this.Carregando = false; flag = true; } else { base.Alterar(false); this.Carregando = false; flag = false; } } else { flag = false; } return flag; } public void ExcluirEmail(AgendaEmail email) { this.Emails.Remove(email); } public void ExcluirTelefone(AgendaTelefone telefone) { this.Telefones.Remove(telefone); } internal async Task> Filtrar(string value) { List agendas = await Task.Run>(() => this.FiltrarAgenda(value)); return agendas; } public List FiltrarAgenda(string filter) { this.AgendasFiltradas = (string.IsNullOrWhiteSpace(filter) ? new ObservableCollection(this.Agendas) : new ObservableCollection( from x in this.Agendas where ValidationHelper.RemoveDiacritics(x.get_Nome().Trim()).ToUpper().Contains(ValidationHelper.RemoveDiacritics(filter)) orderby x.get_Nome() select x)); return this.AgendasFiltradas.ToList(); } public void Incluir() { if (this.SelectedAgenda != null) { this._ultimoId = this.SelectedAgenda.get_Id(); } this.SelectedAgenda = new Agenda(); ObservableCollection observableCollection = new ObservableCollection(); AgendaTelefone agendaTelefone = new AgendaTelefone(); agendaTelefone.set_Agenda(this.SelectedAgenda); agendaTelefone.set_Tipo(new TipoTelefone?(1)); observableCollection.Add(agendaTelefone); this.Telefones = observableCollection; ObservableCollection observableCollection1 = new ObservableCollection(); AgendaEmail agendaEmail = new AgendaEmail(); agendaEmail.set_Agenda(this.SelectedAgenda); observableCollection1.Add(agendaEmail); this.Emails = observableCollection1; base.Alterar(true); } public void IncluirEmail() { if (this.SelectedAgenda == null) { return; } if (this.Emails == null) { this.Emails = new ObservableCollection(); } AgendaEmail agendaEmail = new AgendaEmail(); agendaEmail.set_Agenda(this.SelectedAgenda); this.Emails.Add(agendaEmail); base.OnPropertyChanged("IncluirEmail"); } public void IncluirTelefone() { if (this.SelectedAgenda == null) { return; } if (this.Telefones == null) { this.Telefones = new ObservableCollection(); } AgendaTelefone agendaTelefone = new AgendaTelefone(); agendaTelefone.set_Agenda(this.SelectedAgenda); agendaTelefone.set_Tipo(new TipoTelefone?(1)); this.Telefones.Add(agendaTelefone); base.OnPropertyChanged("IncluirTelefone"); } public async Task>> Salvar() { List> keyValuePairs; int num; List> keyValuePairs1 = this.SelectedAgenda.Validate(); ObservableCollection telefones = this.Telefones; List list = ( from x in telefones where !string.IsNullOrEmpty(x.get_Numero()) select x).ToList(); ObservableCollection emails = this.Emails; List agendaEmails = ( from x in emails where !string.IsNullOrEmpty(x.get_Email()) select x).ToList(); foreach (AgendaTelefone agendaTelefone in list) { keyValuePairs1.AddRange(agendaTelefone.Validate()); } foreach (AgendaEmail agendaEmail in agendaEmails) { keyValuePairs1.AddRange(agendaEmail.Validate()); } if (keyValuePairs1.Count <= 0) { this.SelectedAgenda.set_Telefones(new ObservableCollection(list)); this.SelectedAgenda.set_Emails(new ObservableCollection(agendaEmails)); if (this.SelectedAgenda.get_Id() != 0) { this.SelectedAgenda = await this._servico.Save(this.SelectedAgenda); if (this._servico.Sucesso) { this.Telefones = new ObservableCollection(this.SelectedAgenda.get_Telefones()); this.Emails = new ObservableCollection(this.SelectedAgenda.get_Emails()); DomainBase.Copy(this.Agendas.First((Agenda x) => x.get_Id() == this.SelectedAgenda.get_Id()), this.SelectedAgenda); if (this.AgendasFiltradas.Count <= 0 || !this.AgendasFiltradas.Any((Agenda x) => x.get_Id() == this.SelectedAgenda.get_Id())) { this.AgendasFiltradas.Add(this.SelectedAgenda); } else { DomainBase.Copy(this.AgendasFiltradas.First((Agenda x) => x.get_Id() == this.SelectedAgenda.get_Id()), this.SelectedAgenda); } } else { keyValuePairs = null; return keyValuePairs; } } else { this.SelectedAgenda = await this._servico.Save(this.SelectedAgenda); if (this._servico.Sucesso) { this.Telefones = new ObservableCollection(this.SelectedAgenda.get_Telefones()); this.Emails = new ObservableCollection(this.SelectedAgenda.get_Emails()); this.Agendas.Add(this.SelectedAgenda); ObservableCollection agendasFiltradas = this.AgendasFiltradas; num = (this._ultimoId == 0 ? 0 : this.AgendasFiltradas.IndexOf(this.AgendasFiltradas.First((Agenda x) => x.get_Id() == this._ultimoId))); agendasFiltradas.Insert(num, this.SelectedAgenda); } else { keyValuePairs = null; return keyValuePairs; } } this.AgendasFiltradas = new ObservableCollection(this.AgendasFiltradas); this.SelectedAgenda = this.AgendasFiltradas.First((Agenda x) => x.get_Id() == this.SelectedAgenda.get_Id()); base.Alterar(false); keyValuePairs = null; } else { keyValuePairs = keyValuePairs1; } return keyValuePairs; } private async void Seleciona() { base.Loading(true); await base.PermissaoTela(34); await this.SelecionaAgendas(); base.Loading(false); } public async Task SelecionaAgenda(Agenda agenda = null) { Agenda agenda1; this.Carregando = true; AgendaViewModel agendaViewModel = this; agenda1 = (agenda == null ? this.AgendasFiltradas.FirstOrDefault() : this.AgendasFiltradas.FirstOrDefault((Agenda x) => x.get_Id() == agenda.get_Id())); agendaViewModel.SelectedAgenda = agenda1; if (this.SelectedAgenda == null) { this.Emails = null; this.Telefones = null; } else { this.Emails = await this._servico.BuscarEmailsAsync(this.SelectedAgenda.get_Id()); this.Telefones = await this._servico.BuscarTelefonesAsync(this.SelectedAgenda.get_Id()); } this.Carregando = false; } private async Task SelecionaAgendas() { Agenda agenda; this.Carregando = true; List agendas = await (new BaseServico()).BuscarAgendasAsync(); AgendaViewModel list = this; List agendas1 = agendas; list.Agendas = ( from x in agendas1 orderby x.get_Nome() select x).ToList(); this.AgendasFiltradas = new ObservableCollection(this.Agendas); AgendaViewModel agendaViewModel = this; agenda = (this.AgendasFiltradas.Count > 0 ? this.AgendasFiltradas.First() : new Agenda()); agendaViewModel.SelectedAgenda = agenda; this.Carregando = false; } } }