import { Body, Controller, Get, Param, Patch, Post, Query, Req, UseGuards, UsePipes, ValidationPipe } from '@nestjs/common';
import { ApiBearerAuth, ApiBody, ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
import { AuthGuard } from 'src/auth/auth.guard';
import { RolesGuard } from 'src/guard/role.guard';
import { Roles } from 'src/guard/decorators/role.decorator';
import { CommonService } from 'src/common/common.service';
import { PANEL_ROLES } from 'src/user/schema/users.schema';
import { CustomerService } from './customer.service';
import { CreateCustomerDto, CustomerListDto, UpdateCustomerDto } from './dto/customer.dto';

@ApiTags('Customers')
@ApiBearerAuth('access_token')
@UseGuards(AuthGuard, RolesGuard)
@Roles(...PANEL_ROLES)
@UsePipes(new ValidationPipe({ transform: true, whitelist: true }))
@Controller('admin/customers')
export class CustomerController {
    constructor(
        private readonly customerService: CustomerService,
        private readonly common: CommonService
    ) { }

    @Post()
    @ApiOperation({ summary: 'Add a customer (one record per mobile number)' })
    @ApiBody({ type: CreateCustomerDto })
    @ApiResponse({ status: 400, description: 'A customer with this mobile already exists' })
    create(@Req() req: any, @Body() dto: CreateCustomerDto) {
        return this.customerService.create(dto, req.user_data, this.common.getUserLanguage(req));
    }

    @Get()
    @ApiOperation({ summary: 'List customers with lead counts and last activity' })
    list(@Req() req: any, @Query() query: CustomerListDto) {
        return this.customerService.list(query, req.user_data, this.common.getUserLanguage(req));
    }

    @Get(':id')
    @ApiOperation({ summary: 'Customer profile with their leads. Policies and claims are added by those modules later.' })
    @ApiResponse({ status: 404, description: 'Customer not found' })
    getById(@Req() req: any, @Param('id') id: string) {
        return this.customerService.getById(id, req.user_data, this.common.getUserLanguage(req));
    }

    @Patch(':id')
    @ApiOperation({ summary: 'Edit customer details' })
    @ApiBody({ type: UpdateCustomerDto })
    update(@Req() req: any, @Param('id') id: string, @Body() dto: UpdateCustomerDto) {
        return this.customerService.update(id, dto, this.common.getUserLanguage(req));
    }
}
