using MySql.Data.MySqlClient;
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 static NeshinaDem3.Add;

namespace NeshinaDem3
{
    public partial class Edit : Form
    {
        public Edit()
        {
            InitializeComponent();

        }
        public int MaterialId { get; set; }
        private void btnSave_Click(object sender, EventArgs e) //СОХРАНЕНИЕ С ПРОВЕРКАМИ
        {
            if (string.IsNullOrWhiteSpace(txtName.Text))
            {
                MessageBox.Show("Введите название материала.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txtName.Focus();
                return;
            }

            if (cmbType.SelectedItem == null)
            {
                MessageBox.Show("Выберите тип материала.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                cmbType.Focus();
                return;
            }

            if (!decimal.TryParse(txtPrice.Text, out decimal price) || price < 0)
            {
                MessageBox.Show("Введите корректную цену (неотрицательное число).", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txtPrice.Focus();
                return;
            }

            if (!int.TryParse(txtQuantity.Text, out int quantity) || quantity < 0)
            {
                MessageBox.Show("Введите корректное количество (неотрицательное целое число).", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txtQuantity.Focus();
                return;
            }

            if (!int.TryParse(txtMinQuantity.Text, out int minQty) || minQty < 0)
            {
                MessageBox.Show("Введите корректное минимальное количество.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txtMinQuantity.Focus();
                return;
            }

            if (!int.TryParse(txtStockQuantity.Text, out int stockQty) || stockQty < 0)
            {
                MessageBox.Show("Введите корректное количество на складе.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txtStockQuantity.Focus();
                return;
            }

            if (cmbUnit.SelectedItem == null)
            {
                MessageBox.Show("Выберите единицу измерения.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                cmbUnit.Focus();
                return;
            }

            var typeItem = (ComboItem)cmbType.SelectedItem;
            var unitItem = (ComboItem)cmbUnit.SelectedItem;
            //ОБНОВЛЕНИЕ
            string updateQuery = @"
        UPDATE Materials 
        SET 
            Name = @name,
            Type = @type,
            Price = @price,
            Quantity = @quantity,
            MinQuantity = @minQty,
            QuantityPack = @stockQty,
            Unit = @unit
        WHERE idMaterials = @id";

            var conn = DB.GetInstance().GetConnection();
            if (conn.State == ConnectionState.Closed)
                conn.Open();

            using (var cmd = new MySqlCommand(updateQuery, conn))
            {
                cmd.Parameters.AddWithValue("@name", txtName.Text.Trim());
                cmd.Parameters.AddWithValue("@type", typeItem.Id);
                cmd.Parameters.AddWithValue("@price", price);
                cmd.Parameters.AddWithValue("@quantity", quantity);
                cmd.Parameters.AddWithValue("@minQty", minQty);
                cmd.Parameters.AddWithValue("@stockQty", stockQty);
                cmd.Parameters.AddWithValue("@unit", unitItem.Id);
                cmd.Parameters.AddWithValue("@id", MaterialId);

                try
                {
                    int rowsAffected = cmd.ExecuteNonQuery();
                    if (rowsAffected > 0)
                    {
                        MessageBox.Show("Материал успешно обновлён!", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        this.DialogResult = DialogResult.OK;
                        this.Close();
                    }
                    else
                    {
                        MessageBox.Show("Не удалось обновить материал. Возможно, он был удалён.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        this.DialogResult = DialogResult.Cancel;
                        this.Close();
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show($"Ошибка при обновлении: {ex.Message}", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }

        private void LoadMaterialData() //ЗАГРУЗКА МАТЕРИАЛОВ
        {
            if (MaterialId <= 0)
            {
                MessageBox.Show("Некорректный ID материала.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                this.DialogResult = DialogResult.Cancel;
                this.Close();
                return;
            }

            LoadTypes();
            LoadUnits();

            string query = @"
        SELECT 
            m.Name,
            m.Type,
            m.Price,
            m.Quantity,
            m.MinQuantity,
            m.QuantityPack,
            m.Unit
        FROM Materials m
        WHERE m.idMaterials = @id";

            var conn = DB.GetInstance().GetConnection();
            if (conn.State == ConnectionState.Closed)
                conn.Open();

            using (var cmd = new MySqlCommand(query, conn))
            {
                cmd.Parameters.AddWithValue("@id", MaterialId);

                using (var reader = cmd.ExecuteReader())
                {
                    if (reader.Read())
                    {
                        txtName.Text = reader.GetString("Name");
                        decimal price = reader.GetDecimal("Price");
                        txtPrice.Text = price.ToString();

                        int quantity = reader.GetInt32("Quantity");
                        txtQuantity.Text = quantity.ToString();

                        int minQty = reader.GetInt32("MinQuantity");
                        txtMinQuantity.Text = minQty.ToString();

                        int stockQty = reader.GetInt32("QuantityPack");
                        txtStockQuantity.Text = stockQty.ToString();

                        SelectComboBoxItem(cmbType, reader.GetInt32("Type"));
                        SelectComboBoxItem(cmbUnit, reader.GetInt32("Unit"));
                    }
                    else
                    {
                        MessageBox.Show("Материал не найден. Возможно, он был удалён.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        this.DialogResult = DialogResult.Cancel;
                        this.Close();
                    }
                }
            }
        
    }

        private void SelectComboBoxItem(ComboBox comboBox, int id)
        {
            foreach (ComboItem item in comboBox.Items)
            {
                if (item.Id == id)
                {
                    comboBox.SelectedItem = item;
                    break;
                }
            }
        }

        private void LoadTypes()  //ЗАГРУЗКА ТИПОВ МАТЕРИАЛОВ
        {
            string query = "SELECT idTypeMaterial, Name FROM TypeMaterial";
            var conn = DB.GetInstance().GetConnection();
            if (conn.State == ConnectionState.Closed)
                conn.Open();

            using (var cmd = new MySqlCommand(query, conn))
            {
                using (var reader = cmd.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        cmbType.Items.Add(new ComboItem
                        {
                            Id = reader.GetInt32("idTypeMaterial"),
                            Name = reader.GetString("Name")
                        });
                    }
                }
            }
        }

        private void LoadUnits() //ЗАГРУЗКА ЕДИНИЦ 
        {
            string query = "SELECT idUnit, Name FROM Unit";
            var conn = DB.GetInstance().GetConnection();
            if (conn.State == ConnectionState.Closed)
                conn.Open();

            using (var cmd = new MySqlCommand(query, conn))
            {
                using (var reader = cmd.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        cmbUnit.Items.Add(new ComboItem
                        {
                            Id = reader.GetInt32("idUnit"),
                            Name = reader.GetString("Name")
                        });
                    }
                }
            }
        }

        private void Edit_Load_1(object sender, EventArgs e)
        {
            LoadMaterialData();

        }

        private void button1_Click(object sender, EventArgs e)
        {
            
            this.Hide();
        }
    }
}
