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 MySql.Data.MySqlClient;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.StartPanel;

namespace NeshinaPolina2111
{
    public partial class MainForm : Form
    {
        public enum ViewMode
        {
            Production,
            Materials
        }

        private ViewMode currentMode = ViewMode.Production;
        private int userRoleId; // 1=Работник, 2=Менеджер, 3=Партнёр  //ЭТО НОВОЕ 
        private Authorization authForm;
        private int partnerId;
        private DataTable originalProductionData; // для продукции поиск+
        private DataTable originalMaterialsData;  // для материалов поиск +
        public MainForm(int roleId, int partnerId, Authorization authForm)
        {
            InitializeComponent();
            this.userRoleId = roleId;
            this.authForm = authForm;
            this.partnerId = partnerId; 
            ApplyRolePermissions();
            UpdateControlVisibility(); 
            продукцияToolStripMenuItem_Click(null, EventArgs.Empty);
            SetupProductionFiltersAndSorts(); //КОМБОБОКСЫ

        }

        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)  //ЭТО ЧТОБ ПРИ ЗАКРЫТИИ АВТОРИЗАЦИЯ ВОЗВРАЩАЛАСЬ
        {
            e.Cancel = true;      
            this.Hide();           
            authForm.Show();      
        }

        private void ApplyRolePermissions() //ЭТО ОБРАБОТЧИК КНОПОК ПОКАЗА
        {
           
            btnAdd.Visible = true;
            btnEdit.Visible = true;
            btnDelete.Visible = true;

         
            switch (userRoleId)
            {
                case 1: //РАБОТНИК НИЧЕ НЕ МОЖЕТ ДЕЛАТЬ
                    btnAdd.Visible = false;
                    btnEdit.Visible = false;
                    btnDelete.Visible = false;
                    btnMyDiscounts.Visible = false;
                    btnCalculator.Visible = false;
                    txtSearch.Visible = false;
                    label4.Visible = false;
                    //cmbFilter.Visible = false;
                    //cmbSort.Visible = false;
                    //label5.Visible = false;
                    //label6.Visible = false;
                    //txtSearch.Visible = false;
                    this.Text = "Главная форма — Работник";
                    break;

                case 2: //МЕНЕДЖЕР МОЖЕТ ВСЁ ДЕЛАТЬ С ИНФОЙ, НО НЕ РАСЧЁТ СКИДОК
                    btnMyDiscounts.Visible = false;
                    this.Text = "Главная форма — Менеджер";
                    break;

                case 3: //ПАРТНЁР МОЖЕТ ТОЛЬКО СКИДКУ ДЕЛАТЬ
                    btnAdd.Visible = false;
                    btnEdit.Visible = false;
                    btnDelete.Visible = false;
                    btnMyDiscounts.Visible = true;
                    btnCalculator.Visible = false;
                    txtSearch.Visible = false;
                    label4.Visible = false;
                    //cmbFilter.Visible = false;
                    //cmbSort.Visible = false;
                    //label5.Visible = false;
                    //label6.Visible = false;
                    //txtSearch.Visible = false; 
                    this.Text = "Главная форма — Партнёр";
                    break;

                case 4: //ВСЁ МОЖНО РАЗРАБУ
                    this.Text = "Главная форма — Разработчик";
                    break;

                default:
                    MessageBox.Show("Неизвестная роль. Доступ ограничен.");
                    btnAdd.Visible = false;
                    btnEdit.Visible = false;
                    btnDelete.Visible = false;
                    break;
            }
        }

        private void LoadProduction() //ЗАГРУЗКА ПРОДУКЦИИ + ПОИСК ЧАТЬ
        {
            string query = @"
        SELECT
            p.idProducts_import,
            t.TypeProduction,
            p.Name,
            p.Article,
            p.Width,
            p.MinPrice,
            COALESCE(
                (SELECT SUM(m.PriceUnitMaterial * pc.Quantity)
                 FROM Product_composition pc
                 JOIN Materials_import m ON pc.idMaterials_import = m.idMaterials_import
                 WHERE pc.idProducts_import = p.idProducts_import), 
                0
            ) AS CalculatedCost
        FROM Products_import p
        LEFT JOIN Product_type_import t ON p.idProduct_type_import = t.idProduct_type_import";

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

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

            dgvMain.DataSource = originalProductionData;
            currentMode = ViewMode.Production;
            UpdateControlVisibility(); // ← вызываем здесь
            // показываем элементы для продукции
            //txtSearch.Visible = true;
            //cmbFilter.Visible = true;
            //cmbSort.Visible = true;
            originalProductionData.Columns.Add("SearchName", typeof(string), "CONVERT(Name, 'System.String')");
            originalProductionData.Columns.Add("SearchArticle", typeof(string), "CONVERT(Article, 'System.String')");
            originalProductionData.Columns.Add("SearchType", typeof(string), "CONVERT(TypeProduction, 'System.String')");
            originalProductionData.Columns.Add("SearchWidth", typeof(string), "CONVERT(Width, 'System.String')");
            originalProductionData.Columns.Add("SearchMinPrice", typeof(string), "CONVERT(MinPrice, 'System.String')");
            originalProductionData.Columns.Add("SearchCalculatedCost", typeof(string), "CONVERT(CalculatedCost, 'System.String')");

            dgvMain.DataSource = originalProductionData; //СКРОПЙ ВЕРХНИЕ ПОЛЧЯ
            foreach (DataGridViewColumn col in dgvMain.Columns)
            {
                if (col.Name.StartsWith("Search"))
                    col.Visible = false;
            }
            ApplySearchFilter();
        }


