import { Controller, Get, Param, Query, UseGuards } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiOperation, ApiTags } from '@nestjs/swagger';
import type { LoginUserInfo } from '../../auth/dto/login.dto';
import { RequireModule, RequirePermission } from '../../auth/decorators';
import { ModuleGuard } from '../../auth/guards/module.guard';
import { PermissionGuard } from '../../auth/guards/permission.guard';
import { GetUser } from '../../auth/get-user.decorator';
import { CarteraConfigService } from '../config/cartera-config.service';
import { WorklistQueryDto } from '../dto/worklist-query.dto';
import { CarteraImportadaFuente } from '../fuentes/cartera-importada-fuente.service';
import { ErpNovasisFuente } from '../fuentes/erp-novasis-fuente.service';
import { WorklistService } from './worklist.service';

@ApiTags('Cartera Inteligente — Worklist')
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'), ModuleGuard, PermissionGuard)
@RequireModule('COBRANZAS')
@Controller({ path: 'cartera', version: '1' })
export class WorklistController {
  constructor(
    private readonly worklistService: WorklistService,
    private readonly configService: CarteraConfigService,
    private readonly erpNovasisFuente: ErpNovasisFuente,
    private readonly carteraImportadaFuente: CarteraImportadaFuente,
  ) {}

  @Get('worklist')
  @RequirePermission('COBRANZAS', 'COB_CART_VER')
  @ApiOperation({ summary: 'Listar cuentas pendientes priorizadas por mora' })
  worklist(@Query() query: WorklistQueryDto, @GetUser() user: LoginUserInfo) {
    return this.worklistService.getPriorizada(user.empresa_id, user.id, query);
  }

  @Get('cuentas/:id')
  @RequirePermission('COBRANZAS', 'COB_CART_VER')
  @ApiOperation({ summary: 'Obtener detalle de una cuenta + cuotas' })
  async detalle(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    const config = await this.configService.getOrCreate(user.empresa_id);
    const fuente =
      config.fuente_default === 'cartera-importada'
        ? this.carteraImportadaFuente
        : this.erpNovasisFuente;
    return fuente.obtenerCuenta(id);
  }
}
