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 MySql.Data.MySqlClient;

namespace lr3
{
    public partial class Form15 : Form
    {
        public void disable_components(Control[] c) //блокує пакетно передані візуальні компоненти
        {
            foreach (Control e in c) e.Enabled = false; //перебираємо через змінну e компоненти та блокуємо їх
        }

        public void enable_components(Control[] c) //розблоковує пакетно передані компоненти
        {
            foreach (Control e in c) e.Enabled = true; //перебираємо через змінну e компоненти та розблоковуємо їх
        }

        public void hide_components(Control[] c) //ховаємо пакетно передані компоненти
        {
            foreach (Control e in c) e.Visible = false;//перебираємо через змінну е компоненти та ховаємо їх
        }

        public void show_components(Control[] c) //показуємо пакетно передані компоненти
        {
            foreach (Control e in c) e.Visible = true;//перебираємо через змінну е компоненти та показуємо їх
        }

        public bool alert_message(string msg, string cap) //показує повідомлення і повертає істину, якщо натиснута кнопка так
        {
            //показуємо повідомлення msg із заголовком cap і якщо відповідь так тоді повертаемо істину
            if (MessageBox.Show(msg, cap, MessageBoxButtons.YesNo) == DialogResult.Yes) return true;
            return false;//в іншому випадку повертаємо хибність
        }

        private MySqlConnection con;

        public Form15(MySqlConnection c)
        {
       
            InitializeComponent();
            con = c;
            tabControl1.SelectedIndex = 0;
           fill_grid("SELECT `zaholovky_zamovlen`.`id`," +
                       "`poslugy`.`Name` as 'poslugy', `client`.`name` as 'client',`personal`.`Name` as 'personal',`zaholovky_zamovlen`.`summ`,`zaholovky_zamovlen`.`data`, " +
                       "`poslugy`.`id` as 'bid', " +
                       "`personal`.`id` as 'pid', " +
                       "`client`.`id` as 'uid'  FROM `zaholovky_zamovlen` " +

                       "JOIN `poslugy` on `poslugy`.`id`=`zaholovky_zamovlen`.`id_poslugy` " +
                       "JOIN `client` on `client`.`id`=`zaholovky_zamovlen`.`id_client` " +
                       "JOIN `personal` on `personal`.`id`=`zaholovky_zamovlen`.`id_personal`;", dataGridView1,

           new string[] { "bid", "pid", "uid", "id" },//перелічуємо назви стовпців, які потрібно приховати
              
                new string[] { "poslugy", "personal", "client", "summ",  "Data" },//перелічуємо назви стовпців транслітом
                new string[] { "Послуги", "Співробітник", "Клієнт ", "Сума", "Дата" });

            fill_combobox("SELECT * FROM `poslugy`;", "id", "Name", comboBox5);
            fill_combobox("SELECT * FROM `client`;", "id", "Name", comboBox1);
            fill_combobox("SELECT * FROM `poslugy`;", "id", "Name", comboBox7);
            fill_combobox("SELECT * FROM `client`;", "id", "Name", comboBox3);
            fill_combobox("SELECT * FROM `personal`;", "id", "Name", comboBox4);
            fill_combobox("SELECT * FROM `materialy`;", "id", "material", comboBox6);
            fill_combobox("SELECT * FROM `materialy`;", "id", "material", comboBox8);
            fill_combobox("SELECT * FROM `personal`;", "id", "Name", comboBox2);
        }
        private void fill_grid(string q, DataGridView d, string[] f, string[] wn, string[] nn)
        { //Виконуємо запит і відображаємо результат на сітці та ховаємо у відображенні стовпці f
            //та переіменовуємо стовпці wn в nn
            fill_grid(q, d, f); // викликаємо перевантажену функцію яка заповнює сітку та ховає "непотрібні" поля
            for (int i = 0; i <= wn.Length - 1; i++)
            { //перебираємо кожне значення в wn
                d.Columns[wn[i]].HeaderText = nn[i];//присвоюємо стовпцю з назвою елемента wn нову назву з nn
            }

        }

        //=-=-=-=-=-=-=-= Перше перевантаження функції (тільки приховуємо)
        private void fill_grid(string q, DataGridView d, string[] f)
        { //Виконуємо запит і відображаємо результат на сітці та ховаємо у відображенні стовпці f
            fill_grid(q, d);//викликаємо перевантажену функцію, яка заповнює сітку
            foreach (string fn in f) //перебераємо всі значення f
            {
                d.Columns[fn].Visible = false;//ховаємо заданий стовпець
            }
        }

