using esoft.Class;
using esoft.Entities;
using System;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.Linq;
using System.Net.NetworkInformation;
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;

namespace esoft.Pages
{
    public partial class EditPriceCoefficient : Page
    {
        // Создаем экземпляр контекста данных
        ActualContext actualContext = new ActualContext();

        // Создаем список для хранения коэффициентов
        List<CoefficientFill> coefficientContext = new List<CoefficientFill>();
        private CoefficientFill selectedCoefficient;
        private ExecuterFill selectedExecuter;
        private bool isEditing = false;

        // Конструктор страницы для редактирования коэффициентов заработной платы
        public EditPriceCoefficient(ExecuterFill executer)
        {
            InitializeComponent();

            // Инициализируем выбранного исполнителя
            selectedExecuter = executer;

            // Проверяем, является ли редактирование (если ID менеджера не равен 0)
            if (selectedExecuter.ManagerID != 0)
            {
                isEditing = true;
            }

            // Заполняем форму данными
            FillForm();

            // Загружаем правила пользователя
            LoadUserRule(selectedExecuter);
        }

        // Метод для заполнения формы данными из базы данных
        private void FillForm()
        {
            // Получаем коэффициент по выбранному менеджеру
            selectedCoefficient = CoefficientFill.CoefficientFills(selectedExecuter.ManagerID);

            if (isEditing && selectedCoefficient != null)
            {
                try
                {
                    // Получаем всех пользователей, которых связывает ID
                    var usersManager = actualContext.Users.Where(user => actualContext.Manager
                        .Any(manager => selectedCoefficient.ID == user.ID)).ToList();

                    // Заполняем выпадающий список пользователями
                    cbManager.ItemsSource = UserInFIO.GroupUser(usersManager);

                    // Выбираем текущего пользователя
                    cbManager.SelectedItem = UserInFIO.SoloUser(usersManager
                        .FirstOrDefault(u => u.ID == selectedCoefficient.ID));

                    // Заполняем остальные поля формы
                    IUDJuniorMin.Value = selectedCoefficient.JuniorMinimum;
                    IUDMiddleMin.Value = selectedCoefficient.MiddleMinimum;
                    IUDSeniorMin.Value = selectedCoefficient.SeniorMinimum;
                    TBoxAnalysisCoefficient.Text = selectedCoefficient.AnalysisCoefficient.ToString();
                    TBoxInstallationCoefficient.Text = selectedCoefficient.InstallationCoefficient.ToString();
                    TBoxSupportCoefficient.Text = selectedCoefficient.SupportCoefficient.ToString();
                    TBoxTimeCoefficient.Text = selectedCoefficient.TimeCoefficient.ToString();
                    TBoxDifficultyCoefficient.Text = selectedCoefficient.DifficultyCoefficient.ToString();
                    TBoxToMoneyCoefficient.Text = selectedCoefficient.ToMoneyCoefficient.ToString();

                    // Определяем уровень исполнителя и устанавливаем соответствующую зарплату
                    if (selectedExecuter.Grade == "junior")
                    {
                        TBlockTotalSalary.Text = selectedCoefficient.JuniorMinimum.ToString();
                    }
                    else if (selectedExecuter.Grade == "middle")
                    {
                        TBlockTotalSalary.Text = selectedCoefficient.MiddleMinimum.ToString();
                    }
                    else if (selectedExecuter.Grade == "senior")
                    {
                        TBlockTotalSalary.Text = selectedCoefficient.SeniorMinimum.ToString();
                    }
                }
                catch (Exception ex)
                {
                    // Выводим сообщение об ошибке, если что-то пошло не так при заполнении формы
                    MessageBox.Show($"Ошибка при заполнении формы: {ex.Message}",
                                    "Ошибка",
                                    MessageBoxButton.OK,
                                    MessageBoxImage.Error);
                }
            }
        }

