using esoft.Class;
using System;
using System.Collections.Generic;
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.Forms.DataVisualization.Charting;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Excel = Microsoft.Office.Interop.Excel;
using Word = Microsoft.Office.Interop.Word;

namespace esoft.Pages
{
    public partial class Diagram : Page
    {
        // Список уровней исполнителей
        List<string> listLvl = new List<string>
        {
                "junior",
                "middle",
                "senior"
        };

        public Diagram()
        {
            InitializeComponent();
            chartDiagram.ChartAreas.Add(new ChartArea("Основная Область"));

            // Инициализация серии для диаграммы
            var currentSeries = new Series("Исполнители")
            {
                IsValueShownAsLabel = true
            };
            chartDiagram.Series.Add(currentSeries);

            // Установка источника данных для комбо-боксов
            cmbExecuter.ItemsSource = listLvl;
            cmbType.ItemsSource = Enum.GetValues(typeof(SeriesChartType));
        }

        private void BtnClear_Click(object sender, RoutedEventArgs e)
        {
            cmbExecuter.SelectedIndex = -1;
        }

        private void btnExportToExcel_Click(object sender, RoutedEventArgs e)
        {
            // Получение списка всех задач и списка исполнителей
            var allTask = TaskFill.TaskFills();
            var executer = ExecuterFill.Fill();

            // Создание экземпляра приложения Excel
            var application = new Excel.Application();
            application.SheetsInNewWorkbook = executer.Count();

            Excel.Workbook wb = application.Workbooks.Add(Type.Missing);

            // Создание листов Excel для каждого исполнителя
            for (int i = 0; i < executer.Count; i++)
            {
                int startRowIndex = 1;

                Excel.Worksheet worksheet = application.Worksheets.Item[i + 1];
                worksheet.Name = executer[i].FioUser;

                // Заполнение заголовков таблицы
                worksheet.Cells[1][startRowIndex] = "Дата создания";
                worksheet.Cells[2][startRowIndex] = "Менеджер";
                worksheet.Cells[3][startRowIndex] = "Статус задачи";
                worksheet.Cells[4][startRowIndex] = "Тип работы";
                worksheet.Cells[5][startRowIndex] = "Срок даты окончания";
                worksheet.Cells[6][startRowIndex] = "Время на выполнение";
                worksheet.Cells[7][startRowIndex] = "Время на выполнение в часах";
                worksheet.Cells[8][startRowIndex] = "Сложность";

                startRowIndex++;

                // Заполнение данными каждой задачи
                foreach (var titleTask in allTask.Where(x => x.FioUser == executer[i].FioUser))
                {
                    // Заполнение заголовка задачи
                    Excel.Range headerRange = worksheet.Range[worksheet.Cells[1][startRowIndex], worksheet.Cells[8][startRowIndex]];
                    headerRange.Merge();
                    headerRange.Value = titleTask.Title;
                    headerRange.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
                    headerRange.Font.Italic = true;

                    startRowIndex++;

                    // Заполнение основных данных задачи
                    foreach (var mainDateTask in allTask.Where(x => x.FioUser == executer[i].FioUser))
                    {
                        worksheet.Cells[1][startRowIndex] = mainDateTask.CreateDateTime.ToString("dd.MM.yyyy HH:mm");
                        worksheet.Cells[2][startRowIndex] = mainDateTask.FioManager;
                        worksheet.Cells[3][startRowIndex] = mainDateTask.Status;
                        worksheet.Cells[4][startRowIndex] = mainDateTask.WorkType;
                        worksheet.Cells[5][startRowIndex] = mainDateTask.Deadline.ToString("dd.MM.yyyy HH:mm");
                        worksheet.Cells[6][startRowIndex] = mainDateTask.Time;

                        worksheet.Cells[7][startRowIndex].Formula = $"=F{startRowIndex}/60";

                        worksheet.Cells[8][startRowIndex] = mainDateTask.Difficulty;
                        worksheet.Cells[8][startRowIndex].NumberFormat = "0";

                        startRowIndex++;
                    }
                }

                // Вычисление итогового количества задач
                Excel.Range cauntTask = worksheet.Range[worksheet.Cells[1][startRowIndex], worksheet.Cells[7][startRowIndex]];
                cauntTask.Merge();
                cauntTask.Value = "Итоговое количество задач:";
                cauntTask.HorizontalAlignment = Excel.XlHAlign.xlHAlignRight;

                worksheet.Cells[8][startRowIndex] = allTask.Where(x => x.ExecutorID == executer[i].ID).ToList().Count();

                startRowIndex++;

                // Установка границ таблицы
                Excel.Range rangBorder = worksheet.Range[worksheet.Cells[1][1], worksheet.Cells[8][startRowIndex - 1]];
                rangBorder.Borders[Excel.XlBordersIndex.xlEdgeBottom].LineStyle =
                    rangBorder.Borders[Excel.XlBordersIndex.xlEdgeLeft].LineStyle =
                    rangBorder.Borders[Excel.XlBordersIndex.xlEdgeRight].LineStyle =
                    rangBorder.Borders[Excel.XlBordersIndex.xlEdgeTop].LineStyle =
                    rangBorder.Borders[Excel.XlBordersIndex.xlInsideVertical].LineStyle =
                    rangBorder.Borders[Excel.XlBordersIndex.xlInsideHorizontal].LineStyle = Excel.XlLineStyle.xlContinuous;

                worksheet.Columns.AutoFit();
            }
            application.Visible = true;
        }

