using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Npgsql;

namespace WpfApp1.Views
{
    /// <summary>
    /// Логика взаимодействия для ProductsView.xaml
    /// </summary>
    public partial class ProductsView : UserControl
    {
        private readonly string _userRole;
        private const string ConnectionString = "Host=edu-pg.itiscaf.ru;Port=5432;Database=dbwork;Username=emelyanov_ia;Password=4&U4p#u#1M0";

        public ProductsView(string userRole)
        {
            InitializeComponent();

            _userRole = userRole;

            ConfigureAccess();
            LoadProducts();
        }

        private void LoadProducts()
        {
            try
            {
                using var connection = new NpgsqlConnection(ConnectionString);
                connection.Open();

                string sql = @"
                    SELECT
                        product_id,
                        product_name
                    FROM emelyanov_ia.products
                    ORDER BY product_id;
                ";

                using var adapter = new NpgsqlDataAdapter(sql, connection);

                DataTable table = new DataTable();
                adapter.Fill(table);

                ProductsDataGrid.ItemsSource = table.DefaultView;
            }
            catch (Exception ex)
            {
                MessageBox.Show(
                    "Ошибка загрузки изделий:\n" + ex.Message,
                    "Ошибка",
                    MessageBoxButton.OK,
                    MessageBoxImage.Error
                );
            }
        }


        private void ConfigureAccess()
        {
            if (_userRole == "user")
            {
                AddButton.IsEnabled = false;
                UpdateButton.IsEnabled = false;
                DeleteButton.IsEnabled = false;
            }
        }

        private void AddButton_Click(object sender, RoutedEventArgs e)
        {
            if (_userRole != "admin")
            {
                MessageBox.Show(
                    "У вас нет прав на добавление изделий.",
                    "Доступ запрещён",
                    MessageBoxButton.OK,
                    MessageBoxImage.Warning
                );
                return;
            }

            string productName = ProductNameTextBox.Text.Trim();

            if (string.IsNullOrWhiteSpace(productName))
            {
                MessageBox.Show(
                    "Введите наименование изделия.",
                    "Проверка данных",
                    MessageBoxButton.OK,
                    MessageBoxImage.Warning
                );
                return;
            }

            try
            {
                using var connection = new NpgsqlConnection(ConnectionString);
                connection.Open();

                string sql = @"
                    INSERT INTO emelyanov_ia.products (product_name)
                    VALUES (@product_name);
                ";

                using var command = new NpgsqlCommand(sql, connection);
                command.Parameters.AddWithValue("@product_name", productName);

                command.ExecuteNonQuery();

                MessageBox.Show(
                    "Изделие успешно добавлено.",
                    "Готово",
                    MessageBoxButton.OK,
                    MessageBoxImage.Information
                );

                ProductNameTextBox.Clear();
                LoadProducts();
            }
            catch (Exception ex)
            {
                MessageBox.Show(
                    "Ошибка добавления изделия:\n" + ex.Message,
                    "Ошибка",
                    MessageBoxButton.OK,
                    MessageBoxImage.Error
                );
            }
        }

        private void ProductsDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (ProductsDataGrid.SelectedItem == null)
                return;

            DataRowView row = ProductsDataGrid.SelectedItem as DataRowView;

            if (row == null)
                return;

            ProductIdTextBox.Text = row["product_id"].ToString();
            ProductNameTextBox.Text = row["product_name"].ToString();
        }

