import {
  Controller,
  Get,
  Post,
  Body,
  Param,
  UseInterceptors,
  UploadedFiles,
  UseGuards,
  Query,
  Req,
} from "@nestjs/common"
import { IncidentReportingService } from "./incident-reporting.service"
import { CreateIncidentReportingDto } from "../dto/create-incident-reporting.dto"
import {
  ApiBearerAuth,
  ApiBody,
  ApiConsumes,
  ApiOperation,
  ApiTags,
} from "@nestjs/swagger"
import { FileFieldsInterceptor } from "@nestjs/platform-express"
import { incidentReportingImageConfig } from "src/common/file-upload/incident-reporting.config"
import { AuthGuardMiddleware } from "src/middleware/auth-guard.middleware"
import { GetIncidentQueryDto } from "../dto/incident-reporting-filter.dto"

@Controller("incident-reporting")
@ApiTags("Incident Reporting")
@UseGuards(AuthGuardMiddleware)
@ApiBearerAuth("access-token")
export class IncidentReportingController {
  constructor(
    private readonly incidentReportingService: IncidentReportingService,
  ) {}

  @Post()
  @ApiOperation({ summary: "Create incident report with multiple images" })
  @ApiConsumes("multipart/form-data")
  @ApiBody({
    schema: {
      type: "object",
      properties: {
        fleet_id: { type: "integer", example: 1 },
        trip_id: { type: "integer", example: 2 },
        issue_type_id: { type: "integer", example: 3 },
        driver_id: { type: "integer", example: 4 },
        issue_title: { type: "string", example: "Broken windshield" },
        comment: { type: "string", example: "xyz" },
        created_date: { type: "string", example: "2025-08-05" },
        created_time: { type: "string", example: "14:30" },
        images: {
          type: "array",
          items: {
            type: "string",
            format: "binary",
          },
        },
      },
    },
  })
  @UseInterceptors(
    FileFieldsInterceptor(
      [{ name: "images", maxCount: 10 }],
      incidentReportingImageConfig,
    ),
  )
  create(
    @Body() createIncidentReportingDto: CreateIncidentReportingDto,
    @UploadedFiles()
    files: {
      images?: Express.Multer.File[]
    },
  ) {
    return this.incidentReportingService.create(
      createIncidentReportingDto,
      files,
    )
  }

  @Get("")
  findAll(
    @Req() request: any,
    @Query() getIncidentQueryDto: GetIncidentQueryDto,
  ) {
    return this.incidentReportingService.findAll(
      request.headers["authorization"],
      getIncidentQueryDto,
    )
  }

  @Get("/incident/types")
  findAllIncidentType() {
    return this.incidentReportingService.findAllIncidentType()
  }

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