using BarContracts.BindingModels;
using BarContracts.BusinessLogicContracts;
using BarContracts.SearchModels;
using Microsoft.Extensions.Logging;

namespace BarView.Forms
{
    public partial class FormCreateOrder : Form
    {
        private readonly ILogger _logger;
        private readonly ICocktailLogic _cocktailLogic;
        private readonly IOrderLogic _orderLogic;
        private readonly IClientLogic _clientLogic;

        public FormCreateOrder(ILogger<FormCreateOrder> Logger, ICocktailLogic CocktailLogic, IOrderLogic OrderLogic, IClientLogic ClientLogic)
        {
            InitializeComponent();

            _logger = Logger;
            _cocktailLogic = CocktailLogic;
            _orderLogic = OrderLogic;
            _clientLogic = ClientLogic;
        }

        private void FormCreateOrder_Load(object sender, EventArgs e)
        {
            _logger.LogInformation("Загрузка коктелей для заказа");

            try
            {
                var List = _cocktailLogic.ReadList(null);
                if (List != null)
                {
                    CocktailComboBox.DisplayMember = "CocktailName";
                    CocktailComboBox.ValueMember = "Id";
                    CocktailComboBox.DataSource = List;
                    CocktailComboBox.SelectedItem = null;
                }

                _logger.LogInformation("Коктели загружены");
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Ошибка загрузки коктелей");
                MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }


            _logger.LogInformation("Загрузка клиентов для заказа");
            try
            {
                var list = _clientLogic.ReadList(null);
                if (list != null)
                {
                    ClientComboBox.DisplayMember = "ClientFIO";
                    ClientComboBox.ValueMember = "Id";
                    ClientComboBox.DataSource = list;
                    ClientComboBox.SelectedItem = null;
                }
                _logger.LogInformation("Клиенты загружены");
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Ошибка загрузки клиентов");
                MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK,
               MessageBoxIcon.Error);
            }
        }

        private void CalcSum()
        {
            if (CocktailComboBox.SelectedValue != null && !string.IsNullOrEmpty(CountTextBox.Text))
            {
                try
                {
                    int id = Convert.ToInt32(CocktailComboBox.SelectedValue);
                    var Cocktail = _cocktailLogic.ReadElement(new CocktailSearchModel
                    {
                        Id = id
                    });
                    int Count = Convert.ToInt32(CountTextBox.Text);

                    SumTextBox.Text = Math.Round(Count * (Cocktail?.Price ?? 0), 2).ToString();

                    _logger.LogInformation("Расчет суммы заказа");
                }
                catch (Exception ex)
                {
                    _logger.LogError(ex, "Ошибка расчета суммы заказа");
                    MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }

        private void CountTextBox_TextChanged(object sender, EventArgs e)
        {
            CalcSum();
        }

        private void SaveButton_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(CountTextBox.Text))
            {
                MessageBox.Show("Заполните поле Количество", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            if (CocktailComboBox.SelectedValue == null)
            {
                MessageBox.Show("Выберите коктель", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            if (ClientComboBox.SelectedValue == null)
            {
                MessageBox.Show("Выберите клиента", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            _logger.LogInformation("Создание заказа");

            try
            {
                var OperationResult = _orderLogic.CreateOrder(new OrderBindingModel
                {
                    CocktailId = Convert.ToInt32(CocktailComboBox.SelectedValue),
                    ClientId = Convert.ToInt32(ClientComboBox.SelectedValue),
                    Count = Convert.ToInt32(CountTextBox.Text),
                    Sum = Convert.ToDouble(SumTextBox.Text)
                });
                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 CancelButton_Click(object sender, EventArgs e)
        {
            DialogResult = DialogResult.Cancel;
            Close();
        }

        private void CocktailComboBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            CalcSum();
        }
    }
}