        private void UpdateButton_Click(object sender, RoutedEventArgs e)
        {
            if (_userRole != "admin")
            {
                MessageBox.Show(
                    "У вас нет прав на изменение изделий.",
                    "Доступ запрещён",
                    MessageBoxButton.OK,
                    MessageBoxImage.Warning
                );
                return;
            }

            if (string.IsNullOrWhiteSpace(ProductIdTextBox.Text))
            {
                MessageBox.Show(
                    "Выберите изделие для изменения.",
                    "Проверка данных",
                    MessageBoxButton.OK,
                    MessageBoxImage.Warning
                );
                return;
            }

            string productName = ProductNameTextBox.Text.Trim();

            if (string.IsNullOrWhiteSpace(productName))
            {
                MessageBox.Show(
                    "Введите наименование изделия.",
                    "Проверка данных",
                    MessageBoxButton.OK,
                    MessageBoxImage.Warning
                );
                return;
            }

            int productId = Convert.ToInt32(ProductIdTextBox.Text);

            try
            {
                using var connection = new NpgsqlConnection(ConnectionString);
                connection.Open();

                string sql = @"
                    UPDATE emelyanov_ia.products
                    SET product_name = @product_name
                    WHERE product_id = @product_id;
                ";

                using var command = new NpgsqlCommand(sql, connection);
                command.Parameters.AddWithValue("@product_id", productId);
                command.Parameters.AddWithValue("@product_name", productName);

                int affectedRows = command.ExecuteNonQuery();

                if (affectedRows == 0)
                {
                    MessageBox.Show(
                        "Изделие не найдено.",
                        "Ошибка",
                        MessageBoxButton.OK,
                        MessageBoxImage.Warning
                    );
                    return;
                }

                MessageBox.Show(
                    "Изделие успешно изменено.",
                    "Готово",
                    MessageBoxButton.OK,
                    MessageBoxImage.Information
                );

                LoadProducts();
                ClearProductFields();
            }
            catch (Exception ex)
            {
                MessageBox.Show(
                    "Ошибка изменения изделия:\n" + ex.Message,
                    "Ошибка",
                    MessageBoxButton.OK,
                    MessageBoxImage.Error
                );
            }
        }

        private void ClearProductFields()
        {
            ProductIdTextBox.Clear();
            ProductNameTextBox.Clear();
            ProductsDataGrid.SelectedItem = null;
        }

        private void DeleteButton_Click(object sender, RoutedEventArgs e)
        {
            if (_userRole != "admin")
            {
                MessageBox.Show(
                    "У вас нет прав на удаление изделий.",
                    "Доступ запрещён",
                    MessageBoxButton.OK,
                    MessageBoxImage.Warning
                );
                return;
            }

            if (string.IsNullOrWhiteSpace(ProductIdTextBox.Text))
            {
                MessageBox.Show(
                    "Выберите изделие для удаления.",
                    "Проверка данных",
                    MessageBoxButton.OK,
                    MessageBoxImage.Warning
                );
                return;
            }

            int productId = Convert.ToInt32(ProductIdTextBox.Text);
            string productName = ProductNameTextBox.Text.Trim();

            MessageBoxResult result = MessageBox.Show(
                $"Вы действительно хотите удалить изделие \"{productName}\"?",
                "Подтверждение удаления",
                MessageBoxButton.YesNo,
                MessageBoxImage.Question
            );

            if (result != MessageBoxResult.Yes)
                return;

            try
            {
                using var connection = new NpgsqlConnection(ConnectionString);
                connection.Open();

                string sql = @"
                    DELETE FROM emelyanov_ia.products
                    WHERE product_id = @product_id;
                ";

                using var command = new NpgsqlCommand(sql, connection);
                command.Parameters.AddWithValue("@product_id", productId);

                int affectedRows = command.ExecuteNonQuery();

                if (affectedRows == 0)
                {
                    MessageBox.Show(
                        "Изделие не найдено.",
                        "Ошибка",
                        MessageBoxButton.OK,
                        MessageBoxImage.Warning
                    );
                    return;
                }

                MessageBox.Show(
                    "Изделие успешно удалено.",
                    "Готово",
                    MessageBoxButton.OK,
                    MessageBoxImage.Information
                );

                LoadProducts();
                ClearProductFields();
            }
            catch (PostgresException ex) when (ex.SqlState == "23503")
            {
                MessageBox.Show(
                    "Нельзя удалить изделие, потому что оно используется в таблице деталей.\n\n" +
                    "Сначала удалите или измените связанные детали.",
                    "Ошибка удаления",
                    MessageBoxButton.OK,
                    MessageBoxImage.Warning
                );
            }
            catch (Exception ex)
            {
                MessageBox.Show(
                    "Ошибка удаления изделия:\n" + ex.Message,
                    "Ошибка",
                    MessageBoxButton.OK,
                    MessageBoxImage.Error
                );
            }
        }
    }
}
