/*
This file is part of »zeitbild«.

Copyright 2025 'kcf' <fenris@folksprak.org>

»zeitbild« is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

»zeitbild« is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License
along with »zeitbild«. If not, see <http://www.gnu.org/licenses/>.
 */


namespace _zeitbild.api
{
	
	/**
	 */
	export function register_calendar_get(
		rest_subject : lib_plankton.rest_http.type_rest
	) : void
	{
		register<
			null,
			{
				name : string;
				hue : float;
				access : {
					public : boolean;
					default_level : string;
					attributed_group : Array<
						{
							group_id : int;
							level : string;
						}
					>;
					attributed_user : Array<
						{
							user_id : int;
							level : string;
						}
					>;
				};
				resource_id : int;
			}
		>(
			rest_subject,
			lib_plankton.http.enum_method.get,
			"/calendar/:calendar_id",
			{
				"description": "liest die Daten eines Kalenders aus",
				"output_schema": () => ({
					"nullable": true, // TODO
				}),
				"restriction": restriction_logged_in,
				"execution": async (stuff) => {
					const session : {key : string; value : lib_plankton.session.type_session;} = await session_from_stuff(stuff);
					const user_id : _zeitbild.type_user_id = await _zeitbild.service.user.identify(session.value.name);
					
					const calendar_id : _zeitbild.type_calendar_id = parseInt(stuff.path_parameters["calendar_id"]);
					const calendar_object : _zeitbild.type_calendar_object = await _zeitbild.service.calendar.get(
						calendar_id,
						user_id
					);
					const result = {
						"name": calendar_object.name,
						"hue": calendar_object.hue,
						"access": {
							"public": calendar_object.access.public,
							"default_level": _zeitbild.api.access_level_encode(calendar_object.access.default_level),
							"attributed_group": lib_plankton.call.convey(
								calendar_object.access.attributed_group,
								[
									lib_plankton.map.dump,
									(pairs : Array<{key : _zeitbild.type_group_id; value : _zeitbild.enum_access_level;}>) => (
										pairs
										.map(
											(pair : {key : _zeitbild.type_group_id; value : _zeitbild.enum_access_level;}) => ({
												"group_id": pair.key,
												"level": _zeitbild.api.access_level_encode(pair.value)
											})
										)
									)
								]
							),
							"attributed_user": lib_plankton.call.convey(
								calendar_object.access.attributed_user,
								[
									lib_plankton.map.dump,
									(pairs : Array<{key : _zeitbild.type_user_id; value : _zeitbild.enum_access_level;}>) => (
										pairs
										.map(
											(pair : {key : _zeitbild.type_user_id; value : _zeitbild.enum_access_level;}) => ({
												"user_id": pair.key,
												"level": _zeitbild.api.access_level_encode(pair.value)
											})
										)
									)
								]
							),
						},
						"resource_id": calendar_object.resource_id,
					};
					return Promise.resolve(
						{
							"status_code": 200,
							"data": result,
						}
					);
				}
			}
		);
	}
	
}
