import { Body, Controller, Get, Param, Patch, Post, Query, UseGuards, ValidationPipe } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiBody, ApiOperation, ApiQuery, ApiTags } from '@nestjs/swagger';
import { RequirePermission } from 'src/auth/decorators/require-permission.decorator';
import { RequireSubmodulo } from 'src/auth/decorators/require-submodulo.decorator';
import type { LoginUserInfo } from 'src/auth/dto/login.dto';
import { GetUser } from 'src/auth/get-user.decorator';
import { PermissionGuard } from 'src/auth/guards/permission.guard';
import { SubmoduloGuard } from 'src/auth/guards/submodulo.guard';
import { ConvertirLeadDto } from './dto/convertir-lead.dto';
import { CreateLeadDto } from './dto/create-lead.dto';
import { DescartarLeadDto } from './dto/descartar-lead.dto';
import { UpdateLeadDto } from './dto/update-lead.dto';
import { LeadsService } from './leads.service';

@ApiTags('CRM · Leads')
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'), SubmoduloGuard)
@RequireSubmodulo('CRM_LEADS')
@Controller({ path: 'crm/leads', version: '1' })
export class LeadsController {
  constructor(private readonly leadsService: LeadsService) {}

  @Get()
  @UseGuards(PermissionGuard)
  @RequirePermission('CRM', 'CRM_LEA_LEAD_VER')
  @ApiQuery({ name: 'estado', required: false })
  @ApiQuery({ name: 'asignado_a', required: false })
  @ApiQuery({ name: 'texto', required: false, description: 'Busca en nombre, empresa, email, teléfono y RUC.' })
  findAll(
    @GetUser() user: LoginUserInfo,
    @Query('estado') estado?: string,
    @Query('asignado_a') asignado_a?: string,
    @Query('texto') texto?: string,
  ) {
    return this.leadsService.findAll(user.empresa_id, { estado, asignado_a, texto });
  }

  @Get(':id')
  @UseGuards(PermissionGuard)
  @RequirePermission('CRM', 'CRM_LEA_LEAD_VER')
  findOne(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.leadsService.findOne(id, user.empresa_id);
  }

  @Post()
  @UseGuards(PermissionGuard)
  @RequirePermission('CRM', 'CRM_LEA_LEAD_CREAR')
  @ApiOperation({
    summary: 'Alta de lead con deduplicación',
    description:
      'Si el contacto ya es cliente devuelve { duplicado: "cliente", cliente_id } y NO crea nada. ' +
      'Si ya hay un lead abierto devuelve { duplicado: "lead", lead }. No lanza 409: el llamador ' +
      'suele ser un webhook y un error ahí sólo genera reintentos.',
  })
  @ApiBody({ type: CreateLeadDto })
  create(@Body(ValidationPipe) dto: CreateLeadDto, @GetUser() user: LoginUserInfo) {
    return this.leadsService.create(dto, user.empresa_id, user.id);
  }

  @Patch(':id')
  @UseGuards(PermissionGuard)
  @RequirePermission('CRM', 'CRM_LEA_LEAD_EDITAR')
  @ApiBody({ type: UpdateLeadDto })
  update(@Param('id') id: string, @Body(ValidationPipe) dto: UpdateLeadDto, @GetUser() user: LoginUserInfo) {
    return this.leadsService.update(id, dto, user.empresa_id, user.id);
  }

  @Post(':id/convertir')
  @UseGuards(PermissionGuard)
  @RequirePermission('CRM', 'CRM_LEA_LEAD_CONVERTIR')
  @ApiOperation({
    summary: 'Convierte el lead en cliente',
    description: 'El cliente se crea vía ClientesService, nunca por insert directo.',
  })
  @ApiBody({ type: ConvertirLeadDto })
  convertir(@Param('id') id: string, @Body(ValidationPipe) dto: ConvertirLeadDto, @GetUser() user: LoginUserInfo) {
    return this.leadsService.convertir(id, dto, user.empresa_id, user.id);
  }

  @Post(':id/descartar')
  @UseGuards(PermissionGuard)
  @RequirePermission('CRM', 'CRM_LEA_LEAD_ELIMINAR')
  @ApiOperation({ summary: 'Descarta el lead. El motivo es obligatorio.' })
  @ApiBody({ type: DescartarLeadDto })
  descartar(@Param('id') id: string, @Body(ValidationPipe) dto: DescartarLeadDto, @GetUser() user: LoginUserInfo) {
    return this.leadsService.descartar(id, dto, user.empresa_id, user.id);
  }
}
