using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Wanderer.controller;
using Wanderer.model;
using Wanderer.view.Controls;

namespace Wanderer.view
{
    public partial class FormJeu : Form
    {
        private int currentPlayerIndex = 0;
        int tailleTerritoire;
        int nombreTour;
        int bonusCh = 0;//bonus Chemin
        int bonusCl = 0; //bonus Club
        int marks = 40;
        int randonneurs = 0;

        const int limiteRandonneur = 100;
        const int limiteTerritoire = 200;
        
        int[] tbCouts = new int[] { 30, 10, 15, 10, 60 }; //Refuge,Chemin,Club,Train,Usine
        int[] tbGains = new int[] { 5, 0, 0, 0, 10 };
        int[] tbRandonneur = new[] { 3, 2, 6, 0, -10 };
        int[] tbConstruct = new int[]{0, 0, 0, 0, 0}; //Refuge,Chemin,Club,Train,Usine

        /**
         * Action updateButtons()
         *   - vérifie si fond suffisant pour les éléments
         *      - si oui, enable + fond transparent
         *      - si non, disable + fond gris
         *   - premier tour grise tout sauf btn Train
         *  */
        public void updateButtons()
        {
            foreach (Object o in Controls)
            {
                if (o is Button b && b.Tag != null)
                {
                    if (tbCouts[Convert.ToInt32(b.Tag)] > marks)
                    {
                        b.Enabled = false;
                        b.BackColor = Color.Gray;
                    }
                    else
                    {
                        b.Enabled = true;
                        b.BackColor = Color.Transparent;
                    }

                    //Premier tour
                    if(nombreTour==1)
                    {
                        b.Enabled = false;
                        b.BackColor = Color.Gray;
                        btnTrain.Enabled = true;
                        btnTrain.BackColor = Color.Transparent;
                    }
                }                
            }
            //Désactive train
            if (nombreTour > 1)
            {
                btnTrain.BackColor = Color.Gray;
                btnTrain.Enabled = false;
            }
        }

        /**
         * Action btnClick
         *  - vérifie si fond suffisant
         *  - mise en place de l'image
         *  - calculs des bonus des chemins et club
         *  - lance update()
         **/

        private void btn_Click(object sender, EventArgs e)
        {
            Button b = (Button)sender;
            Int32 i = Convert.ToInt32(b.Tag);
            int cout = tbCouts[i];
            int gain = tbGains[i];

            //Calcul des marks et randonneurs, ajout d'image sur la map
            if (marks >= cout && MapView.SelectedTile.model.Improvement == 0)
            {
                MapView.SelectedTile.model.Improvement = (Improvement) i;
                if (!MapView.SelectedTile.model.HasChanged) return;

                MapView.SelectedTile.model.Owner = Game.Instance.Players[currentPlayerIndex];
                tbConstruct[i]++;

                if (tbConstruct[1] % 5 ==0 && tbConstruct[1]!=0)
                {
                    bonusCh += 1;
                }
                if (tbConstruct[2] % 5 == 0 && tbConstruct[2] != 0)
                {
                    bonusCl += 2;
                }
                marks -= cout-gain-10;
                randonneurs += tbRandonneur[i]+bonusCh+bonusCl;
                if (randonneurs < 0) 
                { 
                    randonneurs = 0; 
                }
                update();
            }
        }

        /**
         * Mise à jour des Lables et du MapView
        **/
        private void update()
        {
            currentPlayerIndex = (currentPlayerIndex + 1) % Game.Instance.Players.Count;
            lblArgent.Text = "Argent :" + marks;
            lblMarcheur.Text = "Marcheurs : " + randonneurs;
            lblTour.Text = "Nombre d'action : " + nombreTour++;
            if (MapView.SelectedTile != null && MapView.SelectedTile.model.HasChanged)
            {
                MapView.SelectedTile.Image = image();
                MapView.SelectedTile.model.HasChanged = false;
            }
            updateButtons();
        }


        

        public void updateTailleTerritoire(int nombreClub, int nombreChemins, int nombreRefuges)
        {
            tailleTerritoire = nombreChemins * 5 + nombreRefuges * 10;
        }

        public void disable()
        {
            this.Enabled = false;
        }

        public FormJeu()
        {
            InitializeComponent();
        }

        private void pictureBox1_Click(object sender, EventArgs e)
        {
            FormAide formAide = new FormAide();
            formAide.Show();
        }

        private void FormJeu_Load(object sender, EventArgs e)
        {
            mapView1.Model = new Map(20, 10);
            update();
        }

        private void FormJeu_FormClosed(object sender, FormClosedEventArgs e)
        {
            Application.Exit();
        }

        public Image image()
        {
            switch (MapView.SelectedTile.model.Improvement)
            {
                case Improvement.Club:
                    return btnClub.Image;
                case Improvement.Factory:
                    return btnUsine.Image;
                case Improvement.Path:
                    return btnChemin.Image;
                case Improvement.Refuge:
                    return btnRefuge.Image;
                case Improvement.TrainStation:
                    return btnTrain.Image;
            }

            return null;
        }

        private void btnUsine_Click(object sender, EventArgs e)
        {
        }

        private void btnTrain_Click(object sender, EventArgs e)
        {
        }

        private void btnRefuge_Click(object sender, EventArgs e)
        {
        }


        private void btnChemin_Click(object sender, EventArgs e)
        {
        }

        private void btnClub_Click(object sender, EventArgs e)
        {
        }

        private void mapView1_Paint(object sender, PaintEventArgs e)
        { 
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void mapView1_Click(object sender, EventArgs e)
        {
           
        }

        

    }
}