using ProjectGSM.Entities;
using ProjectGSM.Entities.Enums;
using ProjectGSM.Repositories;
using ProjectGSM.Repositories.Implementations;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ProjectGSM.Forms
{

    public partial class FormCase : Form
    {
        private readonly ICaseRepository _caseRepository;

        private readonly ICaseAdvocateRepository _caseAdvocateRepository;

        private int? _caseId;

        public int Id
        {
            set
            {
                try
                {
                    var caseE =
                    _caseRepository.ReadCaseById(value);
                    if (caseE == null)
                    {
                        throw new
                        InvalidDataException(nameof(caseE));
                    }


                    typeApellBox.SelectedItem = caseE.TypeAppeal;
                    clientBox.SelectedIndex = caseE.ClientId;
                    courtBox.SelectedIndex = caseE.CourtId;
                    paymentCheckBox.Checked = caseE.Payment;
                    priceNumeric.Value = caseE.Price;
                    winPriceNumeric.Value = caseE.VictoryPrice;
                    verdictCheckBox.Checked= caseE.Verdict;
                    textBox1.Text = caseE.Description;
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
            }
        }


        public FormCase(ICaseRepository caseRepository, ICaseAdvocateRepository caseAdvocateRepository,IClientRepository clientRepository, ICourtRepository courtRepository, IAdvocateRepository advocateRepository)
        {
            InitializeComponent();
            _caseRepository = caseRepository ??
                throw new
                ArgumentNullException(nameof(caseRepository));
            _caseAdvocateRepository = caseAdvocateRepository ?? throw new ArgumentNullException(nameof(caseAdvocateRepository));
            
            typeApellBox.DataSource = Enum.GetValues(typeof(TypeAppeal));

            ColumnAdvocate.DataSource = advocateRepository.ReadAdvocates();
            ColumnAdvocate.DisplayMember = "Name";
            ColumnAdvocate.ValueMember = "Id";

            clientBox.DataSource = clientRepository.ReadClients();
            clientBox.DisplayMember = "Name";
            clientBox.ValueMember = "Id";

            courtBox.DataSource = courtRepository.ReadCourts();
            courtBox.DisplayMember = "Name";
            courtBox.ValueMember = "Id";
        }

        private void saveButton_Click(object sender, EventArgs e)
        {
            try
            {if(dataGridView1.RowCount < 1 || typeApellBox.SelectedIndex < 0 || clientBox.SelectedIndex < 0 || courtBox.SelectedIndex < 0

                    )
                {
                    throw new Exception("Имеются незаполненные поля");
                }
                if (_caseId.HasValue)
                {
                    _caseRepository.UpdateCase(CreateCase(_caseId.Value));
                }
                else
                {
                    _caseRepository.UpdateCase(CreateCase(0));
                }
                foreach (CaseAdvocate row in CreateListCaseAdvocateFromDataGrid())
                {
                    _caseAdvocateRepository.CreateCaseAdvocate(CaseAdvocate.CreateEntity(row.CaseId, row.AdvocateId, row.Post));
                }
                Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Ошибка при сохранении",
                MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

        }

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


        private List<CaseAdvocate> CreateListCaseAdvocateFromDataGrid()
        {
            var list = new List<CaseAdvocate>();
            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                if (row.Cells["ColumnAdvocates"].Value == null ||
                row.Cells["ColumnPost"].Value == null)
                {
                    continue;
                }
                list.Add(CaseAdvocate.CreateEntity(0,
                Convert.ToInt32(row.Cells["ColumnAdvocates"].Value),
                row.Cells["ColumnPost"].Value.ToString()??string.Empty));
            }
            return list;
        }


        private Case CreateCase(int id) => Case.CreateEntity(id,
            (TypeAppeal)typeApellBox.SelectedItem!,
            paymentCheckBox.Checked,
            priceNumeric.Value,
            winPriceNumeric.Value,
            verdictCheckBox.Checked,
            courtBox.SelectedIndex,
            clientBox.SelectedIndex,
            textBox1.Text);
    }
}