import {
  Controller,
  Get,
  Post,
  Body,
  Patch,
  Param,
  Delete,
  ParseIntPipe,
  Query,
  UseGuards,
} from "@nestjs/common"
import {
  ApiTags,
  ApiOperation,
  ApiResponse,
  ApiQuery,
  ApiBearerAuth,
  ApiBody,
} from "@nestjs/swagger"
import { AuthGuardMiddleware } from "src/middleware/auth-guard.middleware"
import { CreateAddOnDto } from "../dto/create-add-ons.dto"
import { UpdateAddOnDto } from "../dto/update-add-ons.dto"
import { AddOn } from "../entities/add-ons.entity"
import { AddOnService } from "./add-ons.service"

@ApiTags("Vehicle Addons V1")
@UseGuards(AuthGuardMiddleware)
@ApiBearerAuth("access-token")
@Controller({ path: "addons", version: "1" })
export class AddOnsController {
  constructor(private readonly addOnService: AddOnService) {}

  @Post()
  @ApiOperation({
    summary: "Create a new vehicle addon",
    description: "Creates a new addon that can be associated with a vehicle",
  })
  @ApiBody({
    type: CreateAddOnDto,
    description: "Addon data including name and status",
  })
  @ApiResponse({
    status: 201,
    description: "Vehicle addon created successfully",
    type: AddOn,
  })
  @ApiResponse({ status: 400, description: "Invalid input data" })
  @ApiResponse({ status: 401, description: "Unauthorized" })
  create(@Body() createVehicleAddonDto: CreateAddOnDto) {
    return this.addOnService.create(createVehicleAddonDto)
  }

  @Get()
  @ApiOperation({
    summary: "Get all vehicle addons with pagination and search",
    description: "Retrieves a list of vehicle addons with optional filters",
  })
  @ApiQuery({ name: "limit", required: false, type: Number })
  @ApiQuery({ name: "skip", required: false, type: Number })
  @ApiQuery({ name: "search", required: false, type: String })
  @ApiQuery({
    name: "sortBy",
    required: false,
    type: String,
    description: "Sort by: id, name, created_at, updated_at",
  })
  @ApiQuery({
    name: "sortOrder",
    required: false,
    type: String,
    enum: ["ASC", "DESC"],
  })
  @ApiQuery({
    name: "vehicle_model_ids",
    required: false,
    type: [Number],
    isArray: true,
    description: "Filter by vehicle model IDs",
  })
  @ApiResponse({
    status: 200,
    description: "Vehicle addons fetched successfully",
    type: [AddOn],
  })
  @ApiResponse({ status: 401, description: "Unauthorized" })
  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,
    @Query("vehicle_model_ids") vehicle_model_ids?: number[],
  ) {
    return this.addOnService.findAll(
      limit,
      skip,
      search,
      sortBy,
      sortOrder,
      vehicle_model_ids,
    )
  }

  @Get("dropdown")
  @ApiOperation({ summary: "Get all vehicle addons for dropdown" })
  findAllForDropdown() {
    return this.addOnService.getAddOnsDropdown()
  }

  @Get("trip-addons")
  @ApiOperation({
    summary: "Get AddOns available for a trip based on active client plan",
  })
  @ApiQuery({
    name: "tripId",
    type: Number,
    required: true,
    description: "Trip ID",
  })
  @ApiQuery({
    name: "search",
    type: String,
    required: false,
    description: "Search term for addon name/description",
  })
  @ApiQuery({
    name: "skip",
    type: Number,
    required: false,
    example: 1,
    description: "Page number for pagination",
  })
  @ApiQuery({
    name: "limit",
    type: Number,
    required: false,
    example: 10,
    description: "Number of records per page",
  })
  async getTripAddOns(
    @Query("tripId") tripId: number,
    @Query("search") search?: string,
    @Query("skip") skip: number = 1,
    @Query("limit") limit: number = 10,
  ) {
    return this.addOnService.getAddOnsForTrip(tripId, search, skip, limit)
  }

  @Get(":id")
  @ApiOperation({ summary: "Get a vehicle addon by ID" })
  @ApiResponse({ status: 200, description: "Success", type: AddOn })
  @ApiResponse({ status: 404, description: "Not found" })
  @ApiResponse({ status: 401, description: "Unauthorized" })
  findOne(@Param("id", ParseIntPipe) id: number) {
    return this.addOnService.findOne(id)
  }

  @Patch(":id")
  @ApiOperation({ summary: "Update a vehicle addon" })
  @ApiBody({ type: UpdateAddOnDto })
  @ApiResponse({
    status: 200,
    description: "Updated successfully",
    type: AddOn,
  })
  @ApiResponse({ status: 404, description: "Not found" })
  @ApiResponse({ status: 401, description: "Unauthorized" })
  update(
    @Param("id", ParseIntPipe) id: number,
    @Body() updateVehicleAddonDto: UpdateAddOnDto,
  ) {
    return this.addOnService.update(id, updateVehicleAddonDto)
  }

  @Delete(":id")
  @ApiOperation({ summary: "Delete a vehicle addon" })
  @ApiResponse({ status: 200, description: "Deleted successfully" })
  @ApiResponse({ status: 404, description: "Not found" })
  @ApiResponse({ status: 401, description: "Unauthorized" })
  remove(@Param("id", ParseIntPipe) id: number) {
    return this.addOnService.remove(id)
  }
}
