import {
  Body,
  Controller,
  Delete,
  Get,
  Param,
  Patch,
  Post,
  Query,
  Req,
  UploadedFiles,
  UseGuards,
  UseInterceptors,
} from "@nestjs/common"
import { FileFieldsInterceptor } from "@nestjs/platform-express"
import { ApiBearerAuth, ApiBody, ApiConsumes, ApiTags } from "@nestjs/swagger"
import { inspectionReportPhotoUploadConfig } from "src/common/file-upload/inspection-fleet-report.config"
import { AuthGuardMiddleware } from "src/middleware/auth-guard.middleware"
import { CreateInspectionQuestionDto } from "../dto/create-inspection-questions.dto"
import { FilterInspectionQuestionDto } from "../dto/filter-inspection-questions.dto"
import { CreateInspectionReportWithAnswersDto } from "../dto/save-inspection-answers.dto"
import { UpdateInspectionQuestionsDto } from "../dto/update-inspection-questions-dto"
import { InspectionQuestionsService } from "./inspection-questions.service"
import { FilterInspectionReportDto } from "../dto/filter-inspection-report.dto"

@Controller("inspection-questions")
@ApiTags("Inspection Questions")
@UseGuards(AuthGuardMiddleware)
@ApiBearerAuth("access-token")
export class InspectionQuestionsController {
  constructor(
    private readonly inspectionQuestionsService: InspectionQuestionsService,
  ) {}

  @Post()
  create(@Body() createInspectionQuestionDto: CreateInspectionQuestionDto) {
    return this.inspectionQuestionsService.create(createInspectionQuestionDto)
  }

  @Post("inspection-report")
  saveAnswers(@Body() saveAnswersDto: CreateInspectionReportWithAnswersDto) {
    return this.inspectionQuestionsService.createReportWithAnswers(
      saveAnswersDto,
    )
  }

  @Get()
  findAll(
    @Req() request: any,
    @Query() filterDto: FilterInspectionQuestionDto,
  ) {
    return this.inspectionQuestionsService.findAll(filterDto)
  }

  @Get("inspection-report")
  findAllReports(@Query() filterDto: FilterInspectionReportDto) {
    return this.inspectionQuestionsService.getAllInspectionReports(filterDto)
  }

  @Get(":id")
  findOne(@Param("id") id: string) {
    return this.inspectionQuestionsService.findOne(+id)
  }

  @Get("inspection-report/:id")
  getInspectionReport(@Param("id") id: string) {
    return this.inspectionQuestionsService.getInspectionReport(+id)
  }

  @Patch(":id")
  update(
    @Param("id") id: string,
    @Body() updateDto: UpdateInspectionQuestionsDto,
  ) {
    return this.inspectionQuestionsService.update(+id, updateDto)
  }

  @Patch(":id/inspection-report-photos")
  @UseInterceptors(
    FileFieldsInterceptor(
      [
        { name: "front_side_photo", maxCount: 1 },
        { name: "right_side_photo", maxCount: 1 },
        { name: "back_side_photo", maxCount: 1 },
        { name: "left_side_photo", maxCount: 1 },
      ],
      inspectionReportPhotoUploadConfig,
    ),
  )
  @ApiConsumes("multipart/form-data")
  @ApiBody({
    schema: {
      type: "object",
      properties: {
        front_side_photo: { type: "string", format: "binary" },
        right_side_photo: { type: "string", format: "binary" },
        back_side_photo: { type: "string", format: "binary" },
        left_side_photo: { type: "string", format: "binary" },
      },
      required: [],
    },
  })
  async updateInspectionPhotos(
    @Param("id") id: number,
    @UploadedFiles()
    files: {
      front_side_photo?: Express.Multer.File[]
      right_side_photo?: Express.Multer.File[]
      back_side_photo?: Express.Multer.File[]
      left_side_photo?: Express.Multer.File[]
    },
  ) {
    return this.inspectionQuestionsService.uploadInspectionReportPhotos(
      id,
      files,
    )
  }

  @Delete(":id")
  remove(@Param("id") id: string) {
    return this.inspectionQuestionsService.remove(+id)
  }

  @Delete("remove-option/:questionId/:optionId")
  removeOption(
    @Param("questionId") questionId: number,
    @Param("optionId") optionId: number,
  ) {
    return this.inspectionQuestionsService.removeOption(questionId, optionId)
  }
}
