﻿import {
  Body,
  Controller,
  Get,
  Param,
  Post,
  Put,
  Query,
  Request,
  UseGuards,
} from "@nestjs/common";
import {
  ApiBearerAuth,
  ApiOperation,
  ApiQuery,
  ApiTags,
} from "@nestjs/swagger";
import { RequirePermission } from "../auth/decorators/require-permission.decorator";
import { JwtAuthGuard } from "../auth/guards/jwt-auth.guard";
import { PermissionGuard } from "../auth/guards/permission.guard";
import { CreateVehiculoDto } from "./dto/create-vehiculo.dto";
import { UpdateVehiculoDto } from "./dto/update-vehiculo.dto";
import { VehiculosService } from "./vehiculos.service";

@ApiTags("vehiculos")
@ApiBearerAuth()
@UseGuards(JwtAuthGuard, PermissionGuard)
@RequirePermission("vehiculos", "read")
@Controller("vehiculos")
export class VehiculosController {
  constructor(private readonly vehiculosService: VehiculosService) {}

  @Get()
  @ApiOperation({ summary: "Listar vehículos" })
  @ApiQuery({ name: "clienteId", required: false })
  async findAll(@Query("clienteId") clienteId?: string) {
    return this.vehiculosService.findAll(clienteId);
  }

  @Get("search")
  @ApiOperation({ summary: "Buscar vehículos por placa, marca o modelo" })
  @ApiQuery({ name: "q", required: true })
  async search(@Query("q") q: string, @Query("limit") limit?: number) {
    return this.vehiculosService.search(q, limit);
  }

  @Get("placa/:placa")
  @ApiOperation({ summary: "Obtener vehículo por placa" })
  async findByPlaca(@Param("placa") placa: string) {
    return this.vehiculosService.findByPlaca(placa);
  }

  @Get(":id")
  @ApiOperation({ summary: "Obtener vehículo por ID" })
  async findById(@Param("id") id: number) {
    return this.vehiculosService.findById(id);
  }

  @Post()
  @RequirePermission("vehiculos", "write")
  @ApiOperation({ summary: "Crear vehículo" })
  async create(@Body() dto: CreateVehiculoDto, @Request() req: any) {
    return this.vehiculosService.create(dto, req.user?.id);
  }

  @Put(":id")
  @RequirePermission("vehiculos", "write")
  @ApiOperation({ summary: "Actualizar vehículo" })
  async update(
    @Param("id") id: number,
    @Body() dto: UpdateVehiculoDto,
    @Request() req: any,
  ) {
    return this.vehiculosService.update(id, dto, req.user?.id);
  }
}
