import { TenantHeaderInterceptor } from '@backend/auth'
import { CategoryRepository, MenuItemRepository } from '@backend/repository'
import { Controller, Get, UseInterceptors } from '@nestjs/common'
import { ApiInternalServerErrorResponse, ApiOkResponse, ApiTags } from '@nestjs/swagger'
import { CategoryMapper, MenuItemMapper } from '../mappers'
import { CategoryResponse, MenuItemResponse } from '../types'

@UseInterceptors(TenantHeaderInterceptor)
@Controller('customer/menu')
@ApiTags('customer')
export class CustomerMenuController {
	constructor(
		private readonly _categoryRepository: CategoryRepository,
		private readonly _menuItemRepository: MenuItemRepository,
	) {}

	@Get('category')
	@ApiOkResponse({ type: CategoryResponse, isArray: true })
	@ApiInternalServerErrorResponse()
	async findAllCategories(): Promise<CategoryResponse[]> {
		const categories = await this._categoryRepository.find({
			where: { isVisible: true, isArchived: false },
			relations: { parentCategory: true },
		})

		return categories.map((category) => CategoryMapper.categoryToResponse(category))
	}

	@Get('item')
	@ApiOkResponse({ type: MenuItemResponse, isArray: true })
	@ApiInternalServerErrorResponse()
	async findAllItem(): Promise<MenuItemResponse[]> {
		const items = await this._menuItemRepository.find({
			where: { isArchived: false, categories: { isVisible: true } },
			relations: { categories: { category: { parentCategory: true } } },
		})

		return items.map((item) => MenuItemMapper.entityToResponse(item))
	}
}
