﻿import {
  Body,
  Controller,
  Delete,
  Get,
  Param,
  Post,
  Put,
  Query,
  UseGuards,
} from "@nestjs/common";
import {
  ApiBearerAuth,
  ApiOperation,
  ApiQuery,
  ApiResponse,
  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 { ClientesService } from "./clientes.service";
import { CreateClienteDto } from "./dto/create-cliente.dto";
import { SearchClienteDto } from "./dto/search-cliente.dto";
import { UpdateClienteDto } from "./dto/update-cliente.dto";

@ApiTags("clientes")
@ApiBearerAuth()
@UseGuards(JwtAuthGuard, PermissionGuard)
@RequirePermission("clientes", "read")
@Controller("clientes")
export class ClientesController {
  constructor(private readonly clientesService: ClientesService) {}

  @Get()
  @ApiOperation({ summary: "Listar clientes con paginación y búsqueda" })
  @ApiResponse({ status: 200, description: "Lista de clientes" })
  async findAll(@Query() query: SearchClienteDto) {
    return this.clientesService.findAll(query);
  }

  @Get("search")
  @ApiOperation({ summary: "Búsqueda rápida de clientes" })
  @ApiQuery({ name: "q", required: true, description: "Término de búsqueda" })
  @ApiQuery({
    name: "limit",
    required: false,
    description: "Límite de resultados",
  })
  async search(@Query("q") q: string, @Query("limit") limit?: number) {
    return this.clientesService.search(q, limit);
  }

  @Get(":tarjeta")
  @ApiOperation({ summary: "Obtener cliente por tarjeta" })
  @ApiResponse({ status: 200, description: "Cliente encontrado" })
  @ApiResponse({ status: 404, description: "Cliente no encontrado" })
  async findOne(@Param("tarjeta") tarjeta: string) {
    return this.clientesService.findByTarjeta(tarjeta);
  }

  @Post()
  @RequirePermission("clientes", "write")
  @ApiOperation({ summary: "Crear nuevo cliente" })
  @ApiResponse({ status: 201, description: "Cliente creado" })
  @ApiResponse({ status: 409, description: "Cliente ya existe" })
  async create(@Body() createClienteDto: CreateClienteDto) {
    return this.clientesService.create(createClienteDto);
  }

  @Put(":tarjeta")
  @RequirePermission("clientes", "write")
  @ApiOperation({ summary: "Actualizar cliente" })
  @ApiResponse({ status: 200, description: "Cliente actualizado" })
  @ApiResponse({ status: 404, description: "Cliente no encontrado" })
  async update(
    @Param("tarjeta") tarjeta: string,
    @Body() updateClienteDto: UpdateClienteDto,
  ) {
    return this.clientesService.update(tarjeta, updateClienteDto);
  }

  @Delete(":tarjeta")
  @RequirePermission("clientes", "write")
  @ApiOperation({ summary: "Eliminar cliente" })
  @ApiResponse({ status: 200, description: "Cliente eliminado" })
  @ApiResponse({ status: 404, description: "Cliente no encontrado" })
  async delete(@Param("tarjeta") tarjeta: string) {
    return this.clientesService.delete(tarjeta);
  }
}
