using Register_office.Model;
using Register_office.Properties;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace Register_office.ViewModel
{
	internal sealed class GeneralViewModel
	{
		private static readonly Lazy<GeneralViewModel> _instance = new(() => new GeneralViewModel());

		private RegisterOfficeContext _context;
		// Хранит все открытые формы
		private FormCollection _fc;

		private string _pathReport = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);

		private int _doctorId = 0;

		internal static GeneralViewModel Instance => _instance.Value;
		internal RegisterOfficeContext Context => _context;

		public int DoctorId { get => _doctorId; set => _doctorId = value; }
		public string PathReport { get => _pathReport; set => _pathReport = value; }

		private GeneralViewModel() { }

		public void Initialize()
		{
			_fc = Application.OpenForms;
			_context = RegisterOfficeFactory
				.Create(Settings.Default.Username, Settings.Default.Password);
			if (RegisterOfficeFactory.CanConnect)
			{
				_context.Database.EnsureCreated();
			}
		}

		/// <summary>
		/// Настройка внешнего вида таблицы
		/// </summary>
		/// <param name="dgv"></param>
		internal void SetDefaultSettingsToDGV(DataGridView dgv)
		{
			dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
			dgv.ColumnHeadersDefaultCellStyle.Font = new Font("Segoe UI", 12, FontStyle.Bold);
			dgv.RowsDefaultCellStyle.Font = new Font("Segoe UI", 11, FontStyle.Regular);
			dgv.EnableHeadersVisualStyles = false;
			dgv.ColumnHeadersDefaultCellStyle.BackColor = Color.LightBlue;
			dgv.AllowUserToOrderColumns = true;
		}

		/// <summary>
		/// Настройка имен столбцов DataGridView
		/// </summary>
		/// <typeparam name="T">Класс таблицы БД</typeparam>
		/// <param name="dgv"></param>
		internal void ConfigureGrid<T>(DataGridView dgv)
		{
			// Получаем свойства модели с атрибутами Display
			var properties = typeof(T).GetProperties()
				.Where(p => p.GetCustomAttribute<DisplayAttribute>() != null);

			foreach (var prop in properties)
			{
				// Получаем свойства вложенной модели с атрибутами Display
				var propertiesIn = prop.PropertyType.GetProperties()
					.Where(p => p.GetCustomAttribute<DisplayAttribute>() != null);
				if (propertiesIn.Any())
					foreach (var propIn in propertiesIn)
						AddColumn(propIn, dgv);
				else
					AddColumn(prop, dgv);
			}
		}
		private void AddColumn(PropertyInfo prop, DataGridView dgv)
		{
			var displayAttr = prop.GetCustomAttribute<DisplayAttribute>();

			dgv.Columns.Add(new DataGridViewTextBoxColumn
			{
				HeaderText = displayAttr != null
							? displayAttr.Name // Берем название из атрибута
							: prop.Name,
				DataPropertyName = prop.Name,  // Привязка к свойству
				Name = prop.Name,               // Техническое имя столбца
				Visible = prop.Name.Contains("Id") ? false : true
			});
		}

		internal T? GetActivatedForm<T>() where T : Form
		{
			foreach (Form frm in _fc)
				if (frm.Name == typeof(T).Name)
				{
					frm.Activate();
					return frm as T;
				}
			return default;
		}
	}

	internal class ComboBoxItem
	{
		public string Name { get; set; } = "";
		public int Id { get; set; } = -1;
	}
}
