import {
  Body,
  Controller,
  Delete,
  Get,
  Param,
  Patch,
  Post,
  Query,
  UploadedFiles,
  UseGuards,
  UseInterceptors,
} from "@nestjs/common"
import { FileFieldsInterceptor } from "@nestjs/platform-express"
import {
  ApiBearerAuth,
  ApiBody,
  ApiConsumes,
  ApiOperation,
  ApiResponse,
  ApiTags,
} from "@nestjs/swagger"
import { vehicleInsuranceFileConfig } from "src/common/file-upload/vehicle-insurance-upload.config"
import { AuthGuardMiddleware } from "src/middleware/auth-guard.middleware"
import { CreateVehicleInsuranceDto } from "../dto/create-vehicle-insurance.dto"
import { FindAllVehicleInsuranceDto } from "../dto/find-all-vehicle-insurance.dto"
import { UpdateVehicleInsuranceDto } from "../dto/update-vehicle-insurance.dto"
import { VehicleInsuranceService } from "./vehicle-insurance.service"

@Controller("vehicle-insurance")
@ApiTags("Vehicle Insurance")
@UseGuards(AuthGuardMiddleware)
@ApiBearerAuth("access-token")
export class VehicleInsuranceController {
  constructor(
    private readonly vehicleInsuranceService: VehicleInsuranceService,
  ) {}

  @Post("create")
  @UseInterceptors(
    FileFieldsInterceptor(
      [{ name: "document_file", maxCount: 1 }],
      vehicleInsuranceFileConfig,
    ),
  )
  @ApiConsumes("multipart/form-data")
  @ApiBody({ type: CreateVehicleInsuranceDto })
  async create(
    @Body() createDto: CreateVehicleInsuranceDto,
    @UploadedFiles()
    files: { document_file?: Express.Multer.File[] },
  ) {
    const documentFile = files.document_file?.[0]

    return this.vehicleInsuranceService.create(createDto, documentFile)
  }

  @Get()
  @ApiOperation({ summary: "Get all vehicles with pagination and filters" })
  @ApiResponse({
    status: 200,
    description: "Return all vehicles with pagination and filters",
    type: [CreateVehicleInsuranceDto],
  })
  findAll(@Query() query: FindAllVehicleInsuranceDto) {
    return this.vehicleInsuranceService.findAll(query)
  }

  @Get(":id")
  @ApiOperation({ summary: "Get vehicle by id" })
  findOne(@Param("id") id: number) {
    return this.vehicleInsuranceService.findOne(id)
  }

  @Patch(":id")
  @UseInterceptors(
    FileFieldsInterceptor(
      [{ name: "document_file", maxCount: 1 }],
      vehicleInsuranceFileConfig,
    ),
  )
  @ApiConsumes("multipart/form-data")
  @ApiBody({ type: UpdateVehicleInsuranceDto })
  @ApiOperation({ summary: "Update vehicle insurance by id" })
  async update(
    @Param("id") id: number,
    @Body() updateDto: UpdateVehicleInsuranceDto,
    @UploadedFiles() files: { document_file?: Express.Multer.File[] },
  ) {
    const documentFile = files.document_file?.[0]
    return this.vehicleInsuranceService.update(id, updateDto, documentFile)
  }

  @Delete(":id")
  @ApiOperation({ summary: "Remove vehicle insurance by id" })
  remove(@Param("id") id: number) {
    return this.vehicleInsuranceService.remove(id)
  }

  @Delete(":id/document")
  @ApiOperation({ summary: "Remove vehicle insurance document by id" })
  removeDocument(@Param("id") id: number) {
    return this.vehicleInsuranceService.removeDocument(id)
  }
}
