import { Body, Controller, Get, Param, Patch, Post, Query, UseGuards } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiOperation, ApiTags } from '@nestjs/swagger';
import type { LoginUserInfo } from 'src/auth/dto/login.dto';
import { GetUser } from 'src/auth/get-user.decorator';
import { RequireModule, RequirePermission } from 'src/auth/decorators';
import { ModuleGuard } from 'src/auth/guards/module.guard';
import { PermissionGuard } from 'src/auth/guards/permission.guard';
import {
  AnularGestionDto,
  CreateGestionDto,
  QueryGestionesDto,
  UpdateGestionDto,
} from './dto/gestiones.dto';
import { GestionesService } from './gestiones.service';

@ApiTags('Workflow Cobranza - Gestiones')
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'), ModuleGuard, PermissionGuard)
@RequireModule('COBRANZAS')
@Controller({ path: 'cobranzas/gestiones', version: '1' })
export class GestionesController {
  constructor(private readonly service: GestionesService) {}

  @Post()
  @RequirePermission('COBRANZAS', 'COB_WFL_GESTION_REGISTRAR')
  @ApiOperation({ summary: 'Registrar una gestión de cobranza' })
  create(@Body() dto: CreateGestionDto, @GetUser() user: LoginUserInfo) {
    return this.service.create(dto, user.empresa_id, user.id);
  }

  @Get()
  @RequirePermission('COBRANZAS', 'COB_WFL_GESTION_VER')
  @ApiOperation({ summary: 'Listar gestiones con filtros' })
  findAll(@Query() query: QueryGestionesDto, @GetUser() user: LoginUserInfo) {
    return this.service.findAll(user.empresa_id, query);
  }

  @Get('cliente/:clienteId/timeline')
  @RequirePermission('COBRANZAS', 'COB_WFL_GESTION_VER')
  @ApiOperation({ summary: 'Línea de tiempo de gestiones de un cliente' })
  getTimeline(@Param('clienteId') clienteId: string, @GetUser() user: LoginUserInfo) {
    return this.service.getTimeline(clienteId, user.empresa_id);
  }

  @Get('proximas-acciones/:cobradorId')
  @RequirePermission('COBRANZAS', 'COB_WFL_GESTION_VER')
  @ApiOperation({ summary: 'Próximas acciones programadas para un cobrador' })
  getProximasAcciones(@Param('cobradorId') cobradorId: string, @GetUser() user: LoginUserInfo) {
    return this.service.getProximasAcciones(cobradorId, user.empresa_id);
  }

  @Get('mi-agenda')
  @RequirePermission('COBRANZAS', 'COB_WFL_GESTION_VER')
  @ApiOperation({
    summary:
      'Agenda del usuario actual (vencidas / hoy / próximas 7 días). scope=oficina para supervisores.',
  })
  miAgenda(@GetUser() user: LoginUserInfo, @Query('scope') scope?: string) {
    const s = scope === 'oficina' ? 'oficina' : 'mias';
    return this.service.miAgenda(user.empresa_id, user.id, s);
  }

  @Get('reporte-productividad')
  @RequirePermission('COBRANZAS', 'COB_WFL_REPORTE_PRODUCTIVIDAD')
  @ApiOperation({ summary: 'Reporte de productividad por cobrador' })
  getReporteProductividad(
    @Query('desde') desde: string,
    @Query('hasta') hasta: string,
    @GetUser() user: LoginUserInfo,
  ) {
    return this.service.getReporteProductividad(user.empresa_id, desde, hasta);
  }

  @Patch(':id')
  @RequirePermission('COBRANZAS', 'COB_WFL_GESTION_EDITAR')
  @ApiOperation({ summary: 'Editar gestión (autor el mismo día; supervisor luego)' })
  update(
    @Param('id') id: string,
    @Body() dto: UpdateGestionDto,
    @GetUser() user: LoginUserInfo,
  ) {
    return this.service.update(id, dto, user.empresa_id, user.id);
  }

  @Patch(':id/anular')
  @RequirePermission('COBRANZAS', 'COB_WFL_GESTION_ANULAR')
  @ApiOperation({ summary: 'Anular gestión con motivo' })
  anular(@Param('id') id: string, @Body() dto: AnularGestionDto, @GetUser() user: LoginUserInfo) {
    return this.service.anular(id, dto, user.empresa_id, user.id);
  }

  @Patch(':id/descartar-agenda')
  @RequirePermission('COBRANZAS', 'COB_WFL_GESTION_EDITAR')
  @ApiOperation({ summary: 'Descartar agendamiento (saca próxima fecha/acción sin anular)' })
  descartarAgenda(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.service.descartarAgenda(id, user.empresa_id, user.id);
  }
}
