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 NeshinaDem3
{
    public partial class MainForm : Form
    {

        public enum ViewMode
        {
            Materials,
            Suppliers,
            TypeProduction
        }

        private ViewMode currentMode = ViewMode.Materials;
        public int CalculateProductOutput(
            int productTypeId,
            int materialTypeId,
            int rawMaterialAmount,
            double param1,
            double param2)
        {
            if (productTypeId <= 0 ||
                materialTypeId <= 0 ||
                rawMaterialAmount <= 0 ||
                param1 <= 0 ||
                param2 <= 0)
            {
                return -1;
            }

            double productCoeff = 0;
            double lossPercent = 0;

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

            string productQuery = "SELECT Coefficient FROM TypeProduction WHERE idTypeProduction = @productId";
            using (var cmd = new MySqlCommand(productQuery, conn))
            {
                cmd.Parameters.AddWithValue("@productId", productTypeId);
                var result = cmd.ExecuteScalar();
                if (result == null || result == DBNull.Value)
                {
                    return -1; // Тип продукции не найден
                }
                productCoeff = Convert.ToDouble(result);
            }

            string materialQuery = "SELECT Procent FROM TypeWithProcent WHERE idTypeWithProcent = @materialId";
            using (var cmd = new MySqlCommand(materialQuery, conn))
            {
                cmd.Parameters.AddWithValue("@materialId", materialTypeId);
                var result = cmd.ExecuteScalar();
                if (result == null || result == DBNull.Value)
                {
                    return -1; // Тип материала не найден
                }
                lossPercent = Convert.ToDouble(result);
            }

            if (lossPercent < 0 || lossPercent >= 100)
            {
                return -1; // Невозможные потери
            }

            double baseMaterialPerUnit = param1 * param2 * productCoeff;

            if (baseMaterialPerUnit <= 0)
            {
                return -1; // Некорректный расчёт
            }

            double effectiveMaterialPerUnit = baseMaterialPerUnit / (1.0 - lossPercent / 100.0);

            if (effectiveMaterialPerUnit > rawMaterialAmount)
            {
                return 0; // Сырья не хватает даже на 1 шт.
            }

            int maxUnits = (int)Math.Floor((double)rawMaterialAmount / effectiveMaterialPerUnit);

            return Math.Max(0, maxUnits);
        }
        public MainForm()
        {
            InitializeComponent();
            btnAdd.Visible = true;
            btnEdit.Visible = true;
            btnDelete.Visible = true;


        }

        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

        }

       
        private void LoadMaterials()   //ЗАГРУЗКА МАТЕРИАЛОВ
{
    string query = @"
        SELECT 
            m.idMaterials,
            m.Name,
            t.Name AS TypeName,          
            m.Price,
            m.Quantity,
            m.MinQuantity,
            m.QuantityPack,
            u.Name AS UnitName      
        FROM Materials m
        LEFT JOIN TypeMaterial t ON m.Type = t.idTypeMaterial  
        LEFT JOIN Unit u ON m.Unit = u.idUnit";

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

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

        dgvAll.DataSource = dt;
        if (dgvAll.Columns.Contains("idMaterials"))
        dgvAll.Columns["idMaterials"].Visible = false;
         dgvAll.Columns["Name"].HeaderText = "Наименование";
         dgvAll.Columns["TypeName"].HeaderText = "Тип";
          dgvAll.Columns["Price"].HeaderText = "Цена";
           dgvAll.Columns["Quantity"].HeaderText = "Кол-во на складе";
           dgvAll.Columns["MinQuantity"].HeaderText = "Мин. кол-во";
           dgvAll.Columns["QuantityPack"].HeaderText = "Кол-во в упаковке";
           dgvAll.Columns["UnitName"].HeaderText = "Ед. изм.";
          if(dgvAll.Columns.Contains("MinPartyCost"))
        dgvAll.Columns.Remove("MinPartyCost");
           var minPartyCostCol = new DataGridViewTextBoxColumn
           {
        Name = "MinPartyCost",
        HeaderText = "Стоимость минимальной партии",
        ReadOnly = true,
        DefaultCellStyle = { Format = "C2" }
    };
    dgvAll.Columns.Add(minPartyCostCol);
    foreach (DataGridViewRow row in dgvAll.Rows)
    {
        if (row.IsNewRow) continue;

        try
        {
            if (row.Cells["MinQuantity"].Value == null ||
                row.Cells["Quantity"].Value == null ||
                row.Cells["QuantityPack"].Value == null ||
                row.Cells["Price"].Value == null)
            {
                row.Cells["MinPartyCost"].Value = 0m;
                continue;
            }
            int minQty = Convert.ToInt32(row.Cells["MinQuantity"].Value);
            int stockQty = Convert.ToInt32(row.Cells["Quantity"].Value);
            int packQty = Convert.ToInt32(row.Cells["QuantityPack"].Value);
            decimal price = Convert.ToDecimal(row.Cells["Price"].Value);
            decimal cost = 0m;
            if (stockQty < minQty)
            {
                int deficit = minQty - stockQty;
                if (packQty > 0) // Защита от деления на ноль
                {
                    int packsNeeded = (int)Math.Ceiling((double)deficit / packQty);
                    int orderVolume = packsNeeded * packQty;
                    cost = orderVolume * price;
                }
            }
            cost = Math.Max(0m, Math.Round(cost, 2));
            row.Cells["MinPartyCost"].Value = cost;
        }
        catch (Exception ex)
        {
            row.Cells["MinPartyCost"].Value = 0m;
        }

                currentMode = ViewMode.Materials;
                btnAdd.Visible = true;
                btnEdit.Visible = true;
                btnDelete.Visible = true;
                this.Text = "Управление материалами";
            }
}

        private void LoadSuppliers() //ЗАГРУЗКА ПОСТАВЩИКОВ
        {
            string query = @"SELECT  
                m.Name, 
                y.Name, 
                m.INN, 
                m.Rating, 
                m.Date FROM Supplier m
                left join TypeSupplier y on m.Type = y.idTypeSupplier";
            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);
                dgvAll.DataSource = dt;
                if (dgvAll.Columns.Contains("TotalCost"))
                    dgvAll.Columns.Remove("TotalCost");
            }

            currentMode = ViewMode.Suppliers;
            btnAdd.Visible = false; // или true, если у вас будет AddSupplier
            btnEdit.Visible = false;
            btnDelete.Visible = false;
            this.Text = "Поставщики";
        }


        private bool isShowingSuppliers = false;
        private void btnAdd_Click(object sender, EventArgs e)
        {
           
            switch (currentMode)
            {
                case ViewMode.Materials:
                    var addForm = new Add();
                    if (addForm.ShowDialog() == DialogResult.OK)
                    {
                        LoadMaterials();
                    }
                    break;

                case ViewMode.TypeProduction:
                    var addInfForm = new AddInf();
                    if (addInfForm.ShowDialog() == DialogResult.OK)
                    {
                        Information(); // перезагружаем данные
                    }
                    break;

            }
        }

        private void btnEdit_Click(object sender, EventArgs e) //РЕДАКТИРОВАНИЕ
        {
          
            if (dgvAll.SelectedRows.Count == 0)
            {
                MessageBox.Show("Выберите строку для редактирования.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            var selectedRow = dgvAll.SelectedRows[0];

            switch (currentMode)
            {
                case ViewMode.Materials:
                    if (selectedRow.Cells["idMaterials"].Value == null)
                    {
                        MessageBox.Show("Не удалось получить ID материала.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return;
                    }
                    int materialId = Convert.ToInt32(selectedRow.Cells["idMaterials"].Value);
                    var editForm = new Edit { MaterialId = materialId };
                    if (editForm.ShowDialog() == DialogResult.OK)
                    {
                        LoadMaterials();
                    }
                    break;

                case ViewMode.TypeProduction:
                    if (selectedRow.Cells["idTypeProduction"].Value == null)
                    {
                        MessageBox.Show("Не удалось получить ID записи.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return;
                    }
                    int typeId = Convert.ToInt32(selectedRow.Cells["idTypeProduction"].Value);
                    var editInfForm = new EditInf { TypeProductionId = typeId };
                    if (editInfForm.ShowDialog() == DialogResult.OK)
                    {
                        Information();
                    }
                    break;
            }

        }


        private void btnDelete_Click(object sender, EventArgs e) //УДАЛЕНИЕ
        {
          
            if (dgvAll.SelectedRows.Count == 0)
            {
                MessageBox.Show("Выберите строку для удаления.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            var selectedRow = dgvAll.SelectedRows[0];

            switch (currentMode)
            {
                case ViewMode.Materials:
                    if (selectedRow.Cells["idMaterials"].Value == null)
                    {
                        MessageBox.Show("Не удалось получить ID материала.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return;
                    }

                    int materialId = Convert.ToInt32(selectedRow.Cells["idMaterials"].Value);
                    string materialName = selectedRow.Cells["Name"]?.Value?.ToString() ?? "неизвестный";

                    var result = MessageBox.Show(
                        $"Вы уверены, что хотите удалить материал:\n\n«{materialName}»?\n\nЭто действие нельзя отменить.",
                        "Подтверждение удаления",
                        MessageBoxButtons.YesNo,
                        MessageBoxIcon.Warning
                    );

                    if (result == DialogResult.No)
                        return;

                    string deleteQuery = "DELETE FROM Materials WHERE idMaterials = @id";
                    var conn = DB.GetInstance().GetConnection();
                    if (conn.State == ConnectionState.Closed)
                        conn.Open();

                    using (var cmd = new MySqlCommand(deleteQuery, conn))
                    {
                        cmd.Parameters.AddWithValue("@id", materialId);
                        try
                        {
                            int rowsAffected = cmd.ExecuteNonQuery();
                            if (rowsAffected > 0)
                            {
                                MessageBox.Show("Материал успешно удалён!", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                LoadMaterials();
                            }
                            else
                            {
                                MessageBox.Show("Не удалось удалить материал. Возможно, он уже был удалён.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            }
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show($"Ошибка при удалении: {ex.Message}", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }
                    break;

                case ViewMode.TypeProduction:
                    if (selectedRow.Cells["idTypeProduction"].Value == null)
                    {
                        MessageBox.Show("Не удалось получить ID записи.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return;
                    }

                    int typeId = Convert.ToInt32(selectedRow.Cells["idTypeProduction"].Value);
                    string typeName = selectedRow.Cells["Name"]?.Value?.ToString() ?? "неизвестный";

                    var confirmResult = MessageBox.Show(
                        $"Вы уверены, что хотите удалить запись:\n\n«{typeName}»?",
                        "Подтверждение удаления",
                        MessageBoxButtons.YesNo,
                        MessageBoxIcon.Warning
                    );

                    if (confirmResult == DialogResult.No)
                        return;

                    string deleteTypeQuery = "DELETE FROM TypeProduction WHERE idTypeProduction = @id";
                    var typeConn = DB.GetInstance().GetConnection();
                    if (typeConn.State == ConnectionState.Closed)
                        typeConn.Open();

                    using (var cmd = new MySqlCommand(deleteTypeQuery, typeConn))
                    {
                        cmd.Parameters.AddWithValue("@id", typeId);
                        try
                        {
                            int rowsAffected = cmd.ExecuteNonQuery();
                            if (rowsAffected > 0)
                            {
                                MessageBox.Show("Запись успешно удалена!", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                Information(); // перезагружаем таблицу TypeProduction
                            }
                            else
                            {
                                MessageBox.Show("Запись не найдена или уже удалена.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                            }
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show($"Ошибка при удалении: {ex.Message}", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }
                    break;

                default:
                    MessageBox.Show("Удаление не поддерживается для текущего режима.", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    break;
            }
        }

        private void btnCalculate_Click(object sender, EventArgs e) //ЧЁТ СЧИТАЕТ
        {
            int output = CalculateProductOutput(
        productTypeId: 1,
        materialTypeId: 2,
        rawMaterialAmount: 1000,
        param1: 1.5,
        param2: 2.0
    );

            if (output == -1)
            {
                MessageBox.Show("Ошибка: неверные параметры или типы не найдены.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else
            {
                MessageBox.Show($"Можно произвести: {output} единиц продукции.", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void поставщикиToolStripMenuItem_Click(object sender, EventArgs e)  //ЗАГРУЗКА ПОСТАВЩИКОВ ЧЕРЕЗ МЕНЮ И СКРЫТИЕ КНОПОК 
        {
            if (isShowingSuppliers)
            {
                LoadMaterials();
                btnAdd.Visible = true;
                btnEdit.Visible = true;
                btnDelete.Visible = true;
            }
            else
            {
                LoadSuppliers();
                btnAdd.Visible = false;
                btnEdit.Visible = false;
                btnDelete.Visible = false;
            }
            isShowingSuppliers = !isShowingSuppliers;
        }

        private void материалыToolStripMenuItem_Click(object sender, EventArgs e)
        {
            LoadMaterials();
        }

        private void дополнительнаяИнформацияToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Information();
        }

       

        private void Information()
        {
            string query = "SELECT * FROM TypeProduction";
            var conn = DB.GetInstance().GetConnection();
            if (conn.State == ConnectionState.Closed)
                conn.Open();

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

            dgvAll.DataSource = dt;
            currentMode = ViewMode.TypeProduction;

            // Показываем кнопки для TypeProduction
            btnAdd.Visible = true;
            btnEdit.Visible = true;
            btnDelete.Visible = true;

            // Опционально: обновить заголовок формы
            this.Text = "Дополнительная информация — Типы продукции";
        }
    }
}
