﻿using [NamespaceCliente].Command;
using [NamespaceCliente].Model;
using [NamespaceCliente].ServidorReference;
using SearchWindow;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Input;

namespace [NamespaceCliente].ViewModel
{
    public class [NomeTabela]ViewModel : ViewModelBase
    {

        #region Variáveis
        public ObservableCollection<[TipoDTO]> Lista[NomeTabela] { get; set; }
        private [TipoDTO] _[NomeTabela]Selected;
        #endregion

        #region Construtor
        public [NomeTabela]ViewModel()
        {
            try
            {
                Lista[NomeTabela] = new ObservableCollection<[TipoDTO]>();
                IndiceNavegacao = 0;
                QuantidadeCarregada = 0;
                Filtro = "";
                ControlarNavegacao();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Infra
        public [TipoDTO] [NomeTabela]Selected
        {
            get { return _[NomeTabela]Selected; }
            set
            {
                _[NomeTabela]Selected = value;
                notifyPropertyChanged("[NomeTabela]Selected");
            }
        }
        #endregion

        #region CRUD
        public void SalvarAtualizar[NomeTabela]()
        {
            try
            {
                using ([AssemblyCliente] Servico = new [AssemblyCliente]())
                {
                    Servico.SalvarAtualizar[NomeTabela]([NomeTabela]Selected);
                    [NomeTabela]Selected = null;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void AtualizarLista[NomeTabela](int pagina)
        {
            try
            {
                using ([AssemblyCliente] Servico = new [AssemblyCliente]())
                {
                    if (pagina == 0)
                        IndiceNavegacao = 0;
                    else if (pagina > 0 && Lista[NomeTabela].Count == QuantidadePagina)
                        IndiceNavegacao += QuantidadePagina;
                    else if (pagina < 0 && IndiceNavegacao != 0)
                        IndiceNavegacao -= QuantidadePagina;

                    [NomeTabela]DTO [NomeTabela] = new [NomeTabela]DTO();
                    if (!Filtro.Trim().Equals(""))
                    {
                        [NomeTabela].Nome = Filtro;
                    }

                    IList<[TipoDTO]> ListaServ = Servico.Select[NomeTabela]Pagina(IndiceNavegacao, true, QuantidadePagina, true, [NomeTabela]);

                    Lista[NomeTabela].Clear();

                    foreach ([TipoDTO] objAdd in ListaServ)
                    {
                        Lista[NomeTabela].Add(objAdd);
                    }
                    [NomeTabela]Selected = null;
                }
                QuantidadeCarregada = Lista[NomeTabela].Count;
                ControlarNavegacao();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void Excluir[NomeTabela]()
        {
            try
            {
                using ([AssemblyCliente] Servico = new [AssemblyCliente]())
                {
                    Servico.Delete[NomeTabela]([NomeTabela]Selected);
                    [NomeTabela]Selected = null;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Controle de Ativação dos Botões
        public override void BotaoInserir()
        {
            try
            {
                [NomeTabela]Selected = new [NomeTabela]DTO();
                IsEditar = true;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Alerta do sistema", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
        
        public override void BotaoAlterar()
        {
            try
            {
                if ([NomeTabela]Selected != null)
                    IsEditar = true;
                else
                    MessageBox.Show("Selecione um elemento na lista.", "Alerta do sistema", MessageBoxButton.OK, MessageBoxImage.Information);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Alerta do sistema", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        public override void BotaoExcluir()
        {
            try
            {
                if ([NomeTabela]Selected != null)
                {
                    if (MessageBox.Show("Tem Certeza Que Deseja Excluir o Registro?", "Pergunta do Sistema", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
                    {
                        Excluir[NomeTabela]();
                        MessageBox.Show("Exclusão efetuada com sucesso!", "Informação do sistema", MessageBoxButton.OK, MessageBoxImage.Information);
                        AtualizarLista[NomeTabela](IndiceNavegacao);
                    }
                }
                else
                    MessageBox.Show("Selecione um elemento na lista.", "Alerta do sistema", MessageBoxButton.OK, MessageBoxImage.Information);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Alerta do sistema", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        public override void BotaoCancelar()
        {
            try
            {
                BotaoLocalizar();
                IsEditar = false;
                [NomeTabela]Selected = null;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Alerta do sistema", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        public override void BotaoSalvar()
        {
            try
            {
                SalvarAtualizar[NomeTabela]();
                MessageBox.Show("Salvo com sucesso!", "Informação do sistema", MessageBoxButton.OK, MessageBoxImage.Information);
                AtualizarLista[NomeTabela](IndiceNavegacao);
                IsEditar = false;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Alerta do sistema", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        public override void BotaoLocalizar()
        {
            try
            {
                AtualizarLista[NomeTabela](0);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Alerta do sistema", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        public override void BotaoExportar()
        {
            DataGridExportacao.ItemsSource = Lista[NomeTabela];
        }

        public override void BotaoPaginaSeguinte()
        {
            AtualizarLista[NomeTabela](1);
        }

        public override void BotaoPaginaAnterior()
        {
            AtualizarLista[NomeTabela](-1);
        }
        #endregion

        #region Pesquisas
        public void PesquisarXXX()
        {
            try
            {
                SearchWindowApp searchWindow = new SearchWindowApp(typeof(XXXDTO),
                    typeof(Servico[NamespaceCliente]));

                if (searchWindow.ShowDialog() == true)
                {
                   [NomeTabela]Selected.XXX = (PessoaDTO)searchWindow.itemSelecionado;
                    notifyPropertyChanged("[NomeTabela]Selected");
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion       

    }
}
