using LDBproject.Entities.Enums;
using LDBproject.Entities;
using LDBproject.Repositories;

namespace LDBproject.AdditionalForms;

public partial class EmployeeF : Form
{
    private readonly ILibrarianRep _libRepository;
    private int? _librarianID;

    public EmployeeF(ILibrarianRep librarianR)
    {
        InitializeComponent();
        _libRepository = librarianR ?? throw new ArgumentNullException(nameof(librarianR));
        foreach (var elem in Enum.GetValues(typeof(Genres)))
        {
            GenresCheckedBL.Items.Add(elem);
        }
    }

    public int ID
    {
        set
        {
            try
            {
                var librarian = _libRepository.GetCardByID(value);
                if (librarian == null)
                {
                    throw new InvalidDataException(nameof(librarian));
                }

                // Uncheck all genres in the checklist box
                for (int i = 0; i < GenresCheckedBL.Items.Count; i++)
                {
                    GenresCheckedBL.SetItemChecked(i, false);
                }
                // Check the genres that are in the bitmask
                foreach (Genres genre in Enum.GetValues(typeof(Genres)))
                {
                    if ((genre & librarian.GenreMask) != 0 && genre != Genres.None)
                    {
                        int index = GenresCheckedBL.Items.IndexOf(genre);
                        if (index != -1)
                        {
                            GenresCheckedBL.SetItemChecked(index, true);
                        }
                    }
                }
                FIOEnterTb.Text = librarian.FIO;
                _librarianID = value;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "EmployeeF [ Error : while setting ID ]", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
        }
    }

    private void SaveBtn_Click(object sender, EventArgs e)
    {
        try
        {
            if (string.IsNullOrWhiteSpace(FIOEnterTb.Text)
            || GenresCheckedBL.CheckedItems.Count == 0)
            {
                throw new Exception("EmployeeF [ Blank spaces were left, not enough information ]");
            }

            if (_librarianID.HasValue)
            {
                _libRepository.ChangeCardInfo(CreateWorker(_librarianID.Value));
            }
            else
            {
                _libRepository.AddCard(CreateWorker(0));
            }
            Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "EmployeeF [ Error : while saving data ]",
                MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

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

    private LibrarianCard CreateWorker(int id)
    {
        Genres selectedGenres = Genres.None;
        foreach (var item in GenresCheckedBL.CheckedItems)
        {
            if (item is Genres genre)
                selectedGenres |= genre;
        }

        return LibrarianCard.AddWorker(id, FIOEnterTb.Text, selectedGenres);
    }
}