        private void LoadMaterials() //ЗАГРУЗКА МАТЕРИАЛОВ + ПОИСК ЧАТЬ
        {
            string query = @"
        SELECT
            m.idMaterials_import AS Id,
            m.Name,
            t.Name AS TypeName,
            m.PriceUnitMaterial,
            m.Quantity,
            m.MinQuantity,
            m.QuantityPack,
            u.Name AS UnitName
        FROM Materials_import m
        LEFT JOIN Material_type_import t ON m.idMaterial_type_import = t.idMaterial_type_import
        LEFT JOIN Unit u ON m.idUnit = u.idUnit";

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

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

            dgvMain.DataSource = originalMaterialsData;
            currentMode = ViewMode.Materials;
            UpdateControlVisibility(); // ← вызываем здесь

            //txtSearch.Visible = true;
            //cmbFilter.Visible = false;
            //cmbSort.Visible = false;
            //label5.Visible = false;
            //label6.Visible = false;
            //ПОЛЯ ДЛЯ ПОИСК КРЧ
            originalMaterialsData.Columns.Add("SearchName", typeof(string), "CONVERT(Name, 'System.String')");
            originalMaterialsData.Columns.Add("SearchTypeName", typeof(string), "CONVERT(TypeName, 'System.String')");
            originalMaterialsData.Columns.Add("SearchPrice", typeof(string), "CONVERT(PriceUnitMaterial, 'System.String')");
            originalMaterialsData.Columns.Add("SearchQuantity", typeof(string), "CONVERT(Quantity, 'System.String')");
            originalMaterialsData.Columns.Add("SearchMinQuantity", typeof(string), "CONVERT(MinQuantity, 'System.String')");
            originalMaterialsData.Columns.Add("SearchQuantityPack", typeof(string), "CONVERT(QuantityPack, 'System.String')");
            originalMaterialsData.Columns.Add("SearchUnitName", typeof(string), "CONVERT(UnitName, 'System.String')");

            dgvMain.DataSource = originalMaterialsData;
            foreach (DataGridViewColumn col in dgvMain.Columns)
            {
                if (col.Name.StartsWith("Search"))
                    col.Visible = false;
            }

            ApplySearchFilter();
        }

