using HIA_beadando.Database;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SQLite;
using System.Drawing;
using System.Windows.Forms;


namespace HIA_beadando
{
    public partial class Vendeg : Form
    {
        private int felhasznaloID;

        int sor_hossza = 10;

        int sorok_szama = 6;

        Szinhaz szinhaz = new Szinhaz();

        TextBox[][] ulohelyek;


        public Vendeg(int felhasznaloID)
        {
            InitializeComponent();

            this.felhasznaloID = felhasznaloID;

            EloadasCB.Items.AddRange(getEloadasok().ToArray());

            EloadasCB.SelectedIndex = 0;

            szinhaz.eloadasFoglalasok(EloadasCB.SelectedIndex + 1);

            SorCB.SelectedIndex = 0;
            SzekCB.SelectedIndex = 0;

            TextBox[] sor1 = { textBox2, textBox11, textBox10, textBox9, textBox8, textBox7, textBox6, textBox5, textBox4, textBox3 };
            TextBox[] sor2 = { textBox21, textBox12, textBox13, textBox14, textBox15, textBox16, textBox17, textBox18, textBox19, textBox20 };
            TextBox[] sor3 = { textBox31, textBox22, textBox23, textBox24, textBox25, textBox26, textBox27, textBox28, textBox29, textBox30 };
            TextBox[] sor4 = { textBox43, textBox34, textBox35, textBox36, textBox37, textBox38, textBox39, textBox40, textBox41, textBox42 };
            TextBox[] sor5 = { textBox81, textBox72, textBox73, textBox74, textBox75, textBox76, textBox77, textBox78, textBox79, textBox80 };
            TextBox[] sor6 = { textBox71, textBox62, textBox63, textBox64, textBox65, textBox66, textBox67, textBox68, textBox69, textBox70 };

            TextBox[][] ulohelyek = { sor1, sor2, sor3, sor4, sor5, sor6 };

            this.ulohelyek = ulohelyek;

            megvasaroltJegyekMegjelenitese();

            jegyElhelyezkedesMegjelenitese();

        }

        private void Vendeg_FormClosed(object sender, FormClosedEventArgs e)
        {
            Environment.Exit(0);
        }

        private void Vendeg_Load(object sender, EventArgs e)
        {

        }

        private List<string> getEloadasok()
        {
            DatabaseOperator dbo = new DatabaseOperator();

            dbo.openConnection();

            string sql_count = "select distinct eloadas_nev from eloadasok";

            SQLiteCommand command = new SQLiteCommand(sql_count, dbo.GetConnection());

            SQLiteDataAdapter dataAdapter = new SQLiteDataAdapter(command);

            DataTable dataTable = new DataTable();

            dataTable.Clear();

            dataAdapter.Fill(dataTable);

            List<string> eredmeny = new List<string>();

            for (int i = 0; i < dataTable.Rows.Count; i++)
            {
                eredmeny.Add(dataTable.Rows[i][0].ToString());
            }


            dbo.closeConnection();

            return eredmeny;
        }

        private void EloadasCB_SelectionChangeCommitted(object sender, EventArgs e)
        {
            szinhaz.eloadasFoglalasok(EloadasCB.SelectedIndex + 1);

            megvasaroltJegyekMegjelenitese();

            jegyElhelyezkedesMegjelenitese();
        }

        // Ez a függvény megnézi hogy a széket egy másik felhasználó már megvásárolta-e.
        // A szinhaz.jegyFoglalasok egy lista, amiben az összes foglalás adatai megtalálhatóak.
        private bool szekMegveve(int eloadas, int sor, int szek)
        {
            foreach (Foglalas foglalas in szinhaz.jegyFoglalasok)
            {
                if (eloadas == foglalas.eloadasID && sor == foglalas.sor && szek == foglalas.szek &&
                    foglalas.felhasznaloID != this.felhasznaloID)
                {
                    return true;
                }
            }

            return false;
        }


