using LDBproject.Entities;
using LDBproject.Repositories;

namespace LDBproject.AdditionalForms;

public partial class RegOrderF : Form
{
    private readonly IOrderRep _orderRepository;

    public RegOrderF(IOrderRep orderRep, ICustomerCardsRep readerRep,
        ILibrarianRep employeeRep, IBookRep bookRep)
    {
        InitializeComponent();
        _orderRepository = orderRep ?? throw new ArgumentNullException(nameof(orderRep));

        LibrarianCBox.DataSource = employeeRep.GetCards();
        LibrarianCBox.DisplayMember = "FIO";
        LibrarianCBox.ValueMember = "CardID";

        CardCBox.DataSource = readerRep.GetCards();
        CardCBox.DisplayMember = "FIO";
        CardCBox.ValueMember = "CardID";

        BookColumnCBox.DataSource = bookRep.GetBookList();
        BookColumnCBox.DisplayMember = "MainBookInfo"; // MainBookInfo \ BookInfo
        BookColumnCBox.ValueMember = "BookID";
    }

    private void SaveBtn_Click(object sender, EventArgs e)
    {
        try
        {
            if (DataGV.RowCount < 1 || LibrarianCBox.SelectedIndex < 0)
            {
                throw new Exception("[ Blanck space left ]");
            }
            _orderRepository.CreateOrder(Order.NewOrder(0, (int)CardCBox.SelectedValue, (int)LibrarianCBox.SelectedValue,
                CreateBookListFromDG(), BorrowDTPicker.Value));

            Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Order Form [ Error while saving order ]",
               MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

    private List<Registration> CreateBookListFromDG()
    {
        List<Registration> registrations = new List<Registration>();
        foreach (DataGridViewRow row in DataGV.Rows)
        {
            if (row.Cells["BookColumnCBox"].Value != null)
            {
                var bookId = (int)row.Cells["BookColumnCBox"].Value;
                var notes = row.Cells["NoteColumn"].Value?.ToString();
                registrations.Add(Registration.OrderReg(0, bookId, notes));
            }
        }
        return registrations;
    }

    private void BackBtn_Click(object sender, EventArgs e) => Close();
}