        private void btnExportToWord_Click(object sender, RoutedEventArgs e)
        {
            // Получение списка всех задач и списка исполнителей
            var allTask = TaskFill.TaskFills();
            var allExecuters = ExecuterFill.Fill();

            // Создание экземпляра приложения Word
            var application = new Word.Application();
            Word.Document document = application.Documents.Add();

            // Для каждого исполнителя создается свой раздел в документе Word
            foreach (var ex in allExecuters)
            {
                // Добавление заголовка раздела с именем исполнителя
                Word.Paragraph executerParagraph = document.Paragraphs.Add();
                Word.Range executerRange = executerParagraph.Range;
                executerRange.Text = ex.FioUser;
                executerParagraph.set_Style("Заголовок");
                executerRange.InsertParagraphAfter();

                // Получение списка задач для текущего исполнителя
                List<TaskFill> executerTasks = allTask.Where(x => x.ExecutorID == ex.ID).ToList();
                if (executerTasks.Count == 0)
                    continue;

                // Создание таблицы для отображения задач текущего исполнителя
                Word.Paragraph tableParagraph = document.Paragraphs.Add();
                Word.Range tableRange = tableParagraph.Range;
                Word.Table tasksTable = document.Tables.Add(tableRange,
                    executerTasks.Count(), 3);
                tasksTable.Borders.InsideLineStyle = tasksTable.Borders.OutsideLineStyle
                    = Word.WdLineStyle.wdLineStyleSingle;
                tasksTable.Range.Cells.VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter;

                Word.Range cellRange;

                // Добавление заголовков столбцов таблицы
                cellRange = tasksTable.Cell(1, 1).Range;
                cellRange.Text = "Название задачи";
                cellRange = tasksTable.Cell(1, 2).Range;
                cellRange.Text = "Крайняя дата задачи";
                cellRange = tasksTable.Cell(1, 3).Range;
                cellRange.Text = "Статус";

                tasksTable.Rows[1].Range.Bold = 1;
                tasksTable.Rows[1].Range.Paragraphs.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter;

                // Заполнение таблицы данными о задачах
                for (int i = 1; i < executerTasks.Count(); i++)
                {
                    cellRange = tasksTable.Cell(i + 2, 1).Range;
                    cellRange.Text = executerTasks[i].Title;

                    cellRange = tasksTable.Cell(i + 2, 2).Range;
                    cellRange.Text = executerTasks[i].Deadline.ToString();

                    cellRange = tasksTable.Cell(i + 2, 3).Range;
                    cellRange.Text = executerTasks[i].Status;
                }

                // Проверка просроченных и оставшихся задач
                List<TaskFill> timeOutTask = executerTasks.Where(x => x.Deadline < DateTime.Now).ToList();
                if (timeOutTask.Count > 0)
                {
                    // Добавление информации о просроченных задачах
                    foreach (TaskFill task in timeOutTask)
                    {
                        Word.Paragraph timeOutParagraph = document.Paragraphs.Add();
                        Word.Range timeOutRange = timeOutParagraph.Range;
                        timeOutRange.Text = $"Задача {task.Title} просрочена на {(DateTime.Now - task.Deadline).TotalDays} дней";
                        timeOutParagraph.set_Style("Подзаголовок");
                        timeOutRange.Font.Color = Word.WdColor.wdColorRed;
                        timeOutRange.InsertParagraphAfter();
                    }
                }

                // Проверка непросроченных задач
                List<TaskFill> noTimeOutTask = executerTasks.Where(x => x.Deadline >= DateTime.Now).ToList();
                if (noTimeOutTask.Count > 0)
                {
                    // Добавление информации о непросроченных задачах
                    foreach (TaskFill task in noTimeOutTask)
                    {
                        Word.Paragraph timeOutParagraph = document.Paragraphs.Add();
                        Word.Range timeOutRange = timeOutParagraph.Range;
                        timeOutRange.Text = $"На выполнение задачи {task.Title} осталось {(task.Deadline - DateTime.Now).TotalHours} часов";
                        timeOutParagraph.set_Style("Intense Quote");
                        timeOutRange.Font.Color = Word.WdColor.wdColorGreen;
                        timeOutRange.InsertParagraphAfter();
                    }
                }

                // Добавление разрыва страницы между разделами для каждого исполнителя
                if (ex != allExecuters.LastOrDefault())
                    document.Words.Last.InsertBreak(Word.WdBreakType.wdPageBreak);
            }
            // Отображение приложения Word
            application.Visible = true;
        }


        private void UpdateChar(object sender, SelectionChangedEventArgs e)
        {
            // Проверка выбранного элемента в комбо-боксах cmbExecuter и cmbType
            if (cmbExecuter.SelectedItem is string grade && cmbType.SelectedItem is SeriesChartType chartType)
            {
                // Получение текущей серии диаграммы
                Series currentSeries = chartDiagram.Series.FirstOrDefault();

                // Установка типа диаграммы
                currentSeries.ChartType = chartType;

                // Очистка точек текущей серии
                currentSeries.Points.Clear();

                // Получение списка исполнителей
                var categoryList = ExecuterFill.Fill();

                // Добавление точки на диаграмму для выбранного уровня исполнителя
                currentSeries.Points.AddXY(grade, categoryList.Where(x => x.Grade == grade).Count());
            }

            // Если выбран только тип диаграммы
            else if (cmbType.SelectedItem is SeriesChartType chartTypeTwo)
            {
                // Получение текущей серии диаграммы
                Series currentSeries = chartDiagram.Series.FirstOrDefault();

                // Установка типа диаграммы
                currentSeries.ChartType = chartTypeTwo;

                // Очистка точек текущей серии
                currentSeries.Points.Clear();

                // Получение списка исполнителей
                var categoryList = ExecuterFill.Fill();

                // Добавление точек на диаграмму для всех уровней исполнителей
                foreach (var category in listLvl)
                {
                    currentSeries.Points.AddXY(category, categoryList.Where(x => x.Grade == category).Count());
                }
            }
        }

    }
}