        public void fill_combobox(string q, string f_id, string f_name, ComboBox c)
        {
            DataGridView dgv = new DataGridView() { Parent = this, Visible = false };
            fill_grid(q, dgv);
            c.DataSource = null;
            c.Items.Clear();
            Dictionary<string, string> comboSource = new Dictionary<string, string>();
            foreach (DataGridViewRow r in dgv.Rows)
            {
                comboSource.Add(r.Cells[f_id].Value + "", r.Cells[f_name].Value + "");
            }
            c.DataSource = new BindingSource(comboSource, null);
            c.DisplayMember = "Value";
            c.ValueMember = "Key";
            c.Text = "";
        }

        private void fill_grid(string q, DataGridView d)
        {
            DataTable dt = new DataTable();
            if (con.State.ToString() != "Open") con.Open();
            MySqlCommand com = new MySqlCommand(q, con);
            MySqlDataReader dr = com.ExecuteReader();
            dt.Load(dr);
            d.DataSource = dt;
            dr.Close();
        }

        private Int32 read_integer_data(string q)
        {
            Int32 result = 0;
            if (con.State.ToString() != "Open") con.Open();
            MySqlCommand com = new MySqlCommand(q, con);
            MySqlDataReader dr = com.ExecuteReader();
            if (dr.HasRows)
            {
                dr.Read();
                result = dr.GetInt32(0);
            }
            dr.Close();
            return result;
        }

        private void run_query(string q)
        {
            if (con.State.ToString() != "Open") con.Open();
            MySqlCommand com = new MySqlCommand(q, con);
            com.ExecuteNonQuery();
        }

        private void button1_Click(object sender, EventArgs e)
        {
           
            string p_id = comboBox5.SelectedValue + "";
            if (p_id == "") p_id = "0";
            string c_id = comboBox1.SelectedValue + "";
            if (c_id == "") c_id = "0";
            string s_id = comboBox2.SelectedValue + "";
            if (s_id == "") s_id = "0";
            string summ= textBox1.Text + "";
            string data = textBox6.Text + "";
            run_query("INSERT INTO `zaholovky_zamovlen` VALUES (NULL,'" + p_id + "','" + c_id + "','"  + s_id + "','" + summ + "','" + data + "');");
            fill_grid("SELECT `zaholovky_zamovlen`.`id`," +
                        "`poslugy`.`Name` as 'poslugy', `client`.`name` as 'client',`personal`.`Name` as 'personal',`zaholovky_zamovlen`.`summ`,`zaholovky_zamovlen`.`data`, " +
                        "`poslugy`.`id` as 'bid', " +
                        "`personal`.`id` as 'pid', " +
                        "`client`.`id` as 'uid'  FROM `zaholovky_zamovlen` " +

                        "JOIN `poslugy` on `poslugy`.`id`=`zaholovky_zamovlen`.`id_poslugy` " +
                        "JOIN `client` on `client`.`id`=`zaholovky_zamovlen`.`id_client` " +
                        "JOIN `personal` on `personal`.`id`=`zaholovky_zamovlen`.`id_personal`;", dataGridView1,

            new string[] { "bid", "pid", "uid", "id" },//перелічуємо назви стовпців, які потрібно приховати

                 new string[] { "poslugy", "personal", "client", "summ", "Data" },//перелічуємо назви стовпців транслітом
                 new string[] { "Послуги", "Співробітник", "Клієнт ", "Сума", "Дата" });
            comboBox1.Text = ""; comboBox5.Text = ""; comboBox2.Text = ""; textBox6.Text = ""; textBox1.Text = "";
            button2_Click(this, null);

        }

        private void button2_Click(object sender, EventArgs e)
        {
            enable_components(new Control[] { dataGridView1, tabControl2, tabControl1, tabPage2,  });//розблоковуємо сітку, вкладку редагувати і панель пошуку
       
        }

        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            string id = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells["id"].Value + "";
            fill_grid("SELECT `punkty_zamovlen`.`id`," +
                       " `materialy`.`material` as 'material',`punkty_zamovlen`.`kilkist`,`punkty_zamovlen`.`price`, " +
                       "`materialy`.`id` as 'mid', " +
                       " `punkty_zamovlen`.`id_zaholovky_zamovlen` from `punkty_zamovlen` " +

                
                       "JOIN `materialy` on `materialy`.`id`=`punkty_zamovlen`.`id_materialy` " +
                       "WHERE `punkty_zamovlen`.`id_zaholovky_zamovlen` = " + id, dataGridView2,

           new string[] { "mid",  "id_zaholovky_zamovlen", "id" },//перелічуємо назви стовпців, які потрібно приховати

                new string[] {  "material", "kilkist", "price" },//перелічуємо назви стовпців транслітом
                new string[] {  "Матеріал",  "Кількість", "Ціна" });
        }

