import {
  Body,
  Controller,
  Delete,
  Get,
  Headers,
  Param,
  Patch,
  Post,
  Query,
} from "@nestjs/common"
import { ApiHeader, ApiOperation, ApiResponse, ApiTags } from "@nestjs/swagger"
import { CreateAppVersionDto } from "../dto/create-app-version.dto"
import { AppVersion } from "../entities/app-version.entity"
import { UpdateAppVersionDto } from "../dto/update-app-version.dto"
import { AppVersionService } from "./app-version.service"
import { getControllerVersion } from "src/utils/helpers"

@ApiTags("App Version")
// @Controller("app-version")
@Controller({
  path: "app-version",
  version: getControllerVersion(),
})
export class AppVersionController {
  constructor(private readonly appVersionService: AppVersionService) {}

  @Get()
  @ApiOperation({ summary: "Check if update is required for the app" })
  @ApiHeader({
    name: "user-type",
    description: "Type of user making the request",
    required: false,
    enum: ["USER", "driver", "dispatcher"],
    example: "USER",
  })
  async checkUpdate(
    @Query("platform") platform: "android" | "ios",
    @Query("version") version: string,
    @Headers("user-type") userType: "USER" | "driver" | "dispatcher",
  ) {
    const resolvedUserType = userType ?? "driver"
    return await this.appVersionService.checkUpdate(
      platform,
      version,
      resolvedUserType,
    )
  }

  @Post()
  @ApiOperation({ summary: "Create or update app version config" })
  @ApiResponse({ status: 201, type: AppVersion })
  @ApiResponse({ status: 200, type: AppVersion })
  async create(@Body() dto: CreateAppVersionDto) {
    return await this.appVersionService.setVersion(dto)
  }

  @Patch(":id")
  @ApiOperation({ summary: "Update existing app version config by id" })
  @ApiResponse({ status: 200, type: AppVersion })
  async update(@Param("id") id: number, @Body() dto: UpdateAppVersionDto) {
    return await this.appVersionService.updateVersion(id, dto)
  }

  @Delete(":id")
  @ApiOperation({ summary: "Delete app version config by id" })
  async remove(@Param("id") id: number) {
    await this.appVersionService.deleteVersion(id)
  }
}
