using NewsBlogAbstractions.Models;
using NewsBlogAbstractions.WorkAbstractions;
using NewsBlogMongoDB;
using System.Security.Policy;

namespace NewsBlogView
{
	public partial class FormMain : Form
	{
		public FormMain()
		{
			InitializeComponent();
		}

		private void articleToolStripMenuItem_Click(object sender, EventArgs e)
		{
			var service = Program.ServiceProvider?.GetService(typeof(FormArticle));
			if (service is FormArticle form)
			{
				form.ShowDialog();
			}
		}

		private void authorToolStripMenuItem_Click(object sender, EventArgs e)
		{
			var service = Program.ServiceProvider?.GetService(typeof(FormAuthor));
			if (service is FormAuthor form)
			{
				form.ShowDialog();
			}
		}

		private void categoryToolStripMenuItem_Click(object sender, EventArgs e)
		{
			var service = Program.ServiceProvider?.GetService(typeof(FormCategory));
			if (service is FormCategory form)
			{
				form.ShowDialog();
			}
		}

		private void commentToolStripMenuItem_Click(object sender, EventArgs e)
		{
			var service = Program.ServiceProvider?.GetService(typeof(FormComment));
			if (service is FormComment form)
			{
				form.ShowDialog();
			}
		}

		private void tagToolStripMenuItem_Click(object sender, EventArgs e)
		{
			var service = Program.ServiceProvider?.GetService(typeof(FormTag));
			if (service is FormTag form)
			{
				form.ShowDialog();
			}
		}

		private void add1000ToolStripMenuItem_Click(object sender, EventArgs e)
		{
			var service = Program.ServiceProvider?.GetService(typeof(IAuthorWork));
			if (service is IAuthorWork authorLogic)
			{
				DateTime startTime = DateTime.Now;
				for (int i = 0; i < 1000; i++)
				{
					Author author = new()
					{
						Id = i + 1000,
						Name = "��� " + i,
						Description = "�������� " + i,
						Phone = "����� " + i
					};
					authorLogic.CreateId(author);
				}
				DateTime endTime = DateTime.Now;

				labelTest.Text = $"���������� 1000 ����� ��������� �� {(endTime - startTime).TotalMilliseconds} �����������";
			}
		}

		private void get1000ToolStripMenuItem_Click(object sender, EventArgs e)
		{
			var service = Program.ServiceProvider?.GetService(typeof(IAuthorWork));
			if (service is IAuthorWork authorLogic)
			{
				DateTime startTime = DateTime.Now;
				for (int i = 0; i < 1000; i++)
					authorLogic.Get(i + 1000);
				DateTime endTime = DateTime.Now;

				labelTest.Text = $"��������� 1000 ����� ��������� �� {(endTime - startTime).TotalMilliseconds} �����������";
			}
		}

		private void update1000ToolStripMenuItem_Click(object sender, EventArgs e)
		{
			var service = Program.ServiceProvider?.GetService(typeof(IAuthorWork));
			if (service is IAuthorWork authorLogic)
			{
				DateTime startTime = DateTime.Now;
				for (int i = 0; i < 1000; i++)
				{
					Author author = new()
					{
						Id = i + 1000,
						Name = "��� " + i + 2000,
						Description = "�������� " + i + 2000,
						Phone = "����� " + i + 2000
					};
					authorLogic.Update(author);
				}
				DateTime endTime = DateTime.Now;

				labelTest.Text = $"���������� 1000 ����� ��������� �� {(endTime - startTime).TotalMilliseconds} �����������";
			}
		}

		private void delete1000ToolStripMenuItem_Click(object sender, EventArgs e)
		{
			var service = Program.ServiceProvider?.GetService(typeof(IAuthorWork));
			if (service is IAuthorWork authorLogic)
			{
				DateTime startTime = DateTime.Now;
				for (int i = 0; i < 1000; i++)
				{
					authorLogic.Delete(i + 1000);
				}
				DateTime endTime = DateTime.Now;

				labelTest.Text = $"�������� 1000 ����� ��������� �� {(endTime - startTime).TotalMilliseconds} �����������";
			}
		}

		private void updateMongoDBToolStripMenuItem_Click(object sender, EventArgs e)
		{
			ImplementationMongoDB implementationMongoDB = new();

			// ������� �� 
			foreach (var it in implementationMongoDB.GetArticles())
				implementationMongoDB.DeleteArticle(it.Id);
			foreach (var it in implementationMongoDB.GetAuthors())
				implementationMongoDB.DeleteAuthor(it.Id);
			foreach (var it in implementationMongoDB.GetCategorys())
				implementationMongoDB.DeleteCategory(it.Id);
			foreach (var it in implementationMongoDB.GetComments())
				implementationMongoDB.DeleteComment(it.Id);
			foreach (var it in implementationMongoDB.GetTags())
				implementationMongoDB.DeleteTag(it.Id);
			foreach (var it in implementationMongoDB.GetSequence())
				implementationMongoDB.DeleteSequence(it.Id);

			// ��������� �� ���������
			List<Article> listArticle = null;
			List<Author> listAuthor = null;
			List<Category> listCategory = null;
			List<Comment> listComment = null;
			List<Tag> listTag = null;

			var service = Program.ServiceProvider?.GetService(typeof(IArticleWork));
			if (service is IArticleWork articleLogic)
				listArticle = articleLogic.GetAll();

			service = Program.ServiceProvider?.GetService(typeof(IAuthorWork));
			if (service is IAuthorWork authorLogic)
				listAuthor = authorLogic.GetAll();

			service = Program.ServiceProvider?.GetService(typeof(ICategoryWork));
			if (service is ICategoryWork categoryLogic)
				listCategory = categoryLogic.GetAll();

			service = Program.ServiceProvider?.GetService(typeof(ICommentWork));
			if (service is ICommentWork commentLogic)
				listComment = commentLogic.GetAll();

			service = Program.ServiceProvider?.GetService(typeof(ITagWork));
			if (service is ITagWork tagLogic)
				listTag = tagLogic.GetAll();

			// ������� ������ ����� ��
			if (listAuthor != null)
				foreach (var it in listAuthor)
					implementationMongoDB.AddAuthor(it);
			if (listCategory != null)
				foreach (var it in listCategory)
					implementationMongoDB.AddCategory(it);
			if (listArticle != null)
				foreach (var it in listArticle)
					implementationMongoDB.AddArticle(it);
			if (listComment != null)
				foreach (var it in listComment)
					implementationMongoDB.AddComment(it);
			if (listTag != null)
				foreach (var it in listTag)
					implementationMongoDB.AddTag(it);
		}

		private void MongoDB_CheckedChanged(object sender, EventArgs e)
		{
			Program.isPostgreSQL = !Program.isPostgreSQL;
		}
	}
}