        private void button6_Click(object sender, EventArgs e)
        {
            comboBox6.Text = "";  textBox2.Text = ""; textBox3.Text = "";
            enable_components(new Control[] { dataGridView2, tabControl2, tabControl1, tabPage2, tabPage1 });


        }

        private void button5_Click(object sender, EventArgs e)
        {
            string id_zaholovky_zamovlen = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells["id"].Value + "";
            string m_id = comboBox6.SelectedValue + "";
            if (m_id == "") m_id = "0";
            string kilkist = textBox2.Text;
            string price = textBox3.Text;

            Int32 new_kilkist = Convert.ToInt32(kilkist);

            Int32 sklad_kilk = read_integer_data("SELECT COALESCE( sum(`sklad`.`kilkist`), 0) as `kilkist` from `sklad` where `sklad`.`id_materialy` = '" + m_id + "'");

            Int32 zalyshok = sklad_kilk - new_kilkist;
            if (zalyshok < 0)
            {
                MessageBox.Show("На складі недостатньо матеріалів");
                return;
            }

            run_query("INSERT INTO `punkty_zamovlen` VALUES (NULL, '" + id_zaholovky_zamovlen + "','" + m_id + "','"  + price + "','"+ kilkist + "');");
            run_query("UPDATE  `sklad` SET `kilkist`='" + zalyshok.ToString() + "' WHERE `id_materialy`=" + m_id + ";");

            fill_grid("SELECT `punkty_zamovlen`.`id`," +
                       " `materialy`.`material` as 'material',`punkty_zamovlen`.`kilkist`,`punkty_zamovlen`.`price`, " +
                       "`materialy`.`id` as 'm_id', " +
                       " `punkty_zamovlen`.`id_zaholovky_zamovlen` from `punkty_zamovlen` " +

                
                       "JOIN `materialy` on `materialy`.`id`=`punkty_zamovlen`.`id_materialy` "+
                        "WHERE `punkty_zamovlen`.`id_zaholovky_zamovlen` = " + id_zaholovky_zamovlen, dataGridView2,

           new string[] { "m_id",  "id_zaholovky_zamovlen", "id" },//перелічуємо назви стовпців, які потрібно приховати

                new string[] {  "material", "kilkist", "price" },//перелічуємо назви стовпців транслітом
                new string[] {  "Матеріал",  "Кількість", "Ціна" });
            comboBox6.Text = "";  textBox2.Text = ""; textBox3.Text = "";
           
            button6_Click(this, null);
        }

        private void button7_Click(object sender, EventArgs e)
        {
            string id= dataGridView2.Rows[dataGridView2.CurrentRow.Index].Cells["id"].Value + "";
            string id_zaholovky_zamovlen = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells["id"].Value + "";
            string m_id = comboBox8.SelectedValue + "";
            if (m_id == "") m_id = "0";
            string kilkist = textBox4.Text;
            string price = textBox5.Text;

            Int32 old_m_id = read_integer_data("select `id_materialy` from `punkty_zamovlen` where `id` = '" + id + "'");

            Int32 sklad_kilk = read_integer_data("SELECT COALESCE( sum(`sklad`.`kilkist`), 0) as `kilkist` from `sklad` where `sklad`.`id_materialy` = '" + m_id + "'");
            Int32 old_sklad_kilk = read_integer_data("SELECT COALESCE( sum(`sklad`.`kilkist`), 0) as `kilkist` from `sklad` where `sklad`.`id_materialy` = '" + old_m_id.ToString() + "'");

            Int32 new_kilkist = Convert.ToInt32(kilkist);
            Int32 old_kilk = read_integer_data("SELECT `kilkist` from `punkty_zamovlen` where `id` = '" + id + "'");

            Int32 zalyshok = 0;
            if (old_m_id.ToString() != m_id)
            {
                zalyshok = sklad_kilk - new_kilkist;
            }
            else
            {
                zalyshok = sklad_kilk + old_kilk - new_kilkist;
            }

            if (zalyshok < 0)
            {
                MessageBox.Show("На складі недостатньо матеріалів");
                return;
            }

            if (old_m_id.ToString() != m_id)
            {
                run_query("UPDATE  `sklad` SET `kilkist`= `kilkist` + '" + old_kilk.ToString() + "' WHERE `id_materialy`=" + old_m_id.ToString() + ";");
            }
            run_query("UPDATE  `sklad` SET `kilkist`='" + zalyshok.ToString() + "' WHERE `id_materialy`=" + m_id + ";");

            run_query("UPDATE `punkty_zamovlen` SET `id_materialy`='" + m_id + "',`kilkist`='" + kilkist + "',`price`='" + price  + "' WHERE `id`=" + id + "");
            fill_grid("SELECT `punkty_zamovlen`.`id`," +
                       " `materialy`.`material` as 'material',`punkty_zamovlen`.`kilkist`,`punkty_zamovlen`.`price`, " +
                       "`materialy`.`id` as 'm_id', " +
                       " `punkty_zamovlen`.`id_zaholovky_zamovlen` from `punkty_zamovlen` " +


                       "JOIN `materialy` on `materialy`.`id`=`punkty_zamovlen`.`id_materialy` " +
                        "WHERE `punkty_zamovlen`.`id_zaholovky_zamovlen` = " + id_zaholovky_zamovlen, dataGridView2,

                new string[] { "m_id", "id_zaholovky_zamovlen", "id" },//перелічуємо назви стовпців, які потрібно приховати

                new string[] { "material", "kilkist", "price" },//перелічуємо назви стовпців транслітом
                new string[] { "Матеріал", "Кількість", "Ціна" });
            comboBox8.Text = ""; textBox4.Text = ""; textBox5.Text = "";
            button8_Click(this, null);

        }

