using Contracts.BindingModels;
using Contracts.BusinessLogicContracts;
using DataModels.Enums;
using DataModels.Models;
using Microsoft.EntityFrameworkCore.Diagnostics;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Printing;
using System.Linq;
using System.Reflection.Metadata;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WinFormsApp
{
    public partial class FormMain : Form
    {
        private readonly ILogger _logger;
        private readonly ISupplyLogic _supplyLogic;
        private readonly IProductLogic _productLogic;
        private readonly ISupplierLogic _supplierLogic;
        private readonly IReportLogic _reportLogic;
        public FormMain(ILogger<FormMain> logger, ISupplierLogic supplierLogic, ISupplyLogic supplyLogic, IProductLogic productLogic, IReportLogic reportLogic)
        {
            InitializeComponent();
            _supplierLogic = supplierLogic;
            _supplyLogic = supplyLogic;
            _productLogic = productLogic;
            _logger = logger;
            _reportLogic = reportLogic;
        }

        private void FormMain_Load(object sender, EventArgs e)
        {
            LoadData();
        }

        private void LoadData()
        {
            _logger.LogInformation("Загрузка поставок");
            try
            {
                var list = _supplyLogic.ReadList(null);
                if (list != null)
                {
                    dataGridView.DataSource = list;
                    dataGridView.Columns["SupplierId"].Visible = false;
                    dataGridView.Columns["Products"].Visible = false;
                }
                _logger.LogInformation("Загрузка поставок");
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Ошибка загрузки поставок");
                MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        private void товарыToolStripMenuItem_Click_1(object sender, EventArgs e)
        {
            var service = Program.ServiceProvider?.GetService(typeof(FormProducts));
            if (service is FormProducts form)
            {
                form.ShowDialog();
            }
        }

        private void поставщикиToolStripMenuItem_Click_1(object sender, EventArgs e)
        {
            var service = Program.ServiceProvider?.GetService(typeof(FormSuppliers));
            if (service is FormSuppliers form)
            {
                form.ShowDialog();
            }
        }

        private void buttonCreateSupply_Click(object sender, EventArgs e)
        {
            var service = Program.ServiceProvider?.GetService(typeof(FormSupply));
            if (service is FormSupply form)
            {
                form.ShowDialog();
            }
        }

        private void buttonSupplyStatusArriving_Click(object sender, EventArgs e)
        {
            if (dataGridView.SelectedRows.Count == 1)
            {
                Guid id = (Guid)dataGridView.SelectedRows[0].Cells["Id"].Value;
                _logger.LogInformation("Поставка No{id}. Меняется статус", id);
                try
                {
                    var operationResult = _supplyLogic.StatusUpdate(new SupplyBindingModel
                    {
                        Id = id,
                        Status = (SupplyStatus)dataGridView.SelectedRows[0].Cells["Status"].Value
                    }, SupplyStatus.Arriving);
                    if (!operationResult)
                    {
                        throw new Exception("Ошибка при сохранении. Дополнительная информация в логах.");
                    }
                    LoadData();
                }
                catch (Exception ex)
                {
                    _logger.LogError(ex, "Ошибка передачи заказа в работу");
                    MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK,
                    MessageBoxIcon.Error);
                }
            }
        }

        private void buttonSupplyStatusCompleted_Click(object sender, EventArgs e)
        {
            if (dataGridView.SelectedRows.Count == 1)
            {
                Guid id = (Guid)dataGridView.SelectedRows[0].Cells["Id"].Value;
                _logger.LogInformation("Поставка No{id}. Меняется статус", id);
                try
                {
                    var operationResult = _supplyLogic.StatusUpdate(new SupplyBindingModel
                    {
                        Id = id,
                        Status = (SupplyStatus)dataGridView.SelectedRows[0].Cells["Status"].Value,
                        DateArriving = (DateTime?)dataGridView.SelectedRows[0].Cells["DateArriving"].Value,
                        DateComplete = (DateTime?)dataGridView.SelectedRows[0].Cells["DateComplete"].Value,
                    }, SupplyStatus.Completed);
                    if (!operationResult)
                    {
                        throw new Exception("Ошибка при сохранении. Дополнительная информация в логах.");
                    }
                    LoadData();
                }
                catch (Exception ex)
                {
                    _logger.LogError(ex, "Ошибка передачи заказа в работу");
                    MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK,
                    MessageBoxIcon.Error);
                }
            }
        }

        private void buttonCreateReport_Click(object sender, EventArgs e)
        {
            if (dataGridView.SelectedRows.Count != 1)
            {
                MessageBox.Show("Выберите одну поставку для формирования отчета", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            try
            {
                _reportLogic.SaveSuppliesToPdfFile(new ReportBindingModel
                {
                    FileName = $"supplyreport{dataGridView.SelectedRows[0].Cells["Id"].Value}.pdf",
                    Date = (DateTime)dataGridView.SelectedRows[0].Cells["Date"].Value,
                    SupplyId = (Guid)dataGridView.SelectedRows[0].Cells["Id"].Value
                });
                _logger.LogInformation("Сохранение отчета о поставке");
                MessageBox.Show("Выполнено", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Ошибка сохранения отчета о поставке");
                MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void buttonPrintReport_Click(object sender, EventArgs e)
        {
            if (dataGridView.SelectedRows.Count != 1) return;
            var service = Program.ServiceProvider?.GetService(typeof(FormPreviewPDF));
            if (service is FormPreviewPDF form)
            {
                var src = $"supplyreport{dataGridView.SelectedRows[0].Cells["Id"].Value}.pdf";
                if (!File.Exists(src))
                {
                    var result = MessageBox.Show("Отчёт о поставке не был найден. Сформировать?", "", MessageBoxButtons.YesNo);
                    if (result == DialogResult.Yes)
                    {
                        try
                        {
                            _reportLogic.SaveSuppliesToPdfFile(new ReportBindingModel
                            {
                                FileName = $"supplyreport{dataGridView.SelectedRows[0].Cells["Id"].Value}.pdf",
                                Date = (DateTime)dataGridView.SelectedRows[0].Cells["Date"].Value,
                                SupplyId = (Guid)dataGridView.SelectedRows[0].Cells["Id"].Value
                            });
                            _logger.LogInformation("Сохранение отчета о поставке");
                            MessageBox.Show("Выполнено", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }
                        catch (Exception ex)
                        {
                            _logger.LogError(ex, "Ошибка сохранения отчета о поставке");
                            MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }
                    else return;
                }
                form.src = System.IO.Path.GetFullPath(src);
                if (form.ShowDialog() == DialogResult.OK)
                {
                    IronPrint.Printer.PrintAsync(src);
                }
            }
        }

        private void buttonRefresh_Click(object sender, EventArgs e)
        {
            LoadData();
        }

        private void статистикаToolStripMenuItem_Click(object sender, EventArgs e)
        {
            var service = Program.ServiceProvider?.GetService(typeof(FormStatistics));
            if (service is FormStatistics form)
            {
                form.ShowDialog();
            }
        }
    }
}
