import "reflect-metadata";
import { Controller, Get, Post, Patch, Delete, Route, Path, Query, Body } from "@tsoa/runtime";
import * as suitsService from "~/services/suit/index";

@Route("suits")
export class SuitsController extends Controller {
	/**
	 * Retrieves list of all suits
	 */
	@Get()
	public async getList(): Promise<any[]> {
		const data = await suitsService.getList();
		return Array.isArray(data) ? data : [data];
	}

	/**
	 * Retrieves items assigned to any suit
	 */
	@Get("/itemsOnAnySuit")
	public async getListItemsOnAnySuit(): Promise<any[]> {
		const data = await suitsService.getListItemsOnAnySuit();
		return Array.isArray(data) ? data : [data];
	}

	/**
	 * Retrieves list of suit styles
	 */
	@Get("/styles")
	public async getSuitStyles(): Promise<any[]> {
		const data = await suitsService.getSuitStyles();
		return Array.isArray(data) ? data : [data];
	}

	/**
	 * Retrieves a specific suit by ID
	 */
	@Get("/:fullsuitID")
	public async getByID(@Path() fullsuitID: string | number): Promise<any> {
		return await suitsService.getByID(fullsuitID);
	}

	/**
	 * Partially updates a suit
	 */
	@Patch("/:fullsuitID")
	public async patch(@Path() fullsuitID: string | number, @Body() body: any): Promise<any> {
		const svcCore = require("~/services/suit/core").default;
		return await svcCore.patch(fullsuitID, body);
	}

	/**
	 * Retrieves financial information for a suit
	 */
	@Get("/:fullsuitID/financials")
	public async getFinancials(@Path() fullsuitID: string | number): Promise<any> {
		return await suitsService.getFinancials(fullsuitID);
	}

	/**
	 * Retrieves items in a suit
	 */
	@Get("/:fullsuitID/items")
	public async getItems(@Path() fullsuitID: string | number, @Query() itemType?: string): Promise<any[]> {
		const svcItems = require("~/services/suit/items").default;
		const data = await svcItems.getItems(fullsuitID, itemType);
		return Array.isArray(data) ? data : [data];
	}

	/**
	 * Adds an item to a suit
	 */
	@Post("/:fullsuitID/items")
	public async addItem(@Path() fullsuitID: string | number, @Body() body: any): Promise<any> {
		const svcItems = require("~/services/suit/items").default;
		return await svcItems.addItem(fullsuitID, body.itemType, body.itemID);
	}

	/**
	 * Deletes an item from a suit
	 */
	@Delete("/:fullsuitID/items/:itemID")
	public async deleteItem(@Path() fullsuitID: string | number, @Path() itemID: string | number): Promise<any> {
		const svcItems = require("~/services/suit/items").default;
		return await svcItems.deleteItem(fullsuitID, itemID);
	}

	/**
	 * Updates suit photo
	 */
	@Patch("/:fullsuitID/photo")
	public async patchPhoto(@Path() fullsuitID: string | number, @Body() body: any): Promise<any> {
		const { fullSuitPhotoUpload } = require("~/services/suit/photos");
		return await fullSuitPhotoUpload(fullsuitID, body);
	}
}