        // Метод для загрузки правил пользователя (менеджер или исполнитель)
        private void LoadUserRule(ExecuterFill selectedExecutor)
        {
            var currentUser = GetCurrent.CurrentUser;
            var isManager = actualContext.Manager.Any(manager => manager.ID == currentUser.ID);

            if (isManager)
            {
                // Если текущий пользователь - менеджер
                IUDJuniorMin.IsReadOnly = false;
                IUDMiddleMin.IsReadOnly = false;
                IUDSeniorMin.IsReadOnly = false;

                TBoxAnalysisCoefficient.IsReadOnly = false;
                TBoxInstallationCoefficient.IsReadOnly = false;
                TBoxSupportCoefficient.IsReadOnly = false;
                TBoxTimeCoefficient.IsReadOnly = false;
                TBoxDifficultyCoefficient.IsReadOnly = false;
                TBoxToMoneyCoefficient.IsReadOnly = false;

                cbManager.IsEnabled = true;

                BtnSaveSalaryCoeff.IsEnabled = true;
            }
            else
            {
                // Если текущий пользователь - исполнитель
                IUDJuniorMin.IsReadOnly = true;
                IUDMiddleMin.IsReadOnly = true;
                IUDSeniorMin.IsReadOnly = true;

                TBoxAnalysisCoefficient.IsReadOnly = true;
                TBoxInstallationCoefficient.IsReadOnly = true;
                TBoxSupportCoefficient.IsReadOnly = true;
                TBoxTimeCoefficient.IsReadOnly = true;
                TBoxDifficultyCoefficient.IsReadOnly = true;
                TBoxToMoneyCoefficient.IsReadOnly = true;

                cbManager.IsEnabled = false;

                BtnSaveSalaryCoeff.IsEnabled = false;
            }
        }

        // Обработчик события сохранения изменений в коэффициентах заработной платы
        private void BtnSaveSalaryCoeff_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                // Создаем экземпляр контекста данных
                ActualContext actualContext = new ActualContext();
                var context = esoftEntities.GetContext();

                // Получаем значения из элементов управления
                int juniorMinimum = (int)IUDJuniorMin.Value;
                int middleMinimum = (int)IUDMiddleMin.Value;
                int seniorMinimum = (int)IUDSeniorMin.Value;
                double analysisCoefficient = double.Parse(TBoxAnalysisCoefficient.Text);
                double installationCoefficient = double.Parse(TBoxInstallationCoefficient.Text);
                double supportCoefficient = double.Parse(TBoxSupportCoefficient.Text);
                double timeCoefficient = double.Parse(TBoxTimeCoefficient.Text);
                double difficultyCoefficient = double.Parse(TBoxDifficultyCoefficient.Text);
                double toMoneyCoefficient = double.Parse(TBoxToMoneyCoefficient.Text);

                // Находим существующий коэффициент в базе данных
                var existingCoefficient = context.Manager.FirstOrDefault(t => t.ID == selectedCoefficient.ID);

                // Присваиваем свойствам объекта значения из элементов управления
                existingCoefficient.JuniorMinimum = juniorMinimum;
                existingCoefficient.MiddleMinimum = middleMinimum;
                existingCoefficient.SeniorMinimum = seniorMinimum;
                existingCoefficient.AnalysisCoefficient = analysisCoefficient;
                existingCoefficient.InstallationCoefficient = installationCoefficient;
                existingCoefficient.SupportCoefficient = supportCoefficient;
                existingCoefficient.TimeCoefficient = timeCoefficient;
                existingCoefficient.DifficultyCoefficient = difficultyCoefficient;
                existingCoefficient.ToMoneyCoefficient = toMoneyCoefficient;

                // Сохраняем изменения в базе данных
                context.SaveChanges();

                // Выводим уведомление об успешном изменении коэффициентов
                MessageBoxResult result = MessageBox.Show("Коэффициенты успешно изменены!", "Успех", MessageBoxButton.OK, MessageBoxImage.Information);
                if (result == MessageBoxResult.OK)
                {
                    // Переходим на предыдущую страницу
                    NavigationService.GoBack();
                }
            }
            catch (Exception ex)
            {
                // Выводим сообщение об ошибке, если что-то пошло не так при сохранении данных
                MessageBox.Show($"Ошибка при сохранении данных: {ex.Message}", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
    }
}
