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

namespace СУБД_Швейная_фабрика
{
    public partial class FormAddZakaz : Form
    {
        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>();
        public FormAddZakaz()
        {
            InitializeComponent();
        }
        void GetTkaniFromDB()
        {
            SqlConnection con = new SqlConnection(Properties.Settings.Default.FabricDeryugoConnectionString);
            con.Open();
            SqlCommand Query = new SqlCommand("select * from Tkani where length > 0", con);
            SqlDataReader Data = Query.ExecuteReader();
            while (Data.Read())
            {
                Tkani Tk = new Tkani();
                Tk.IdTkan = Data["idtkan"].ToString();
                Tk.NameTkan = Data["nametkan"].ToString();
                Tk.ColorTkan = Data["color"].ToString();
                Tk.Width = Data["width"].ToString();
                Tk.Length = Data["length"].ToString();
                Tk.Description = Data["description"].ToString();
                try
                {
                    // загрузить из таблицы БД байты фотографии в массив
                    byte[] PhotoByte = (byte[])Data["phototkan"];
                    ImageConverter ImConverter = new ImageConverter();
                    // сконвертировать массив байт в изображение
                    Tk.PhotoTkan = (Bitmap)ImConverter.ConvertFrom(PhotoByte);
                }
                catch
                {
                    // в случае ошибки загрузить пустое изображение из ресурсов
                    Tk.PhotoTkan = Properties.Resources.tmp;
                }
                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.FabricDeryugoConnectionString);
            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.tmp;
                }
                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
            }
        }

        private void FormAddZakaz_Load(object sender, EventArgs e)
        {
            // TODO: This line of code loads data into the 'fabricDeryugoDataSet.Tkani' table. You can move, or remove it, as needed.
            this.tkaniTableAdapter.Fill(this.fabricDeryugoDataSet.Tkani);
            // TODO: This line of code loads data into the 'fabricDeryugoDataSet.Izdeliya' table. You can move, or remove it, as needed.
            this.izdeliyaTableAdapter.Fill(this.fabricDeryugoDataSet.Izdeliya);
            GetTkaniFromDB();
            FillLVTkani();
            GetFurnituraFromDB();
            FillLVFurnitura();
        }

        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)
        {
            int NewCountFur = int.Parse(TbxCountFurSklad.Text) -
                int.Parse(TbxCountFur.Text) * int.Parse(TbxCountIzd.Text);
            SqlConnection con = new SqlConnection(Properties.Settings.Default.FabricDeryugoConnectionString);
            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);

            // обновить таблицу Ткани (для выделенной ткани сохранить новую длину NewLengthTkan)

            // код менеджера для обработки нового заказа
            // нужно заменить на код наименее загруженного менеджера
            int IdManager = 2;

            try
            {
                con.Open();
                // SQL-запрос для добавления нового заказа
                string t = String.Format("insert into Zakaz (idizd, idzakazchik, idman, idtkan, idfur, countfur, countizd) " +
                    "values ({0}, {1}, {2}, {3}, {4}, {5}, {6})",
                    LblIdIzd.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);
            }
        }

        private void izdeliyaBindingNavigatorSaveItem_Click(object sender, EventArgs e)
        {
            this.Validate();
            this.izdeliyaBindingSource.EndEdit();
            this.tableAdapterManager.UpdateAll(this.fabricDeryugoDataSet);

        }

        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 = "";
            }
        }
    }
}
