using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace garment_factory
{
    public partial class fAddZakaz : Form
    {
        public fAddZakaz()
        {
            InitializeComponent();
        }

        public string IdZakazchik = "";  
        string IdTkan = "", IdFur = "";


        public struct Tkani
        {
            public string IdTkan, NameTkan, ColorTkan, Width, Length, Description;
            public Image PhotoTkan;
        }

        List<Tkani> LstTkani = new List<Tkani>();

        void GetTkaniFromDB()
        {
            SqlConnection con = new SqlConnection(Properties.Settings.Default.Fabrika2024ConnectionString);
            con.Open();
            SqlCommand Query = new SqlCommand("select * from Tkani t join Cveta c on t.id_cvet=c.id_cvet where Dlina > 0", con);
            SqlDataReader Data = Query.ExecuteReader();
            while (Data.Read())
            {
                Tkani Tk = new Tkani();
                Tk.IdTkan = Data["id_Tkani"].ToString();
                Tk.NameTkan = Data["Nazvanie"].ToString();
                Tk.ColorTkan = Data["Name_cvet"].ToString();
                Tk.Width = Data["Shirina"].ToString();
                Tk.Length = Data["Dlina"].ToString();
                Tk.Description = Data["Primechanie"].ToString();
                try
                {
                    // загрузить из таблицы БД байты фотографии в массив
                    byte[] PhotoByte = (byte[])Data["Photo"];
                    ImageConverter ImConverter = new ImageConverter();
                    // сконвертировать массив байт в изображение
                    Tk.PhotoTkan = (Bitmap)ImConverter.ConvertFrom(PhotoByte);
                }
                catch
                {
                    // в случае ошибки загрузить пустое изображение из ресурсов
                    Tk.PhotoTkan = Properties.Resources.picture;
                }
                LstTkani.Add(Tk);  // добавить в список новую ткань
            }
            con.Close();
        }

        void FillLVTkani()
        {
            LVTkani.Items.Clear();
            imageListTkani.Images.Clear();
            foreach (Tkani Tk in LstTkani)
            {
                // новый элемент для ListView с названием ткани
                ListViewItem LV = new ListViewItem(Tk.NameTkan);
                // в ImageList добавить изображение ткани
                imageListTkani.Images.Add(Tk.PhotoTkan);
                // связать последнее добавленное изображение с новым элементом ListView
                LV.ImageIndex = imageListTkani.Images.Count - 1;
                LVTkani.Items.Add(LV);  // добавить новый элемент к ListView
            }
        }

        public struct Furnitura
        {
            public string IdFur, NameFur, CountFur;
            public Image PhotoFur;
        }

        List<Furnitura> LstFurnitura = new List<Furnitura>();

        void GetFurnituraFromDB()
        {
            SqlConnection con = new SqlConnection(Properties.Settings.Default.Fabrika2024ConnectionString);
            con.Open();
            SqlCommand Query = new SqlCommand("select * from Furnitura where countfur > 0", con);
            SqlDataReader Data = Query.ExecuteReader();
            while (Data.Read())
            {
                Furnitura Fr = new Furnitura();
                Fr.IdFur = Data["idfur"].ToString();
                Fr.NameFur = Data["namefur"].ToString();
                Fr.CountFur = Data["countfur"].ToString();
                try
                {
                    // загрузить из таблицы БД байты фотографии в массив
                    byte[] PhotoByte = (byte[])Data["photo"];
                    ImageConverter ImConverter = new ImageConverter();
                    // сконвертировать массив байт в изображение
                    Fr.PhotoFur = (Bitmap)ImConverter.ConvertFrom(PhotoByte);
                }
                catch
                {
                    // в случае ошибки загрузить пустое изображение из ресурсов
                    Fr.PhotoFur = Properties.Resources.picture;
                }
                LstFurnitura.Add(Fr);  // добавить в список новую фурнитуру
            }
            con.Close();
        }

        void FillLVFurnitura()
        {
            LVFurnitura.Items.Clear();
            ImageListFur.Images.Clear();
            foreach (Furnitura Fr in LstFurnitura)
            {
                // новый элемент для ListView с названием фурнитуры
                ListViewItem LV = new ListViewItem(Fr.NameFur);
                // в ImageList добавить изображение фурнитуры
                ImageListFur.Images.Add(Fr.PhotoFur);
                // связать последнее добавленное изображение с новым элементом ListView
                LV.ImageIndex = ImageListFur.Images.Count - 1;
                LVFurnitura.Items.Add(LV);  // добавить новый элемент к ListView
            }
        }

        int CutTkan(int WidthTkan, int WidthIzd, int LengthIzd, int CountIzd)
        {
            // ЕСЛИ УКЛАДЫВАТЬ ИЗДЕЛИЯ НА ТКАНЬ В РУЛОНЕ ПО ШИРИНЕ ИЗДЕЛИЯ
            // кол-во изделий, умещающихся в один ряд на рулоне ткани
            int IzdInRow1 = WidthTkan / WidthIzd;
            // кол-во рядов, в каждом из которых IzdInRow1 изделий
            int Row1 = CountIzd / IzdInRow1;
            // если кол-во изделий в 1 ряду умноженное на кол-во рядов меньше
            // кол-ва всех изделий, добавить кол-во рядов
            if (IzdInRow1 * Row1 < CountIzd)
                Row1++;
            // длина ткани, которую нужно отрезать от рулона, если укладывать изделия
            // по ширине
            int CutTkan1 = LengthIzd * Row1;

            // ЕСЛИ УКЛАДЫВАТЬ ИЗДЕЛИЯ НА ТКАНЬ В РУЛОНЕ ПО ДЛИНЕ ИЗДЕЛИЯ
            // кол-во изделий, умещающихся в один ряд на рулоне ткани
            int IzdInRow2 = WidthTkan / LengthIzd;
            // кол-во рядов, в каждом из которых IzdInRow2 изделий
            int Row2 = CountIzd / IzdInRow2;
            // если перемножить кол-во изделий в 1 ряду на кол-во рядов и полученное
            // значение меньше кол-ва необходимых изделий, значит нужно использовать
            // еще один ряд
            if (IzdInRow2 * Row2 < CountIzd)
                Row2++;
            // длина ткани, которую нужно отрезать от рулона, если укладывать изделия
            // по длине
            int CutTkan2 = WidthIzd * Row2;

            // вернуть наименьшую длину
            return Math.Min(CutTkan1, CutTkan2);
        }

        private void LVTkani_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (LVTkani.SelectedItems.Count > 0)  // есть выделенные элементы
            {
                int num = LVTkani.SelectedIndices[0];  // номер выделенного элемента
                NametkanTextBox.Text = LstTkani[num].NameTkan;
                ColorTextBox.Text = LstTkani[num].ColorTkan;
                WidthTextBox.Text = LstTkani[num].Width;
                LengthTextBox.Text = LstTkani[num].Length;
                DescriptionTextBox.Text = LstTkani[num].Description;
                IdTkan = LstTkani[num].IdTkan;
            }
            else  // нет выделенных элементов
            {
                NametkanTextBox.Text = "";
                ColorTextBox.Text = "";
                WidthTextBox.Text = "";
                LengthTextBox.Text = "";
                DescriptionTextBox.Text = "";
                IdTkan = "";
            }
        }

        

        private void BtnOK_Click(object sender, EventArgs e)
        {
            if(TbxCountIzd.Text=="" && TbxCountFur.Text=="")
            {
                MessageBox.Show("Заполните поля для формирования заказа!", "Внимание");
                return;
            }
            int NewCountFur = int.Parse(TbxCountFurSklad.Text) -
                int.Parse(TbxCountFur.Text) * int.Parse(TbxCountIzd.Text);
            SqlConnection con = new SqlConnection(Properties.Settings.Default.Fabrika2024ConnectionString);
            con.Open();
            string t1 = string.Format(@"update Furnitura
set countfur = {0}
where idfur = {1}", NewCountFur, IdFur);
            SqlCommand query = new SqlCommand(t1, con);
            // выполнить запрос
            query.ExecuteNonQuery();
            con.Close();



            
            int WidthTkan = int.Parse(WidthTextBox.Text); // ширина ткани
            // ширина изделия
            int WidthIzd = int.Parse(DgvIzd.CurrentRow.Cells[2].Value.ToString());
            // длина изделия
            int LengthIzd = int.Parse(DgvIzd.CurrentRow.Cells[1].Value.ToString());
            int CountIzd = int.Parse(TbxCountIzd.Text); // кол-во изделий
            // отрезать от рулона ткани кусок нужной длины
            int NewLengthTkan = int.Parse(LengthTextBox.Text) -
                CutTkan(WidthTkan, WidthIzd, LengthIzd, CountIzd);

            
            int IdManager = 2;

            try
            {
                con.Open();
                // SQL-запрос для добавления нового заказа
                string t = String.Format("insert into Orders (id_izdelie, id_zakaz, id_manager, idtkani, id_furnitur, CountFurnit, Countizdel) " +
                    "values ({0}, {1}, {2}, {3}, {4}, {5}, {6})",
                    id_izdelieLabel1.Text, IdZakazchik, IdManager, IdTkan, IdFur, TbxCountFur.Text, TbxCountIzd.Text);
                SqlCommand query1 = new SqlCommand(t, con);
                // выполнить запрос
                query1.ExecuteNonQuery();
                con.Close();
                MessageBox.Show("Заказ сформирован.", "Внимание!",
                    MessageBoxButtons.OK, MessageBoxIcon.Information);
                this.Close();  // закрыть форму
            }
            catch
            {
                MessageBox.Show("Ошибка добавления нового заказа.", "Внимание!",
                    MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }
        public struct Izd
        {
            public string idIZd, NameIzd, CountIzd, LengthIzd, WidthIzd;

        }

        List<Izd> LstIzd = new List<Izd>();
        void GetIzdFromDB()
        {
            SqlConnection con = new SqlConnection(Properties.Settings.Default.Fabrika2024ConnectionString);
            con.Open();
            SqlCommand Query = new SqlCommand("select * from Izdelie where length > 0 and width > 0", con);
            SqlDataReader Data = Query.ExecuteReader();
            while (Data.Read())
            {
                Izd izd1 = new Izd();
                izd1.idIZd = Data["id_izdelie"].ToString();
                izd1.NameIzd = Data["Name_izd"].ToString();
                izd1.WidthIzd = Data["width"].ToString();
                izd1.LengthIzd = Data["length"].ToString();


                
            }
            con.Close();
        }
        private void LVFurnitura_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (LVFurnitura.SelectedItems.Count > 0)  // есть выделенные элементы
            {
                int num = LVFurnitura.SelectedIndices[0];  // номер выделенного элемента
                TbxNameFur.Text = LstFurnitura[num].NameFur;
                TbxCountFurSklad.Text = LstFurnitura[num].CountFur;
                IdFur = LstFurnitura[num].IdFur;
            }
            else  // нет выделенных элементов
            {
                TbxNameFur.Text = "";
                TbxCountFurSklad.Text = "";
                IdFur = "";
            }
        }

        private void fAddZakaz_Load(object sender, EventArgs e)
        {
            // TODO: данная строка кода позволяет загрузить данные в таблицу "fabrika2024DataSet.Izdelie". При необходимости она может быть перемещена или удалена.
            this.izdelieTableAdapter.Fill(this.fabrika2024DataSet.Izdelie);
            // TODO: данная строка кода позволяет загрузить данные в таблицу "fabrika2024DataSet.Orders". При необходимости она может быть перемещена или удалена.
            this.ordersTableAdapter.Fill(this.fabrika2024DataSet.Orders);
            // TODO: данная строка кода позволяет загрузить данные в таблицу "fabrika2024DataSet.Tkani". При необходимости она может быть перемещена или удалена.
            this.tkaniTableAdapter.Fill(this.fabrika2024DataSet.Tkani);
            GetIzdFromDB();
            GetTkaniFromDB();
            FillLVTkani();
            GetFurnituraFromDB();
            FillLVFurnitura();
        }
        
        
       


    }

        
    }