        // Ez a függvény megnézi hogy a szék adott sorában nincs-e a olyan már megvett szék, ami a túl közel van.
        // Két különböző felhasználó székei között legalább 2 széknek kell lennie.
        private bool szekSorCovidMegfelelo(int eloadas, int sor, int szek, int sor_hossza)
        {
            // Ha a szék a harmadik és a (ez esetben) nyolcadik szék közé esik, akkor megvizsgáljuk hogy a körülötte lévő 4 szék
            // megengedi-e a foglalást.
            if (szek >= 3 && szek <= sor_hossza - 2)
            {
                // Megnézzük hogy a széktől balra és jobbra lévő 2 széknyi távolságon belül nincs-e megvéve más által szék.
                if (szekMegveve(eloadas, sor, szek) == false &&
                    szekMegveve(eloadas, sor, szek - 1) == false &&
                    szekMegveve(eloadas, sor, szek - 2) == false &&
                    szekMegveve(eloadas, sor, szek + 1) == false &&
                    szekMegveve(eloadas, sor, szek + 2) == false)
                {
                    return true;
                }
            }
            // Ez esetben nem kell annyi széket vizsgálni, mert a széksor bal szélén van.
            else if (szek < 3)
            {
                if (szekMegveve(eloadas, sor, szek) == false &&
                    szekMegveve(eloadas, sor, szek - 1) == false &&
                    szekMegveve(eloadas, sor, szek + 1) == false &&
                    szekMegveve(eloadas, sor, szek + 2) == false)
                {
                    return true;
                }
            }
            // Ez esetben nem kell annyi széket vizsgálni, mert a széksor jobb szélén van.
            else if (szek > sor_hossza - 2)
            {
                if (szekMegveve(eloadas, sor, szek) == false &&
                    szekMegveve(eloadas, sor, szek + 1) == false &&
                    szekMegveve(eloadas, sor, szek - 1) == false &&
                    szekMegveve(eloadas, sor, szek - 2) == false)
                {
                    return true;
                }
            }

            return false;
        }

        // Ez a függvény megnézi hogy a szék fölött és alatt lévő sorokban megfelelő távolságtartás van a többi felhasználótól.
        // A jelenlegi beállítás szerint legalább 1 sornak kell a 2 szék között lenni.
        private bool szekOszlopCovidMegfelelo(int eloadas, int sor, int szek, int sorok_szama)
        {
            // Ha a szék sora a 2 és a (jelen esetben) 4 között van, akkor ellenőrizzük az adott széken kívül
            // a felette és alatta lévőt is.
            if (sor >= 2 && sor <= sorok_szama - 1)
            {
                if (szekMegveve(eloadas, sor, szek) == false &&
                    szekMegveve(eloadas, sor + 1, szek) == false &&
                    szekMegveve(eloadas, sor - 1, szek) == false)
                {
                    return true;
                }
            }
            // Ez esetben csak az adott széket és a felette lévőt ellenőrizzük.
            else if (sor < 2)
            {
                if (szekMegveve(eloadas, sor, szek) == false &&
                    szekMegveve(eloadas, sor + 1, szek) == false)
                {
                    return true;
                }
            }
            // Ez esetben csak az adott széket és az alatta lévőt ellenőrizzük.
            else if (sor > sorok_szama - 1)
            {
                if (szekMegveve(eloadas, sor, szek) == false &&
                    szekMegveve(eloadas, sor - 1, szek) == false)
                {
                    return true;
                }
            }

            return false;
        }

        private void JegyVasarlasButton_Click(object sender, EventArgs e)
        {

            int sor = int.Parse(SorCB.Text);
            int szek = int.Parse(SzekCB.Text);

            int kivalaszottEloadasID = EloadasCB.SelectedIndex + 1;

            if (szekSorCovidMegfelelo(kivalaszottEloadasID, sor, szek, sor_hossza) == true &&
                szekOszlopCovidMegfelelo(kivalaszottEloadasID, sor, szek, sorok_szama) == true &&
                szekMarMegveveAzonosFelhasznalo(kivalaszottEloadasID, sor, szek) == false)
            {
                jegyVasarlas(kivalaszottEloadasID, sor, szek);
            }
            else if (szekMarMegveveAzonosFelhasznalo(kivalaszottEloadasID, sor, szek) == true)
            {
                MessageBox.Show("Ezt a széket már ön megvásárolta.\nKérem válasszon másikat.");
            }
            else if (szekMegveve(kivalaszottEloadasID, sor, szek))
            {
                MessageBox.Show("Sajnos ezt a széket már megvásárolták.\nKérem válasszon másikat.");
            }
            else
            {
                MessageBox.Show("Sajnos a COVID elleni intézkedések miatt ez a szék nem megvásárolható.\nKérem válasszon másikat.");
            }

            szinhaz.eloadasFoglalasok(kivalaszottEloadasID);

            megvasaroltJegyekMegjelenitese();
            jegyElhelyezkedesMegjelenitese();
        }

