import {
  Controller,
  Get,
  Post,
  Body,
  Patch,
  Param,
  Delete,
  ParseIntPipe,
  Query,
  UseGuards,
} from "@nestjs/common"
import { VehicleManufacturerService } from "./vehicle-manufacturer.service"
import { CreateVehicleManufacturerDto } from "../dto/create-vehicle-manufacturer.dto"
import { UpdateVehicleManufacturerDto } from "../dto/update-vehicle-manufacturer.dto"
import {
  ApiTags,
  ApiOperation,
  ApiResponse,
  ApiQuery,
  ApiBearerAuth,
} from "@nestjs/swagger"
import { VehicleManufacturer } from "../entities/vehicle-manufacturer.entity"
import { AuthGuardMiddleware } from "src/middleware/auth-guard.middleware"

@ApiTags("Vehicle Manufacturers")
@UseGuards(AuthGuardMiddleware)
@ApiBearerAuth("access-token")
@Controller("vehicle-manufacturers")
export class VehicleManufacturerController {
  constructor(
    private readonly vehicleManufacturerService: VehicleManufacturerService,
  ) {}

  @Post()
  @ApiOperation({ summary: "Create a new vehicle manufacturer" })
  @ApiResponse({
    status: 201,
    description: "Vehicle manufacturer created successfully",
    type: VehicleManufacturer,
  })
  create(@Body() createVehicleManufacturerDto: CreateVehicleManufacturerDto) {
    return this.vehicleManufacturerService.create(createVehicleManufacturerDto)
  }

  @Get()
  @ApiOperation({
    summary: "Get all vehicle manufacturers with pagination and search",
  })
  @ApiQuery({
    name: "limit",
    required: false,
  })
  @ApiQuery({
    name: "skip",
    required: false,
  })
  @ApiQuery({
    name: "search",
    required: false,
    type: String,
    description: "Search term for vehicle manufacturer name",
  })
  @ApiQuery({
    name: "sortBy",
    required: false,
    type: String,
    description: "Sort column: id, name, created_at, updated_at",
  })
  @ApiQuery({
    name: "sortOrder",
    required: false,
    type: String,
    enum: ["ASC", "DESC"],
    description: "Sort order: ASC or DESC",
  })
  findAll(
    @Query("limit", new ParseIntPipe({ optional: true })) limit?: string,
    @Query("skip", new ParseIntPipe({ optional: true })) skip?: string,
    @Query("search") search?: string,
    @Query("sortBy") sortBy?: string,
    @Query("sortOrder") sortOrder?: string,
  ) {
    return this.vehicleManufacturerService.findAll(
      limit,
      skip,
      search,
      sortBy,
      sortOrder,
    )
  }

  @Get(":id")
  @ApiOperation({ summary: "Get a vehicle manufacturer by id" })
  @ApiResponse({
    status: 200,
    description: "Return the vehicle manufacturer",
    type: VehicleManufacturer,
  })
  @ApiResponse({ status: 404, description: "Vehicle manufacturer not found" })
  findOne(@Param("id", ParseIntPipe) id: number) {
    return this.vehicleManufacturerService.findOne(id)
  }

  @Patch(":id")
  @ApiOperation({ summary: "Update a vehicle manufacturer" })
  @ApiResponse({
    status: 200,
    description: "Vehicle manufacturer updated successfully",
    type: VehicleManufacturer,
  })
  @ApiResponse({ status: 404, description: "Vehicle manufacturer not found" })
  update(
    @Param("id", ParseIntPipe) id: number,
    @Body() updateVehicleManufacturerDto: UpdateVehicleManufacturerDto,
  ) {
    return this.vehicleManufacturerService.update(
      id,
      updateVehicleManufacturerDto,
    )
  }

  @Delete(":id")
  @ApiOperation({ summary: "Delete a vehicle manufacturer" })
  @ApiResponse({
    status: 200,
    description: "Vehicle manufacturer deleted successfully",
  })
  @ApiResponse({ status: 404, description: "Vehicle manufacturer not found" })
  remove(@Param("id", ParseIntPipe) id: number) {
    return this.vehicleManufacturerService.remove(id)
  }

  @Get(":id/vehicle-models")
  @ApiOperation({
    summary: "Get all vehicles of a vehicle manufacturer",
  })
  async getVehicleManufacturerWiseVehicles(@Param("id") id: number) {
    return this.vehicleManufacturerService.getVehicleManufacturerWiseVehicles(
      id,
    )
  }
}
