using DataAccessLibrary.DataAccess;
using DataAccessLibrary.Models;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Popups;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;

// The Blank Page item template is documented at https://go.microsoft.com/fwlink/?LinkId=234238

namespace GolfComp.Views
{
    /// <summary>
    /// An empty page that can be used on its own or navigated to within a Frame.
    /// </summary>
    public sealed partial class TeamListPage : Page, INotifyPropertyChanged
    {
        ObservableCollection<SpelerModel> speler = new ObservableCollection<SpelerModel>();
        ObservableCollection<GolfclubModel> golfclub = new ObservableCollection<GolfclubModel>();
        ObservableCollection<TeamModel> team = new ObservableCollection<TeamModel>();
        ObservableCollection<CoachModel> coach = new ObservableCollection<CoachModel>();
        ObservableCollection<KlasseModel> klasse = new ObservableCollection<KlasseModel>();
        bool enableCommandBar = true;
        public TeamListPage()
        {
            this.InitializeComponent();
            newRecordStackPanel.Visibility = Visibility.Collapsed;
        }
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);
            GetData();
            wireUpDropdowns();
            if (Datagrid.ItemsSource == null)
            {
                Datagrid.ItemsSource = team;
            }
        }
        public void GetData()
        {
            string sql1 = "SELECT * from Speler";
            var spelerlijst = SqliteDataAccess.LoadData<SpelerModel>(sql1, new Dictionary<string, object>());
            spelerlijst.ForEach(x => speler.Add(x));

            string sql2 = "select * from Golfclub";
            var golfclublijst = SqliteDataAccess.LoadData<GolfclubModel>(sql2, new Dictionary<string, object>());
            golfclublijst.ForEach(x => golfclub.Add(x));

            string sql3 = "SELECT Team.Id, KlasseId, Speler1Id, Speler2Id, Speler3Id, Speler4Id, Speler5Id, Speler6Id, Team.Naam, Klasse_Id, Klasse_Naam, Klasse_Omschrijving from Team " +
                "INNER JOIN Klasse ON Klasse.Klasse_Id = Team.KlasseId;";
            var teamlijst = SqliteDataAccess.LoadData<TeamModel>(sql3, new Dictionary<string, object>());
            teamlijst.ForEach(x => team.Add(x));

            string sql4 = "select * from Coach";
            var coachlijst = SqliteDataAccess.LoadData<CoachModel>(sql4, new Dictionary<string, object>());
            coachlijst.ForEach(x => coach.Add(x));

            string sql5 = "select * from Klasse";
            var klasselijst = SqliteDataAccess.LoadData<KlasseModel>(sql5, new Dictionary<string, object>());
            klasselijst.ForEach(x => klasse.Add(x));

        }

        private void wireUpDropdowns()
        {
            golfclubDropDown.ItemsSource = golfclub;
            golfclubDropDown.DisplayMemberPath = "Naam";
            golfclubDropDown.SelectedValuePath = "Id";

            klasseDropDown.ItemsSource = klasse;
            klasseDropDown.DisplayMemberPath = "Competitie";
            klasseDropDown.SelectedValuePath = "Klasse_Id";
        }   
        private void Delete_Click(object sender, RoutedEventArgs e)
        {
            string sql = "delete from Teams where Id = @Id";
            try
            {
                Dictionary<string, object> parameters = new Dictionary<string, object>
                {
                    { "@Id", SelectedItem.Id }
                };
                SqliteDataAccess.DeleteData(sql, parameters);
                team.Clear();
                GetData();
            }
            catch
            {
                MessageDialog messagedialog = new MessageDialog("Fout: Selecteer een record");
                _ = messagedialog.ShowAsync();

                return;
            }
        }
        private void UpdateRecord_Click(object sender, RoutedEventArgs e)
        {
            TeamModel teamklasse = (TeamModel)Datagrid.SelectedItem;
            

            string sql = "update Team set KlasseId = @KlasseId, Speler1Id = @Speler1Id, Speler2Id = @Speler2Id, " +
                "Speler3Id = @Speler3Id, Speler4Id = @Speler4Id, Speler5Id = @Speler5Id, Speler6Id = @Speler6Id, " +
                "Naam = @Naam, CoachId = @CoachId, ClubId = @ClubId, PuntenVoor = @PuntenVoor, PuntenTegen = @PuntenTegen " +
                "where Id = @Id";
            try
            {
                Dictionary<string, object> parameters = new Dictionary<string, object>
                {
                    { "@Id",SelectedItem.Id },
                    { "@KlasseId", teamklasse.Klasse_Id},
                    { "@Speler1Id", SelectedItem.Speler1Id},
                    { "@Speler2Id", SelectedItem.Speler2Id},
                    { "@Speler3Id", SelectedItem.Speler3Id},
                    { "@Speler4Id", SelectedItem.Speler4Id},
                    { "@Speler5Id", SelectedItem.Speler5Id},
                    { "@Speler6Id", SelectedItem.Speler6Id},
                    { "@Naam", SelectedItem.Naam},
                    { "@CoachId", SelectedItem.CoachId},
                    { "@ClubId", SelectedItem.ClubId},
                    { "@PuntenVoor", SelectedItem.PuntenVoor},
                    { "@PuntenTegen", SelectedItem.PuntenTegen}
                };
                SqliteDataAccess.SaveData(sql, parameters);
                team.Clear();
                GetData();

                MessageDialog messagedialog = new MessageDialog("Succes: wijzigingen weggeschreven");
                _ = messagedialog.ShowAsync();
            }
            catch (Exception ex)
            {
                MessageDialog messagedialog = new MessageDialog(ex.Message);
                _ = messagedialog.ShowAsync();

                return;
            }
        }
        private void Insert_new_entry(object sender, RoutedEventArgs e)
        {
            enableCommandBar = false;
            newRecordStackPanel.Visibility = Visibility.Visible;
        }
        private void DeleteNewRecord_Click(object sender, RoutedEventArgs e)
        {           
            enableCommandBar = true;
            newRecordStackPanel.Visibility = Visibility.Collapsed;
        }
        private (bool isValid, TeamModel model) ValidateForm()
        {
            bool isValid = true;
            TeamModel model = new TeamModel();

            try
            {
                model.KlasseId = (int)klasseDropDown.SelectedValue;
                model.Speler1Id = 0;
                model.Speler2Id = 0;
                model.Speler3Id = 0;
                model.Speler4Id = 0;
                model.Speler5Id = 0;
                model.Speler6Id = 0;
                model.Naam = TeamNaamTextBox.Text;
                model.CoachId = 0;
                model.ClubId = (int)golfclubDropDown.SelectedValue;
                model.PuntenVoor = 0;
                model.PuntenTegen = 0;

            }
            catch
            {
                isValid = false;
            }
            return (isValid, model);
        }
        private void SaveNewRecord_Click(object sender, RoutedEventArgs e)
        {
            TeamModel model = new TeamModel();

            string sql = "insert into Team (KlasseId, Speler1Id, Speler2Id, Speler3Id, Speler4Id, Speler5Id, Speler6Id, Naam, CoachId, ClubId, PuntenVoor, PuntenTegen ) " +
                "values (@KlasseId, @Speler1Id, @Speler2Id, @Speler3Id, @Speler4Id, @Speler5Id, @Speler6Id, @Naam, @CoachId, @ClubId, @PuntenVoor, @PuntenTegen)";

            var form = ValidateForm();
            if (form.isValid == false)
            {
                MessageDialog messagedialog = new MessageDialog("foutieve invoer. Probeer het opnieuw");

                _ = messagedialog.ShowAsync();

                return;
            }
            if (TeamNaamTextBox.Text == "")
            {
                MessageDialog messagedialog = new MessageDialog("Vul alle velden in");

                _ = messagedialog.ShowAsync();

                return;
            }
            Dictionary<string, object> parameters = new Dictionary<string, object>
            {
                {"@KlasseId", form.model.KlasseId },
                {"@Speler1Id", form.model.Speler1Id },
                {"@Speler2Id", form.model.Speler2Id },
                {"@Speler3Id", form.model.Speler3Id },
                {"@Speler4Id", form.model.Speler4Id },
                {"@Speler5Id", form.model.Speler5Id },
                {"@Speler6Id", form.model.Speler6Id },
                {"@Naam", form.model.Naam },
                {"@CoachId", form.model.CoachId },
                {"@ClubId", form.model.ClubId },
                {"@PuntenVoor", form.model.PuntenVoor },
                {"@PuntenTegen", form.model.PuntenTegen }

            };
            SqliteDataAccess.SaveData(sql, parameters);
            //speler.Add(form.model);
            

            enableCommandBar = true;
            newRecordStackPanel.Visibility = Visibility.Collapsed;

            team.Clear();

            GetData();          

            wireUpDropdowns();
        }
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged([CallerMemberName] string propertyName = null) =>
             PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

        private TeamModel _selectedItem;

        public TeamModel SelectedItem
        {
            get => _selectedItem;
            set
            {
                if (_selectedItem != value)
                {
                    _selectedItem = value;
                    OnPropertyChanged();
                }
            }
        }
    }
}
