using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Web;
using Seenginx.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Seenginx.Components
{
	public partial class FilesWithEditor<CFile> : ComponentBase
		where CFile : ConfigFile
	{
		[Parameter]
		public List<CFile> Files { get; set; } = new List<CFile>();

		[Parameter]
		public List<string> Filters { get; set; } = new List<string>();
		[Parameter]
		public List<int> FilteredOutFiles { get; set; } = new List<int>();
		[Parameter]
		public EventCallback<string> ApplyFilter { get; set; }

		[Parameter]
		public EventCallback AddFile { get; set; }
		[Parameter]
		public EventCallback<CFile> UpdateFile { get; set; }
		[Parameter]
		public EventCallback<CFile> DeleteFile { get; set; }

		[Parameter]
		public RenderFragment<CFile> Editor { get; set; }

		[Parameter]
		public RenderFragment<CFile> CreateDialog { get; set; }

		[Parameter]
		public RenderFragment<CFile> UpdateDialog { get; set; }

		[Parameter]
		public RenderFragment<CFile> DeleteDialog { get; set; }

		protected string SelectedFilter { get; set; }

		protected bool IsAnyFileSelected => SelectedFile != default;

		[Parameter]
		public EventCallback<CFile> SelectedFileChanged { get; set; }
		[Parameter]
		public CFile SelectedFile { get; set; }

		protected async Task OnDeselectClick()
		{
			SelectedFile = null;
			await SelectedFileChanged.InvokeAsync(SelectedFile);
		}

		protected async Task OnFilterClick(string filter)
		{
			await ApplyFilter.InvokeAsync(filter);
			//for (int index = 0; index < Files.Count; index++)
			//	if (FilteredOutFiles.Contains(index))
			//		Files[index].Hide();
			//	else
			//		Files[index].Unhide();
		}

		protected async Task SearchInputChanged(string searchInput)
		{
			if (string.IsNullOrEmpty(searchInput))
				Files.ForEach(f => f.Unhide());
			else
				Files.ForEach(f =>
				{
					if (f.Name.ToLower().Contains(searchInput.ToLower()))
						f.Unhide();
					else
						f.Hide();
				});
		}

		protected async Task OnFileClick(MouseEventArgs e, CFile file)
		{
			await SelectedFileChanged.InvokeAsync(file);
		}

		protected async Task OnAddDialog()
		{
			await AddFile.InvokeAsync(null);
		}
		protected async Task OnUpdateDialog()
		{
			await UpdateFile.InvokeAsync(SelectedFile);
		}
		protected async Task OnDeleteDialog()
		{
			await UpdateFile.InvokeAsync(SelectedFile);
		}
	}
}
