import "reflect-metadata";
import { Controller, Get, Post, Put, Delete, Route, Path, Body } from "@tsoa/runtime";
import { getGroups, getBooks, getOneBook, addBook, updateBook, removeBook } from "~/services/library";

@Route("library")
export class LibraryController extends Controller {
	/**
	 * Retrieves all library groups
	 */
	@Get("/groups")
	public async getGroupsList(): Promise<any[]> {
		const data = await getGroups();
		return Array.isArray(data) ? data : [data];
	}

	/**
	 * Retrieves all library books
	 */
	@Get("/books")
	public async getBooksList(): Promise<any[]> {
		const data = await getBooks();
		return Array.isArray(data) ? data : [data];
	}

	/**
	 * Retrieves a specific library book
	 */
	@Get("/:libraryBookID")
	public async getOne(@Path() libraryBookID: number | string): Promise<any> {
		return await getOneBook(libraryBookID);
	}

	/**
	 * Adds a new book to the library
	 */
	@Post()
	public async addNewBook(@Body() body: any): Promise<any> {
		return await addBook(body);
	}

	/**
	 * Updates a library book
	 */
	@Put("/:libraryBookID")
	public async updateLibraryBook(@Path() libraryBookID: number | string, @Body() body: any): Promise<any> {
		return await updateBook(libraryBookID, body);
	}

	/**
	 * Deletes a library book
	 */
	@Delete("/:libraryBookID")
	public async deleteLibraryBook(@Path() libraryBookID: number | string): Promise<any> {
		return await removeBook(libraryBookID);
	}
}
