import { AuthMethod, UseAuth } from '@backend/auth'
import { RequestResponseLogging } from '@backend/logging'
import {
	BatchAvailabilityLookupRequest,
	BatchAvailabilityLookupResponse,
	CreateBookingRequest,
	CreateBookingResponse,
	GetBookingStatusRequest,
	GetBookingStatusResponse,
	UpdateBookingRequest,
	UpdateBookingResponse,
} from '@core/google-reservations/types/booking-server'
import { Body, Controller, Get, Post, Res } from '@nestjs/common'
import { FastifyReply } from 'fastify'
import { BookingServerService } from './booking-server.service'

@UseAuth(AuthMethod.GoogleBookingServer)
@Controller()
export class BookingServerController {
	constructor(private readonly _bookingServerService: BookingServerService) {}

	@Get('/v3/HealthCheck')
	async healthCheck(@Res() reply: FastifyReply): Promise<void> {
		reply.status(200).send()
	}

	@RequestResponseLogging()
	@Post('/v3/BatchAvailabilityLookup')
	async batchAvailabilityLookup(
		@Body() request: BatchAvailabilityLookupRequest,
	): Promise<BatchAvailabilityLookupResponse> {
		return this._bookingServerService.batchAvailabilityLookup(request)
	}

	@RequestResponseLogging()
	@Post('/v3/CreateBooking')
	async createBooking(@Body() request: CreateBookingRequest): Promise<CreateBookingResponse> {
		return this._bookingServerService.createBooking(request)
	}

	@RequestResponseLogging()
	@Post('/v3/UpdateBooking')
	async updateBooking(@Body() request: UpdateBookingRequest): Promise<UpdateBookingResponse> {
		return this._bookingServerService.updateBooking(request)
	}

	@RequestResponseLogging()
	@Post('/v3/GetBookingStatus')
	async getBookingStatus(@Body() request: GetBookingStatusRequest): Promise<GetBookingStatusResponse> {
		return this._bookingServerService.getBookingStatus(request)
	}
}
