import { TenantHeaderInterceptor } from '@backend/auth'
import { Body, Controller, HttpCode, Param, ParseUUIDPipe, Patch, Post, Put, UseInterceptors } from '@nestjs/common'
import {
	ApiBadRequestResponse,
	ApiBody,
	ApiInternalServerErrorResponse,
	ApiNoContentResponse,
	ApiNotAcceptableResponse,
	ApiOkResponse,
	ApiTags,
	ApiUnprocessableEntityResponse,
} from '@nestjs/swagger'
import { OrderService } from '../services'
import { CheckinRequest, CustomerOrderItemRequest, OrderResponse, PayOrderItemRequest } from '../types'

@UseInterceptors(TenantHeaderInterceptor)
@Controller('customer/order')
@ApiTags('customer')
export class CustomerOrderController {
	constructor(private readonly _orderService: OrderService) {}

	@Post()
	@ApiOkResponse({ type: OrderResponse })
	@ApiBadRequestResponse()
	@ApiNotAcceptableResponse()
	@ApiUnprocessableEntityResponse()
	@ApiInternalServerErrorResponse()
	async checkin(@Body() dto: CheckinRequest): Promise<OrderResponse> {
		return this._orderService.checkin(dto, true)
	}

	@Put(':orderId/items')
	@ApiBody({ type: CustomerOrderItemRequest, isArray: true })
	@ApiOkResponse({ type: OrderResponse })
	@ApiBadRequestResponse()
	@ApiInternalServerErrorResponse()
	async addOrderItems(
		@Param('orderId', ParseUUIDPipe) orderId: string,
		@Body() dto: CustomerOrderItemRequest[],
	): Promise<OrderResponse> {
		return this._orderService.addOrderItems(orderId, dto)
	}

	@Put(':orderId/pay')
	@HttpCode(204)
	@ApiBody({ type: PayOrderItemRequest, isArray: true })
	@ApiNoContentResponse()
	@ApiBadRequestResponse()
	@ApiUnprocessableEntityResponse()
	@ApiInternalServerErrorResponse()
	async payItemsViaCash(
		@Param('orderId', ParseUUIDPipe) orderId: string,
		@Body() dto: PayOrderItemRequest[],
	): Promise<void> {
		return this._orderService.payItemsViaCash(orderId, dto)
	}

	@Patch(':orderId/checkout')
	@HttpCode(204)
	@ApiNoContentResponse()
	@ApiBadRequestResponse()
	@ApiInternalServerErrorResponse()
	async checkout(@Param('orderId', ParseUUIDPipe) orderId: string): Promise<void> {
		return this._orderService.checkout(orderId)
	}
}