        private void редагуватиToolStripMenuItem_Click(object sender, EventArgs e)
        {
            comboBox8.Text= dataGridView2.Rows[dataGridView2.CurrentRow.Index].Cells["material"].Value + "";
            textBox4.Text = dataGridView2.Rows[dataGridView2.CurrentRow.Index].Cells["kilkist"].Value + "";
            textBox5.Text = dataGridView2.Rows[dataGridView2.CurrentRow.Index].Cells["price"].Value + "";
            show_components(new Control[] { tabPage2 });//показуємо панель вкладок, та кнопку відмінити редагування
            disable_components(new Control[] { dataGridView2, dataGridView1, tabControl1, tabPage1});//блокуємо сітку, вкладку редагувати, панель пошуку 

            tabControl2.SelectedIndex = 1;
    
        }

        private void редагуватиToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            comboBox7.Text = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells["poslugy"].Value + "";
            comboBox3.Text = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells["client"].Value + "";
            comboBox4.Text = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells["personal"].Value + "";
            textBox7.Text = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells["data"].Value + "";
            textBox8.Text = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells["summ"].Value + "";
              disable_components(new Control[] { dataGridView1, tabPage1, tabControl2 });//(2)
            tabControl1.SelectedIndex = 1;
           
        }

        private void button3_Click(object sender, EventArgs e)
        {
           
            string id = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells["id"].Value + "";
            string p_id = comboBox7.SelectedValue + "";
            if (p_id == "") p_id = "0";
            string c_id = comboBox3.SelectedValue + "";
            if (c_id == "") c_id = "0";
            string pr_id = comboBox4.SelectedValue + "";
            if (pr_id == "") pr_id = "0";
            string data = textBox7.Text; string summ = textBox8.Text;
            data = Convert.ToDateTime(data).ToString("yyyy-MM-dd");
            run_query("UPDATE `zaholovky_zamovlen` SET `id_poslugy`='" + p_id + "',`id_client`='" + c_id + "',`id_personal`='" + pr_id + "',`data`='" + data + "',`summ`='" + summ + "' WHERE `id`=" + id + "");
            fill_grid("SELECT `zaholovky_zamovlen`.`id`," +
                        "`poslugy`.`Name` as 'poslugy', `client`.`name` as 'client',`personal`.`Name` as 'personal',`zaholovky_zamovlen`.`summ`,`zaholovky_zamovlen`.`data`, " +
                        "`poslugy`.`id` as 'bid', " +
                        "`personal`.`id` as 'pid', " +
                        "`client`.`id` as 'uid'  FROM `zaholovky_zamovlen` " +

                        "JOIN `poslugy` on `poslugy`.`id`=`zaholovky_zamovlen`.`id_poslugy` " +
                        "JOIN `client` on `client`.`id`=`zaholovky_zamovlen`.`id_client` " +
                        "JOIN `personal` on `personal`.`id`=`zaholovky_zamovlen`.`id_personal`;", dataGridView1,

            new string[] { "bid", "pid", "uid", "id" },//перелічуємо назви стовпців, які потрібно приховати

                 new string[] { "poslugy", "personal", "client", "summ", "Data" },//перелічуємо назви стовпців транслітом
                 new string[] { "Послуги", "Співробітник", "Клієнт ", "Сума", "Дата" });
            button4_Click(this, null);
        }

        private void button4_Click(object sender, EventArgs e)
        {

            comboBox7.Text = ""; comboBox3.Text = ""; comboBox4.Text = ""; textBox7.Text = ""; textBox8.Text = "";
            enable_components(new Control[] { dataGridView1, tabPage1, tabControl2 });

        }

        private void button8_Click(object sender, EventArgs e)
        {
            comboBox8.Text = ""; textBox4.Text = ""; textBox5.Text = "";
            enable_components(new Control[] { dataGridView2, dataGridView1, tabControl1, tabPage1 });

        }

        private void додатиToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            show_components(new Control[] { tabControl1, tabPage1 });//показуємо панель вкладок, та кнопку відмінити редагування
            disable_components(new Control[] { dataGridView1, tabControl2, tabPage2  });//блокуємо сітку, вкладку редагувати, панель пошуку
            tabControl1.SelectedIndex = 0;
        }

        private void додатиToolStripMenuItem_Click(object sender, EventArgs e)
        {
            show_components(new Control[] { tabControl2, tabPage1 });//показуємо панель вкладок, та кнопку відмінити редагування
            disable_components(new Control[] { dataGridView2, tabControl1, tabPage2 });//блокуємо сітку, вкладку редагувати, панель пошуку
            tabControl1.SelectedIndex = 1;
        }

        private void видалитиToolStripMenuItem_Click(object sender, EventArgs e)
        {
            string id = dataGridView2.Rows[dataGridView2.CurrentRow.Index].Cells["id"].Value + "";

            string price = dataGridView2.Rows[dataGridView2.CurrentRow.Index].Cells["price"].Value + "";
            if ((id != "") && (alert_message("Ви дійсно бажаєте видалити запис надання послуг на суму " + price + " ?", "Питання")))
            {
                run_query("DELETE FROM `punkty_zamovlen` WHERE `id`=" + id + ";");
                fill_grid("SELECT `punkty_zamovlen`.`id`," +
                      " `materialy`.`material` as 'material',`punkty_zamovlen`.`kilkist`,`punkty_zamovlen`.`price`, " +
                      "`materialy`.`id` as 'm_id', " +
                      " `punkty_zamovlen`.`id_zaholovky_zamovlen` from `punkty_zamovlen` " +


                      "JOIN `materialy` on `materialy`.`id`=`punkty_zamovlen`.`id_materialy` " +
                       "WHERE `punkty_zamovlen`.`id_zaholovky_zamovlen` = " + id, dataGridView2,

               new string[] { "m_id", "id_zaholovky_zamovlen", "id" },//перелічуємо назви стовпців, які потрібно приховати

               new string[] { "material", "kilkist", "price" },//перелічуємо назви стовпців транслітом
               new string[] { "Матеріал", "Кількість", "Ціна" });
                dataGridView1_CellContentClick(this, null);
            }
        }

        private void видалитиToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            string id = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells["id"].Value + "";
            string id_zaholovky_zamovlen = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells["id"].Value + "";
            string data = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells["data"].Value + "";
            if ((id != "") && (alert_message("Ви дійсно бажаєте видалити замовлення від " + data + " ?", "Питання")))
            {
                run_query("DELETE FROM `zaholovky_zamovlen` WHERE `id`=" + id + ";");
                run_query("DELETE FROM `punkty_zamovlen` WHERE `id_zaholovky_zamovlen`=" + id_zaholovky_zamovlen + ";");
                fill_grid("SELECT `zaholovky_zamovlen`.`id`," +
                         "`poslugy`.`Name` as 'poslugy', `client`.`name` as 'client',`personal`.`Name` as 'personal',`zaholovky_zamovlen`.`summ`,`zaholovky_zamovlen`.`data`, " +
                         "`poslugy`.`id` as 'bid', " +
                         "`personal`.`id` as 'pid', " +
                         "`client`.`id` as 'uid'  FROM `zaholovky_zamovlen` " +

                         "JOIN `poslugy` on `poslugy`.`id`=`zaholovky_zamovlen`.`id_poslugy` " +
                         "JOIN `client` on `client`.`id`=`zaholovky_zamovlen`.`id_client` " +
                         "JOIN `personal` on `personal`.`id`=`zaholovky_zamovlen`.`id_personal`;", dataGridView1,

             new string[] { "bid", "pid", "uid", "id" },//перелічуємо назви стовпців, які потрібно приховати

                  new string[] { "poslugy", "personal", "client", "summ", "Data" },//перелічуємо назви стовпців транслітом
                  new string[] { "Послуги", "Співробітник", "Клієнт ", "Сума", "Дата" });
            }
        }
    }

}
