import { Body, Controller, Delete, Get, Param, Patch, Post, Query, UseGuards } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiOperation, ApiQuery, ApiTags } from '@nestjs/swagger';
import type { LoginUserInfo } from '../auth/dto/login.dto';
import { GetUser } from '../auth/get-user.decorator';
import { RequireModule, RequirePermission } from '../auth/decorators';
import { ModuleGuard } from '../auth/guards/module.guard';
import { PermissionGuard } from '../auth/guards/permission.guard';
import { CreateVendedorCobradorDto, UpdateVendedorCobradorDto } from './dto';
import { VendedoresCobradoresService } from './vendedores-cobradores.service';

@ApiTags('Vendedores y Cobradores')
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'), ModuleGuard, PermissionGuard)
@RequireModule('COBRANZAS')
@Controller('vendedores-cobradores')
export class VendedoresCobradoresController {
  constructor(private readonly service: VendedoresCobradoresService) {}

  @Post()
  @RequirePermission('COBRANZAS', 'COB_CBR_COBRADOR_CREAR')
  @ApiOperation({ summary: 'Crear un nuevo vendedor/cobrador' })
  create(@GetUser() user: LoginUserInfo, @Body() dto: CreateVendedorCobradorDto) {
    return this.service.create(user.empresa_id, dto, user?.id);
  }

  @Get()
  @RequirePermission('COBRANZAS', 'COB_CBR_COBRADOR_VER')
  @ApiOperation({ summary: 'Listar vendedores/cobradores' })
  @ApiQuery({ name: 'tipo', required: false, enum: ['vendedor', 'cobrador', 'ambos'] })
  @ApiQuery({ name: 'active', required: false, type: Boolean })
  @ApiQuery({ name: 'zona_id', required: false })
  @ApiQuery({ name: 'search', required: false })
  findAll(
    @GetUser() user: LoginUserInfo,
    @Query('tipo') tipo?: string,
    @Query('active') active?: string,
    @Query('zona_id') zona_id?: string,
    @Query('search') search?: string,
  ) {
    return this.service.findAll(user.empresa_id, {
      tipo,
      active: active !== undefined ? active === 'true' : undefined,
      zona_id,
      search,
    });
  }

  @Get('vendedores-activos')
  @RequirePermission('COBRANZAS', 'COB_CBR_COBRADOR_VER')
  @ApiOperation({ summary: 'Listar vendedores activos para asignación' })
  findVendedoresActivos(@GetUser() user: LoginUserInfo) {
    return this.service.findVendedoresActivos(user.empresa_id);
  }

  @Get('cobradores-activos')
  @RequirePermission('COBRANZAS', 'COB_CBR_COBRADOR_VER')
  @ApiOperation({ summary: 'Listar cobradores activos para asignación' })
  findCobradoresActivos(@GetUser() user: LoginUserInfo) {
    return this.service.findCobradoresActivos(user.empresa_id);
  }

  @Get('mi-cobrador')
  @RequirePermission('COBRANZAS', 'COB_CBR_PANEL_COBRADOR_VER')
  @ApiOperation({
    summary: 'Devuelve el vendedor/cobrador vinculado al usuario logueado (o null)',
  })
  miCobrador(@GetUser() user: LoginUserInfo) {
    return this.service.findCobradorVinculado(user.empresa_id, user.id);
  }

  @Get(':id')
  @RequirePermission('COBRANZAS', 'COB_CBR_COBRADOR_VER')
  @ApiOperation({ summary: 'Obtener un vendedor/cobrador por ID' })
  findOne(@GetUser() user: LoginUserInfo, @Param('id') id: string) {
    return this.service.findOne(user.empresa_id, id);
  }

  @Get(':id/estadisticas')
  @RequirePermission('COBRANZAS', 'COB_CBR_COBRADOR_VER')
  @ApiOperation({ summary: 'Obtener estadísticas del vendedor/cobrador' })
  @ApiQuery({ name: 'desde', required: false })
  @ApiQuery({ name: 'hasta', required: false })
  getEstadisticas(
    @GetUser() user: LoginUserInfo,
    @Param('id') id: string,
    @Query('desde') desde?: string,
    @Query('hasta') hasta?: string,
  ) {
    const periodo = desde && hasta ? { desde: new Date(desde), hasta: new Date(hasta) } : undefined;
    return this.service.getEstadisticas(user.empresa_id, id, periodo);
  }

  @Patch(':id')
  @RequirePermission('COBRANZAS', 'COB_CBR_COBRADOR_EDITAR')
  @ApiOperation({ summary: 'Actualizar un vendedor/cobrador' })
  update(@GetUser() user: LoginUserInfo, @Param('id') id: string, @Body() dto: UpdateVendedorCobradorDto) {
    return this.service.update(user.empresa_id, id, dto, user?.id);
  }

  @Patch(':id/toggle-active')
  @RequirePermission('COBRANZAS', 'COB_CBR_COBRADOR_EDITAR')
  @ApiOperation({ summary: 'Activar/desactivar vendedor/cobrador' })
  toggleActive(@GetUser() user: LoginUserInfo, @Param('id') id: string) {
    return this.service.toggleActive(user.empresa_id, id, user?.id);
  }

  @Delete(':id')
  @RequirePermission('COBRANZAS', 'COB_CBR_COBRADOR_ELIMINAR')
  @ApiOperation({ summary: 'Eliminar (desactivar) un vendedor/cobrador' })
  remove(@GetUser() user: LoginUserInfo, @Param('id') id: string) {
    return this.service.remove(user.empresa_id, id, user?.id);
  }
}
