using ConfectioneryContracts.BindingModels;
using ConfectioneryContracts.BusinessLogicsContracts;
using ConfectioneryContracts.ViewModels;
using ConfectioneryDataModels;
using ConfectioneryDataModels.Models;
using Microsoft.Extensions.Logging;
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ConfectioneryView
{
    public partial class FormShop : Form
    {
        private readonly List<ShopViewModel>? _listShops;
        private readonly IShopLogic _logic;
        private readonly ILogger _logger;

        public int Id
        {
            get; set;
        }

        private IShopModel? GetShop(int id)
        {
            if (_listShops == null)
            {
                return null;
            }
            foreach (var elem in _listShops)
            {
                if (elem.Id == id)
                {
                    return elem;
                }
            }
            return null;
        }

        public FormShop(ILogger<FormShop> logger, IShopLogic logic)
        {
            InitializeComponent();
            _logger = logger;
            _listShops = logic.ReadList(null);
            _logic = logic;
            if (_listShops != null)
            {
                comboBoxShop.DisplayMember = "Name";
                comboBoxShop.ValueMember = "Id";
                comboBoxShop.DataSource = _listShops;
                comboBoxShop.SelectedItem = null;
            }
        }

        private void LoadData(bool extendDate = true)
        {
            try
            {
                var model = GetShop(extendDate ? Id : Convert.ToInt32(comboBoxShop.SelectedValue));
                if (model != null)
                {
                    numericUpDownMaxPastry.Value = model.MaxCountPastries;
                    comboBoxShop.Text = model.Name;
                    textBoxAddress.Text = model.Address;
                    textBoxDateOpening.Text = Convert.ToString(model.DateOpening);
                    dataGridView.Rows.Clear();
                    foreach (var el in model.Pastries.Values)
                    {
                        dataGridView.Rows.Add(new object[]{el.Item1.PastryName, el.Item1.Price, el.Item2 });
                    }
                }
                _logger.LogInformation("Загрузка магазинов");
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Ошибка загрузки магазинов");
                MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK,
                MessageBoxIcon.Error);
            }
        }

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

        private void ButtonSave_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(comboBoxShop.Text))
            {
                MessageBox.Show("Заполните название", "Ошибка",
                MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            if (string.IsNullOrEmpty(textBoxAddress.Text))
            {
                MessageBox.Show("Заполните адрес", "Ошибка", MessageBoxButtons.OK,
                MessageBoxIcon.Error);
                return;
            }
            _logger.LogInformation("Сохранение изделия");
            try
            {
                DateTime.TryParse(textBoxDateOpening.Text, out var dateTime);
                ShopBindingModel model = new()
                {
                    Name = comboBoxShop.Text,
                    Address = textBoxAddress.Text,
                    DateOpening = dateTime,
                    MaxCountPastries = (int)numericUpDownMaxPastry.Value,
                };
                var vmodel = GetShop(Id);
                bool operationResult = false;

                if (vmodel != null)
                {
                    model.Id = vmodel.Id;
                    operationResult = _logic.Update(model);
                }
                else
                {
                    operationResult = _logic.Create(model);
                }
                if (!operationResult)
                {
                    throw new Exception("Ошибка при сохранении. Дополнительная информация в логах.");
                }
                MessageBox.Show("Сохранение прошло успешно", "Сообщение",
                MessageBoxButtons.OK, MessageBoxIcon.Information);
                DialogResult = DialogResult.OK;
                Close();
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Ошибка сохранения изделия");
                MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void ButtonCancel_Click(object sender, EventArgs e)
        {
            DialogResult = DialogResult.Cancel;
            Close();
        }

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