using System;
using System.Collections.Generic;
using System.ComponentModel;
using Xamarin.Forms;
using TheGameExtreme.model.@event;
using TheGameExtreme.viewmodel;

namespace TheGameExtreme.view
{
    // Learn more about making custom code visible in the Xamarin.Forms previewer
    // by visiting https://aka.ms/xamarinforms-previewer
    [DesignTimeVisible(false)]
    public partial class MainPage : ContentPage
    {
        private bool isFirst = true;
        private Main viewmodel;
        private List<CheckBox> stacks = new List<CheckBox>();
        Button button = new Button();
        

        public MainPage()
        {
            InitializeComponent();

            stacks.Add(checkbox0);
            stacks.Add(checkbox1);
            stacks.Add(checkbox2);
            stacks.Add(checkbox3);
            button.Text = "Retry";
            button.Clicked += retry;

            viewmodel = new Main();

            viewmodel.BindingChanged += OnBindingChanged;

            //viewmodel.PlayerChanged += OnPlayerChanged;

            Alert.SetBinding(Label.TextProperty, new Binding("Alert", source: viewmodel));
            pseudo.SetBinding(Label.TextProperty, new Binding("Pseudo", source: viewmodel));

            inflateHand();
        }

        //private void OnPlayerChanged(object sender, PlayerChangedEventArgs args)
        //{
        //    inflateHand();
        //}

        private void inflateHand()
        {
            Hand.Children.Clear();
            for (int i = 0; i < viewmodel.CurrentHand.Count; i++)
            {
                Button card = new Button();
                card.Text = viewmodel.CurrentHand[i].Value.ToString();
                card.Clicked += played;
                Hand.Children.Add(card);
            }
        }

        private void OnBindingChanged(object sender, TopRangeChangedEventArgs args)
        {
            switch (args.NumStackChanged)
            {
                case 0:
                    pile0.Text = args.NewTopRangeCard.Value.ToString();
                    break;
                case 1:
                    pile1.Text = args.NewTopRangeCard.Value.ToString();
                    break;
                case 2:
                    pile2.Text = args.NewTopRangeCard.Value.ToString();
                    break;
                case 3:
                    pile3.Text = args.NewTopRangeCard.Value.ToString();
                    break;
            }

            for (int i = 0; i < Hand.Children.Count; i++)
            {
                Button b = Hand.Children[i] as Button;
                if (String.Equals(b.Text,args.NewTopRangeCard.Value.ToString()))
                {
                    Hand.Children.RemoveAt(i);
                    break;
                }
            }
        }

        private void played(object sender, EventArgs args)
        {
            viewmodel.Alert = "";

            int numStack = 0;
            bool hasFind = false;
            stacks.ForEach(checkbox =>
            {
                if (checkbox.IsChecked)
                {
                    hasFind = true;
                    if (viewmodel.played(numStack, Convert.ToInt32((sender as Button).Text)))
                    {
                        botPanel.Children.Add(button);
                    }
                }
                numStack += 1;
            });

            if (!hasFind)
            {
                viewmodel.Alert = "Aucune pile selectionné! Veuillez séléctionner une pile.";
                return;
            }
        }

        private void radioButton(object sender, EventArgs args)
        {
            if (isFirst)
            {
                isFirst = false;

                stacks.ForEach(checkbox =>
                {
                    if (!checkbox.Equals(sender))
                    {
                        checkbox.IsChecked = false;
                    }
                });

                isFirst = true;
            }
        }

        private void retry(object sender, EventArgs args)
        {
            viewmodel = new Main();

            viewmodel.BindingChanged += OnBindingChanged;

            Alert.SetBinding(Label.TextProperty, new Binding("Alert", source: viewmodel));
            pseudo.SetBinding(Label.TextProperty, new Binding("Pseudo", source: viewmodel));

            inflateHand();

            pile0.Text = "1";
            pile1.Text = "1";
            pile2.Text = "100";
            pile3.Text = "100";

            botPanel.Children.Remove(button);
        }

        private void endTurn(object sender, EventArgs args)
        {
            viewmodel.Alert = "";
            if (viewmodel.endTurn())
            {
                botPanel.Children.Add(button);
            }
            else
            {
                inflateHand();
            }
        }
    }
}