        private void ApplySearchFilter() //ПОИСК ПО ВСМЕУ КРТ
        {
            string search = txtSearch.Text.Trim();

            if (currentMode == ViewMode.Production)
            {
                string baseFilter = "";
                switch (cmbFilter.SelectedIndex)
                {
                    case 0: baseFilter = ""; break;
                    case 1: baseFilter = "CalculatedCost > 1000"; break;
                    case 2: baseFilter = "CalculatedCost < 500"; break;
                    case 3: baseFilter = "MinPrice < CalculatedCost"; break;
                    case 4: baseFilter = "Width > 10"; break;
                }
                if (!string.IsNullOrEmpty(search))
                {
                    search = search.Replace("'", "''");
                    string searchFilter = $"SearchName LIKE '%{search}%' OR " +
                                      $"SearchArticle LIKE '%{search}%' OR " +
                                  $"SearchType LIKE '%{search}%' OR " +
                                     $"SearchWidth LIKE '%{search}%' OR " +
                                $"SearchMinPrice LIKE '%{search}%' OR " +
                                       $"SearchCalculatedCost LIKE '%{search}%'";

                    if (!string.IsNullOrEmpty(baseFilter))
                        baseFilter = $"({baseFilter}) AND ({searchFilter})";
                    else
                        baseFilter = searchFilter;
                }
                string sort = "";
                switch (cmbSort.SelectedIndex)
                {
                    case 0: sort = "Name ASC"; break;
                    case 1: sort = "Name DESC"; break;
                    case 2: sort = "CalculatedCost ASC"; break;
                    case 3: sort = "CalculatedCost DESC"; break;
                    case 4: sort = "Article ASC"; break;
                }
                try
                {
                    DataView view = originalProductionData.DefaultView;
                    view.RowFilter = baseFilter;
                    view.Sort = sort;
                    dgvMain.DataSource = view;
                }
                catch (Exception ex)
                {
                    MessageBox.Show($"Ошибка фильтрации продукции: {ex.Message}", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
            }
            else if (currentMode == ViewMode.Materials)
            {
                string filter = "";
                if (!string.IsNullOrEmpty(search))
                {
                    search = search.Replace("'", "''");
                    filter = $"SearchName LIKE '%{search}%' OR " +
                              $"SearchTypeName LIKE '%{search}%' OR " +
                              $"SearchPrice LIKE '%{search}%' OR " +
                                 $"SearchQuantity LIKE '%{search}%' OR " +
                               $"SearchMinQuantity LIKE '%{search}%' OR " +
                                 $"SearchQuantityPack LIKE '%{search}%' OR " +
                             $"SearchUnitName LIKE '%{search}%'";
                }

                try
                {
                    DataView view = originalMaterialsData.DefaultView;
                    view.RowFilter = filter;
                    dgvMain.DataSource = view;
                }
                catch (Exception ex)
                {
                    MessageBox.Show($"Ошибка поиска материалов: {ex.Message}", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
            }
        }


        private void btnAdd_Click(object sender, EventArgs e)  //ДОБАВИИТЬ
        {
            switch (currentMode)  //СМОТРЯ Чё ОТКРЫТО, ТО ОТКРЫВАТЕСЯЧ
            {
                case ViewMode.Production:
                    var addProd = new AddProduction();
                    if (addProd.ShowDialog() == DialogResult.OK)
                    {
                        LoadProduction();
                    }
                    break;

                case ViewMode.Materials:
                    var addMat = new AddMaterials();
                    if (addMat.ShowDialog() == DialogResult.OK)
                    {
                        LoadMaterials();
                    }
                    break;
            }
        }

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

            var selectedRow = dgvMain.SelectedRows[0];
            object idValue = null;

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

                    int prodId = Convert.ToInt32(idValue);
                    var editProd = new EditProduction { ProductId = prodId };
                    if (editProd.ShowDialog() == DialogResult.OK)
                    {
                        LoadProduction();
                    }
                    break;

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

                    int matId = Convert.ToInt32(idValue);
                    var editMat = new EditMaterials { MaterialId = matId };
                    if (editMat.ShowDialog() == DialogResult.OK)
                    {
                        LoadMaterials();
                    }
                    break;
            }
        }

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

            var selectedRow = dgvMain.SelectedRows[0];
            object idValue = null;
            string itemName = "неизвестный";

            switch (currentMode)
            {
                case ViewMode.Production:
                    idValue = selectedRow.Cells["idProducts_import"]?.Value;
                    itemName = selectedRow.Cells["Name"]?.Value?.ToString() ?? "неизвестный";
                    if (idValue == null)
                    {
                        MessageBox.Show("Не удалось получить ID продукта.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return;
                    }

                    ConfirmAndDelete("Products_import", "idProducts_import", Convert.ToInt32(idValue), itemName);
                    LoadProduction();
                    break;

                case ViewMode.Materials:
                    idValue = selectedRow.Cells["Id"]?.Value; //УДАЛЕНИЕ ПО АЙДИШНИКУ
                    itemName = selectedRow.Cells["Name"]?.Value?.ToString() ?? "неизвестный";
                    if (idValue == null)
                    {
                        MessageBox.Show("Не удалось получить ID материала.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return;
                    }

                    ConfirmAndDelete("Materials_import", "idMaterials_import", Convert.ToInt32(idValue), itemName);
                    LoadMaterials();
                    break;
            }
        }

        private void ConfirmAndDelete(string tableName, string idColumnName, int id, string itemName) //УДАЛЕНИЕ НАДО
        {
            var result = MessageBox.Show(
                $"Вы уверены, что хотите удалить:\n\n«{itemName}»?\n\nЭто действие нельзя отменить.",
                "Подтверждение удаления",
                MessageBoxButtons.YesNo,
                MessageBoxIcon.Warning
            );

            if (result == DialogResult.No) return;

            string query = $"DELETE FROM {tableName} WHERE {idColumnName} = @id";
            var conn = DB.GetInstance().GetConnection();
            if (conn.State == ConnectionState.Closed)
                conn.Open();

            using (var cmd = new MySqlCommand(query, conn))
            {
                cmd.Parameters.AddWithValue("@id", id);
                try
                {
                    int rowsAffected = cmd.ExecuteNonQuery();
                    if (rowsAffected > 0)
                    {
                        MessageBox.Show("Запись успешно удалена!", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    else
                    {
                        MessageBox.Show("Не удалось удалить запись.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show($"Ошибка при удалении: {ex.Message}", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }
        private void продукцияToolStripMenuItem_Click(object sender, EventArgs e)
        {
            LoadProduction();
            
        }

        private void списокМатериаловToolStripMenuItem_Click(object sender, EventArgs e)
        {
            LoadMaterials();
            
        }

        private void button1_Click(object sender, EventArgs e) //КАЛЬКУЛЯТОР
        {
            var form = new MaterialPurchaseCalculatorForm();
            form.ShowDialog(); 
        }

        private void btnMyDiscounts_Click(object sender, EventArgs e) //ЭТО НА ФОРМУ СО СКИДКАМИ
        {
            
            PartnerDiscountsForm partnerDiscountsForm = new PartnerDiscountsForm(partnerId);
            partnerDiscountsForm.ShowDialog();
            MessageBox.Show($"Текущий partnerId: {partnerId}");

        }

        private void txtSearch_TextChanged(object sender, EventArgs e)
        {
            ApplySearchFilter();
        }

        private void SetupProductionFiltersAndSorts() //СОРТ, ФИЛЬТР
        {
            // ФИЛЬТРАЦИЯ
            cmbFilter.Items.Clear();
            cmbFilter.Items.Add("Все");
            cmbFilter.Items.Add("Себестоимость > 1000 ₽");
            cmbFilter.Items.Add("Себестоимость < 500 ₽");
            cmbFilter.Items.Add("С минимальной ценой < себестоимости");
            cmbFilter.Items.Add("Ширина > 10");
            //СОРТИРОЧКА
            cmbSort.Items.Clear();
            cmbSort.Items.Add("По названию (А→Я)");
            cmbSort.Items.Add("По названию (Я→А)");
            cmbSort.Items.Add("По себестоимости (возр.)");
            cmbSort.Items.Add("По себестоимости (убыв.)");
            cmbSort.Items.Add("По артикулу");

            cmbFilter.SelectedIndex = 0;
            cmbSort.SelectedIndex = 0;
        }

        private void ApplyProductionFilterAndSort() //СОРТИРОВКА, ФИЛТРАЦИЯ
        {
            if (currentMode != ViewMode.Production || originalProductionData == null)
                return;

            string filter = "";
            string sort = "";

            switch (cmbFilter.SelectedIndex)
            {
                case 0: 
                    filter = "";
                    break;
                case 1: 
                    filter = "CalculatedCost > 1000";
                    break;
                case 2: 
                    filter = "CalculatedCost < 500";
                    break;
                case 3: 
                    filter = "MinPrice < CalculatedCost";
                    break;
                case 4: 
                    filter = "Width > 10";
                    break;
            }

            switch (cmbSort.SelectedIndex)
            {
                case 0: sort = "Name ASC"; break;
                case 1: sort = "Name DESC"; break;
                case 2: sort = "CalculatedCost ASC"; break;
                case 3: sort = "CalculatedCost DESC"; break;
                case 4: sort = "Article ASC"; break;
            }

            try
            {
                DataView view = originalProductionData.DefaultView;
                view.RowFilter = filter;
                view.Sort = sort;
                dgvMain.DataSource = view;
            }
            catch (Exception ex)
            {
                MessageBox.Show($"Ошибка применения фильтра/сортировки: {ex.Message}", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

        private void cmbSort_SelectedIndexChanged(object sender, EventArgs e)
        {
            ApplyProductionFilterAndSort();
        }

        private void cmbFilter_SelectedIndexChanged(object sender, EventArgs e)
        {
            ApplyProductionFilterAndSort();

        }

        private void UpdateControlVisibility() //СКРЫТИЕ КНОПОК ПРЯМ МНОГО СКРЫВАТЬ
        {
            
                bool isDeveloper = (userRoleId == 4);   // РАЗРАБ ВСЁ ВИДИТ
                bool isManager = (userRoleId == 2);     // МЕНЕДЖЕР +- ЧЁТ ВИДИТ
                bool isWorkerOrPartner = (userRoleId == 1 || userRoleId == 3); // РАБОТЯГА И ПАРТНЁРЫ +- НИЧЕГО НЕ ВИДЯТ

                bool isProduction = (currentMode == ViewMode.Production);
                bool isMaterials = (currentMode == ViewMode.Materials);

                if (isDeveloper)
                {
                    txtSearch.Visible = true; 
                }
                else if (isManager)
                {
                    txtSearch.Visible = isProduction || isMaterials;
                }
                else
                {
                    txtSearch.Visible = false; 
                }
                if (isDeveloper)
                {
                    cmbFilter.Visible = isProduction;
                    cmbSort.Visible = isProduction;
                }
                else if (isManager)
                {
                    cmbFilter.Visible = isProduction;
                    cmbSort.Visible = isProduction;
                }
                else
                {
                    cmbFilter.Visible = false;
                    cmbSort.Visible = false;
                }
                label5.Visible = isDeveloper;
                label6.Visible = isDeveloper;
            
        }
    }
}