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;

namespace NeshinaPolina2111
{
    public partial class MaterialPurchaseCalculatorForm : Form
    {
        public MaterialPurchaseCalculatorForm()
        {
            InitializeComponent();
        }

        private void MaterialPurchaseCalculatorForm_Load(object sender, EventArgs e)
        {
            LoadProductTypes();
            LoadMaterialTypes();
            lblResult.Text = "";
        }

        private void LoadProductTypes()
        {
            string query = "SELECT idProduct_type_import, TypeProduction, Coefficient FROM Product_type_import ORDER BY TypeProduction";
            LoadComboBox(cmbProductType, query, "TypeProduction", "idProduct_type_import");
        }

        private void LoadMaterialTypes()
        {
            string query = "SELECT idMaterial_type_import, Name, Procent FROM Material_type_import ORDER BY Name";
            LoadComboBox(cmbMaterialType, query, "Name", "idMaterial_type_import");
        }

        private void LoadComboBox(ComboBox comboBox, string query, string displayMember, string valueMember)
        {
            var conn = DB.GetInstance().GetConnection();
            if (conn.State == ConnectionState.Closed)
                conn.Open();

            using (var cmd = new MySqlCommand(query, conn))
            {
                var adapter = new MySqlDataAdapter(cmd);
                var dt = new DataTable();
                adapter.Fill(dt);

                comboBox.DisplayMember = displayMember;
                comboBox.ValueMember = valueMember;
                comboBox.DataSource = dt;
            }
        }

        private bool TryParsePositiveDecimal(string input, out decimal result)
        {
            result = 0;
            if (string.IsNullOrWhiteSpace(input))
                return false;
            if (!decimal.TryParse(input.Replace('.', ','), out result))
                return false;
            return result > 0;
        }

        private bool TryParseNonNegativeDecimal(string input, out decimal result)
        {
            result = 0;
            if (string.IsNullOrWhiteSpace(input))
                return false;
            if (!decimal.TryParse(input.Replace('.', ','), out result))
                return false;
            return result >= 0;
        }

        private void btnCalculate_Click(object sender, EventArgs e)
        {
            // 1. Проверка выбора типов
            if (cmbProductType.SelectedValue == null || cmbMaterialType.SelectedValue == null)
            {
                MessageBox.Show("Выберите тип продукции и тип материала.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            int productTypeId = Convert.ToInt32(cmbProductType.SelectedValue);
            int materialTypeId = Convert.ToInt32(cmbMaterialType.SelectedValue);
            int quantityProduced = (int)numQuantityProduced.Value;

            // 2. Проверка параметров
            decimal param1, param2, stock;
            if (!TryParsePositiveDecimal(txtParam1.Text, out param1))
            {
                MessageBox.Show("Параметр 1 должен быть положительным числом.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            if (!TryParsePositiveDecimal(txtParam2.Text, out param2))
            {
                MessageBox.Show("Параметр 2 должен быть положительным числом.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            if (!TryParseNonNegativeDecimal(txtStock.Text, out stock))
            {
                MessageBox.Show("Количество на складе не может быть отрицательным.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            // 3. Вызов метода расчёта
            int result = DB.CalculateMaterialToPurchase(
                productTypeId,
                materialTypeId,
                quantityProduced,
                param1,
                param2,
                stock
            );

            // 4. Обработка результата
            if (result == -1)
            {
                lblResult.Text = "❌ Ошибка: не найдены типы продукции или материала.";
                lblResult.ForeColor = Color.Red;
            }
            else if (result == 0)
            {
                lblResult.Text = "✅ Материал на складе достаточен — ничего докупать не нужно.";
                lblResult.ForeColor = Color.Green;
            }
            else
            {
                lblResult.Text = $"🔹 Требуется докупить материала: {result} ед.";
                lblResult.ForeColor = Color.Blue;
            }
        }
    }
}
    

