
/**
 */
namespace _zeitbild.frontend_web
{
	
	/**
	 */
	export async function main(
	) : Promise<void>
	{
		// conf
		await _zeitbild.frontend_web.conf.init("conf.json");
		
		// init
		await _zeitbild.frontend_web.backend.init();
		lib_plankton.zoo_page.init(
			document.querySelector("main"),
			{
				"pool": {
					"login": async (parameters, target_element) => {
						const preparation : {kind : string; data : any;} = await _zeitbild.frontend_web.backend.session_prepare(
						);
						switch (preparation.kind) {
							case "internal": {
								target_element.innerHTML = await _zeitbild.frontend_web.helpers.template_coin(
									"login",
									{
										"form": "",
									}
								);
								const form : lib_plankton.zoo_form.class_form<
									{name : string; password : string;},
									{name : string; password : string;}
								> = new lib_plankton.zoo_form.class_form<
									{name : string; password : string;},
									{name : string; password : string;}
								>(
									x => x,
									x => x,
									new lib_plankton.zoo_input.class_input_group<
										{name : string; password : string;}
									>(
										[
											{
												"name": "name",
												"input": new lib_plankton.zoo_input.class_input_text(),
												"label": "Name", // TODO: translate
											},
											{
												"name": "password",
												"input": new lib_plankton.zoo_input.class_input_password(),
												"label": "Kennwort", // TODO: translate
											},
										]
									),
									[
										{
											"label": "Anmelden", // TODO: translate
											"target": "submit",
											"procedure": async (get_value, get_representation) => {
												const value : any = await get_value();
												try {
													await _zeitbild.frontend_web.backend.session_begin(
														value.name,
														value.password
													);
													lib_plankton.zoo_page.set(
														{
															"name": "events",
															"parameters": {}
														}
													);
												}
												catch (error) {
													lib_plankton.zoo_page.set(
														{
															"name": "login",
															"parameters": {
																"name": value.name,
															}
														}
													);
												}
											}
										},
									]
								);
								await form.setup(document.querySelector("#login"));
								await form.input_write(
									{
										"name": (parameters.name ?? ""),
										"password": "",
									}
								);
								break;
							}
							case "oidc": {
								let element_a : HTMLElement = document.createElement("a");;
								element_a.textContent = lib_plankton.string.coin(
									"via {{label}}", // TODO: translate
									{
										"label": preparation.data.label,
									}
								);
								element_a.setAttribute("href", preparation.data.url);
								target_element.innerHTML = "";
								target_element.appendChild(element_a);
								break;
							}
							default: {
								break;
							}
						}
					},
					"oidc_finish": async (parameters, target_element) => {
						await _zeitbild.frontend_web.backend.set_session_key(parameters["session_key"]);
						lib_plankton.zoo_page.set(
							{
								"name": "events",
								"parameters": {}
							}
						);
					},
					"logout": async (parameters, target_element) => {
						await _zeitbild.frontend_web.backend.session_end(
						);
						lib_plankton.zoo_page.set(
							{
								"name": "login",
								"parameters": {
								}
							}
						);
					},
					"events": async (parameters, target_element) => {
						const content = await _zeitbild.frontend_web.view.calendar_view_table_html(
							{
								"calendar_ids": null,
								// TODO
								"from": {
									"year": 2024,
									"week": 37
								},
								// TODO
								"to": {
									"year": 2024,
									"week": 43
								},
								"timezone_shift": /*conf.timezone_shift*/0,
							}
						);
						target_element.innerHTML = content;
					},
				},
				"fallback": {
					"name": "login",
					"parameters": {}
				}
			}
		);
		lib_plankton.zoo_page.add_nav_entry(
			{"name": "login", "parameters": {}},
			{"label": "Login"}
		); // TODO: translate
		lib_plankton.zoo_page.add_nav_entry(
			{"name": "events", "parameters": {}},
			{"label": "Events"}
		); // TODO: translate
		lib_plankton.zoo_page.add_nav_entry(
			{"name": "logout", "parameters": {}},
			{"label": "Logout"}
		); // TODO: translate
		
		// exec
		lib_plankton.zoo_page.start();
		
		return Promise.resolve<void>(undefined);
	}
	
}

