using System;
using System.Threading;
using System.Threading.Tasks;
using ConsoleTools;

namespace WD7UVN_HFT_2023241.Client.TUI
{
	public enum CRUDActions
	{
		GetAll,
		GetById,
		Create,
		Update,
		Delete
	}

	public class Program
	{
		private static async Task Main(string[] args)
		{
			try
			{
				RestService.Init();
			}
			catch (EndpointNotAvailableException e)
			{
				Console.WriteLine(e.Message);
				Environment.Exit(1);
			}

		//	var commonConfig = new MenuConfig
		//	{
		//		Selector = "--> ",
		//		EnableFilter = true,
		//		EnableBreadcrumb = true,
		//		WriteBreadcrumbAction = titles => Console.WriteLine(string.Join(" / ", titles)),
		//	};
			
			var nonCrudMenu = new ConsoleMenu(args, level: 2)
				.Add("Who maintains specified service?", () => NonCRUD.WhoMaintainsService())
				.Add("Get employee's subordinates", () => NonCRUD.GetSubordinates())
				.Add("Get clients using a specified service", () => NonCRUD.WhoUsesService())
				.Add("Get employees in specified maintainer team", () => NonCRUD.WhoWorksInMaintainerTeam())
				.Add("Get employee responsible for specified service", () => NonCRUD.WhoIsResponsibleForService())
				.Add("Back", ConsoleMenu.Close)
				.Add("Exit", () => Environment.Exit(0))
				//.Configure(commonConfig)
				.Configure(config =>
				{
					config.Title = "Non-CRUD Operations";
				});
			
			var crudMenu = new ConsoleMenu(args, level: 1)
				.Add("Get all", () => CRUD.TypeSelectorMenu(CRUDActions.GetAll))
				.Add("Get by id", () => CRUD.TypeSelectorMenu(CRUDActions.GetById))
				.Add("Create", () => CRUD.TypeSelectorMenu(CRUDActions.Create))
				.Add("Update", () => CRUD.TypeSelectorMenu(CRUDActions.Update))
				.Add("Delete", () => CRUD.TypeSelectorMenu(CRUDActions.Delete))
				.Add("Back", ConsoleMenu.Close)
				.Add("Exit", () => Environment.Exit(0))
				//.Configure(commonConfig)
				.Configure(config =>
				{
					config.Title = "Tables";
				});
			
			var menu = new ConsoleMenu(args, level: 0)
				.Add("CRUD", crudMenu.Show)
				.Add("Non-CRUD", nonCrudMenu.Show)
				.Add("Exit", () => Environment.Exit(0))
				//.Configure(commonConfig)
				.Configure(config =>
				{
					config.Title = "Main menu";
					config.EnableWriteTitle = true;
					config.EnableBreadcrumb = true;
				});
			
			var token = new CancellationTokenSource().Token;
			await menu.ShowAsync(token);
		}
	}
}
