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;
using chrt = System.Windows.Forms.DataVisualization.Charting; //створюємо аліас для компоненти діаграм, щоб було зручно

namespace lr3
{
    public partial class Form13 : Form
    {
        private void fill_chart(chrt.Chart ch, DataGridView dg, string col_v, string name_v)
        //Процедура заповнення діаграми (одновимірної)
        //ch - діаграма яку потрібно заповнити
        //dg - сітка з даними для заповнення
        //col_v - стовпець зі значеннями
        //name_v - стовпець із підписами
        {
            ch.Series[0].Points.Clear();//очищуємо старі значення
            foreach (DataGridViewRow rw in dg.Rows) //перебираємо рядки сітки через змінну rw
            {
                if (!rw.IsNewRow) //якщо рядок не порожній тоді беремо значення
                {
                    string vn = "0"; string n = ""; double v = 0;//ініціалізуємо змінні для зручності
                    if (rw.Cells[col_v].Value != null)// якщо клітинка містить значення
                    {
                        vn = rw.Cells[col_v].Value.ToString();//текстове значення точки діаграми
                        v = Convert.ToDouble(vn);//числове значення точки діаграми
                    }
                    if (rw.Cells[name_v].Value != null)// якщо клітинка містить значення
                        n = rw.Cells[name_v].Value.ToString();//підпис точки діаграми
                    chrt.DataPoint p;//створюємо точку для додання до діаграми
                    p = ch.Series[0].Points.Add(v);// додаємо до точки значення
                    p.Label = vn;//додаємо мітку (значення точки)
                    p.AxisLabel = n;//текстовий підпис точки
                    p.LegendText = n;//текстовий підпис легенти
                }
            }
        }
        private MySqlConnection con; //з’єднання з БД

        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 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++)
            {
                d.Columns[wn[i]].HeaderText = nn[i];
            }
        }

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

        private void run_query(string q)
        {
            if (con.State.ToString() != "Open") con.Open();
            MySqlCommand com = new MySqlCommand(q, con);
            com.ExecuteNonQuery(); //Виконання без повернення результатів запиту
        }

        public Form13(MySqlConnection c)
        {
            InitializeComponent();
            con = c;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string d1 = dateTimePicker1.Value.ToString("yyyy-MM-dd");//початкова дата
            string d2 = dateTimePicker2.Value.ToString("yyyy-MM-dd");//кінцева дата
            fill_grid("SELECT `zaholovky_zamovlen`.`id`,`poslugy`.`name` as 'poslugy', " + // заповнюємо сітку
                      "`client`.`name` as 'client',`client`.`phone`,`personal`.`name` as 'personal', " +
                      "`zaholovky_zamovlen`.`data`,`personal`.`id` as 'pid',`poslugy`.`id` as 'bid', " +
                      "`client`.`id` as 'uid', " + "CONCAT(YEAR(`zaholovky_zamovlen`.`data`),'Q',QUARTER(`zaholovky_zamovlen`.`data`)) as 'group_date', " + //вираховуємо рік і квартал
                      " COUNT(`zaholovky_zamovlen`.`id_personal`) as 'count_poslugy' " + // вираховуємо середнє арифметичне днів на скільки була взята книга
                      "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`" +
                      "WHERE `zaholovky_zamovlen`.`data` BETWEEN '" + d1 + "' AND '" + d2 + "' " +//виставляємо діапазон дат
                      "GROUP BY `personal` " +//групуємо по сформованій даті
                      "ORDER BY `group_date`;", //сортуємо по сформованій даті
                      dataGridView1, new string[] { "bid", "pid", "uid", "id" },//перелічуємо назви стовпців, які потрібно приховати
                       new string[] { "poslugy", "client", "phone", "personal", "data", "group_date", "count_poslugy" },//перелічуємо назви стовпців транслітом
                      new string[] { "Послуги", "Клієнт", "Телефон", "Співробітник", "Дата", "Квартал", "Кількість наданих послуг по співробітниках" }); //нові зрозумілі користувачу назви стовпців
        }

        private void button2_Click(object sender, EventArgs e)
        {
            fill_chart(chart1, dataGridView1, "count_poslugy", "group_date");//заповнюємо секторну діаграму
            fill_chart(chart2, dataGridView1, "count_poslugy", "group_date");//заповнюємо гістограму
            tabControl1.SelectedIndex = 3;//показуємо вкладку діаграми
        }

        private void button3_Click(object sender, EventArgs e)
        {
            string d1 = dateTimePicker3.Value.ToString("yyyy-MM-dd");//початкова дата
            string d2 = dateTimePicker4.Value.ToString("yyyy-MM-dd");//кінцева дата
            fill_grid("SELECT `zaholovky_zamovlen`.`id`,`poslugy`.`name` as 'poslugy', " + // заповнюємо сітку
                      "`client`.`name` as 'client',`client`.`phone`,`personal`.`name` as 'personal', " +
                      "`zaholovky_zamovlen`.`data`,`personal`.`id` as 'pid',`poslugy`.`id` as 'bid', " +
                      "`client`.`id` as 'uid', " +
                                "CONCAT(YEAR(`zaholovky_zamovlen`.`data`),'/',MONTH(`zaholovky_zamovlen`.`data`)) as 'group_date', " + //вираховуємо рік і місяць
             " COUNT(`zaholovky_zamovlen`.`id_personal`) as 'count_poslugy' " + // вираховуємо середнє арифметичне днів на скільки була взята книга
                      "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`" +
                      "WHERE `zaholovky_zamovlen`.`data` BETWEEN '" + d1 + "' AND '" + d2 + "' " +//виставляємо діапазон дат
                      "GROUP BY `personal` " +//групуємо по сформованій даті
                      "ORDER BY `group_date`;", //сортуємо по сформованій даті
                      dataGridView2, new string[] { "bid", "pid", "uid", "id" },//перелічуємо назви стовпців, які потрібно приховати
                       new string[] { "poslugy", "client", "phone", "personal", "data", "group_date", "count_poslugy" },//перелічуємо назви стовпців транслітом
                      new string[] { "Послуги", "Клієнт", "Телефон", "Співробітник", "Дата", "Квартал", "Кількість наданих послуг по співробітниках" }); //нові зрозумілі користувачу назви стовпців
        }

        private void button4_Click(object sender, EventArgs e)
        {
            fill_chart(chart1, dataGridView2, "count_poslugy", "group_date");//заповнюємо секторну діаграму
            fill_chart(chart2, dataGridView2, "count_poslugy", "group_date");//заповнюємо гістограму
            tabControl1.SelectedIndex = 3;//показуємо вкладку діаграми
        }

        private void button5_Click(object sender, EventArgs e)
        {
            string d1 = dateTimePicker5.Value.ToString("yyyy-MM-dd");//початкова дата
            string d2 = dateTimePicker6.Value.ToString("yyyy-MM-dd");//кінцева дата
            fill_grid("SELECT `zaholovky_zamovlen`.`id`,`poslugy`.`name` as 'poslugy', " + // заповнюємо сітку
                      "`client`.`name` as 'client',`client`.`phone`,`personal`.`name` as 'personal', " +
                      "`zaholovky_zamovlen`.`data`,`personal`.`id` as 'pid',`poslugy`.`id` as 'bid', " +
                      "`client`.`id` as 'uid', " +
                                "CONCAT(YEAR(`zaholovky_zamovlen`.`data`),'W',WEEK(`zaholovky_zamovlen`.`data`)) as 'group_date', " + //вираховуємо рік і тиждень
             " COUNT(`zaholovky_zamovlen`.`id_personal`) as 'count_poslugy' " + // вираховуємо середнє арифметичне днів на скільки була взята книга
                      "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`" +
                      "WHERE `zaholovky_zamovlen`.`data` BETWEEN '" + d1 + "' AND '" + d2 + "' " +//виставляємо діапазон дат
                      "GROUP BY `personal` " +//групуємо по сформованій даті
                      "ORDER BY `group_date`;", //сортуємо по сформованій даті
                      dataGridView3, new string[] { "bid", "pid", "uid", "id" },//перелічуємо назви стовпців, які потрібно приховати
                       new string[] { "poslugy", "client", "phone", "personal", "data", "group_date", "count_poslugy" },//перелічуємо назви стовпців транслітом
                      new string[] { "Послуги", "Клієнт", "Телефон", "Співробітник", "Дата", "Квартал", "Кількість наданих послуг по співробітниках" }); //нові зрозумілі користувачу назви стовпців
        }

        private void button6_Click(object sender, EventArgs e)
        {
            fill_chart(chart1, dataGridView3, "count_poslugy", "group_date");//заповнюємо секторну діаграму
            fill_chart(chart2, dataGridView3, "count_poslugy", "group_date");//заповнюємо гістограму
            tabControl1.SelectedIndex = 3;//показуємо вкладку діаграми
        }
    }
}
