import { Controller, Get, Post, Put, Delete, Param, Body, UseGuards, Query } from '@nestjs/common';
import { ApiTags, ApiOperation, ApiResponse } from '@nestjs/swagger';
import { CustomerService } from '../services/customer.service';
import { CreateCustomerDto, UpdateCustomerDto } from '../dto/customer.dto';
import { Permissions } from '../auth/decorators/permissions.decorator';
import { RbacGuard } from '../auth/guards/rbac.guard';
import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard';

@ApiTags('Customers')
@Controller('customers')
@UseGuards(JwtAuthGuard, RbacGuard)
export class CustomerController {
  constructor(private readonly customerService: CustomerService) {}

  @Get()
  @ApiOperation({ summary: 'Get all customers' })
  @ApiResponse({ status: 200, description: 'Returns list of customers' })
  @Permissions('manager:customers', 'admin:customers')
  async findAll() {
    return this.customerService.findAll();
  }

  @Get('top')
  @ApiOperation({ summary: 'Get top customers' })
  @ApiResponse({ status: 200, description: 'Returns top customers' })
  @Permissions('manager:customers', 'admin:customers')
  async getTopCustomers() {
    return this.customerService.getTopCustomers();
  }

  @Get(':id')
  @ApiOperation({ summary: 'Get customer by ID' })
  @ApiResponse({ status: 200, description: 'Returns customer details' })
  @Permissions('manager:customers', 'admin:customers')
  async findOne(@Param('id') id: string) {
    return this.customerService.findOne(id);
  }

  @Post()
  @ApiOperation({ summary: 'Create new customer' })
  @ApiResponse({ status: 201, description: 'Customer created successfully' })
  @Permissions('manager:customers', 'admin:customers')
  async create(@Body() createCustomerDto: CreateCustomerDto) {
    return this.customerService.create(createCustomerDto);
  }

  @Put(':id')
  @ApiOperation({ summary: 'Update customer' })
  @ApiResponse({ status: 200, description: 'Customer updated successfully' })
  @Permissions('manager:customers', 'admin:customers')
  async update(
    @Param('id') id: string,
    @Body() updateCustomerDto: UpdateCustomerDto,
  ) {
    return this.customerService.update(id, updateCustomerDto);
  }

  @Delete(':id')
  @ApiOperation({ summary: 'Delete customer' })
  @ApiResponse({ status: 200, description: 'Customer deleted successfully' })
  @Permissions('admin:customers')
  async remove(@Param('id') id: string) {
    return this.customerService.remove(id);
  }

  @Get('status/:status')
  @ApiOperation({ summary: 'Get customers by status' })
  @ApiResponse({ status: 200, description: 'Returns customers by status' })
  @Permissions('manager:customers', 'admin:customers')
  async findByStatus(@Param('status') status: string) {
    return this.customerService.findByStatus(status);
  }

  @Get('search/:term')
  @ApiOperation({ summary: 'Search customers' })
  @ApiResponse({ status: 200, description: 'Returns search results' })
  @Permissions('manager:customers', 'admin:customers')
  async search(@Param('term') term: string) {
    return this.customerService.search(term);
  }
} 