        private void jegyVasarlas(int eloadas, int sor, int szek)
        {
            DatabaseOperator dbo = new DatabaseOperator();

            dbo.openConnection();

            string sql_count = "insert into jegyfoglalasok(felhasznaloID, eloadasID, sor, szek) values (" +
                               felhasznaloID + ", " + eloadas + ", " + sor + ", " + szek + ")";

            SQLiteCommand command = new SQLiteCommand(sql_count, dbo.GetConnection());

            command.ExecuteNonQuery();

            dbo.closeConnection();

            megvasaroltJegyekMegjelenitese();

            jegyElhelyezkedesMegjelenitese();
        }

        private bool szekMarMegveveAzonosFelhasznalo(int eloadas, int sor, int szek)
        {
            DatabaseOperator dbo = new DatabaseOperator();

            dbo.openConnection();

            string sql_eloadas = "select eloadasID, sor, szek from jegyfoglalasok where felhasznaloID = " +
                                felhasznaloID;

            SQLiteCommand command = new SQLiteCommand(sql_eloadas, dbo.GetConnection());

            SQLiteDataAdapter dataAdapter = new SQLiteDataAdapter(command);

            DataTable dataTable = new DataTable();

            dataTable.Clear();

            dataAdapter.Fill(dataTable);

            for (int i = 0; i < dataTable.Rows.Count; i++)
            {
                int eloadasID = int.Parse(dataTable.Rows[i][0].ToString());
                int db_sor = int.Parse(dataTable.Rows[i][1].ToString());
                int db_szek = int.Parse(dataTable.Rows[i][2].ToString());

                if (eloadasID == eloadas && db_sor == sor && db_szek == szek)
                {
                    dbo.closeConnection();

                    return true;
                }
            }


            dbo.closeConnection();

            return false;
        }

        private void megvasaroltJegyekMegjelenitese()
        {
            DatabaseOperator dbo = new DatabaseOperator();

            dbo.openConnection();

            string sql_count = "select eloadasok.eloadas_nev, sor, szek from jegyfoglalasok " +
                               "join eloadasok on eloadasok.eloadasID = jegyfoglalasok.eloadasID where " +
                               "jegyfoglalasok.felhasznaloID = " + felhasznaloID;

            SQLiteCommand command = new SQLiteCommand(sql_count, dbo.GetConnection());

            SQLiteDataAdapter dataAdapter = new SQLiteDataAdapter(command);

            DataTable dataTable = new DataTable();

            dataTable.Clear();

            dataAdapter.Fill(dataTable);


            string megvasarolt = "";

            for (int i = 0; i < dataTable.Rows.Count; i++)
            {
                string eloadas_nev = dataTable.Rows[i][0].ToString();
                string sor = dataTable.Rows[i][1].ToString();
                string szek = dataTable.Rows[i][2].ToString();

                megvasarolt += eloadas_nev + " - " + sor + ". sor, " + szek + ". szék.\n";
            }

            megvasaroltJegyekTextBox.Text = megvasarolt;

            dbo.closeConnection();
        }

        private void jegyElhelyezkedesMegjelenitese()
        {
            foreach (Foglalas foglalas in szinhaz.jegyFoglalasok)
            {
                int sor = foglalas.sor;
                int szek = foglalas.szek;

                if (foglalas.felhasznaloID != felhasznaloID && foglalas.eloadasID == EloadasCB.SelectedIndex + 1)
                {
                    ulohelyek[sor - 1][szek - 1].BackColor = Color.Red;
                }
                else if (foglalas.felhasznaloID == felhasznaloID && foglalas.eloadasID == EloadasCB.SelectedIndex + 1)
                {
                    ulohelyek[sor - 1][szek - 1].BackColor = Color.Lime;
                }
                else
                {
                    ulohelyek[sor - 1][szek - 1].BackColor = Color.Empty;
                }
            }
        }

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

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