import { Controller, Get, Query, Res, UseGuards } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiOperation, ApiTags } from '@nestjs/swagger';
import type { Response } from 'express';
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 { DashboardExportService } from './dashboard-export.service';
import { CarteraDashboardService } from './dashboard.service';

@ApiTags('Cartera Inteligente — Dashboard')
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'), ModuleGuard, PermissionGuard)
@RequireModule('COBRANZAS')
@Controller({ path: 'cartera/dashboard', version: '1' })
export class CarteraDashboardController {
  constructor(
    private readonly service: CarteraDashboardService,
    private readonly exportService: DashboardExportService,
  ) {}

  @Get()
  @RequirePermission('COBRANZAS', 'COB_CART_VER')
  @ApiOperation({ summary: 'KPIs operativos del módulo' })
  get(@GetUser() user: LoginUserInfo, @Query('rango_dias') rangoDias?: string) {
    const r = Math.min(Math.max(Number(rangoDias) || 30, 7), 90);
    return this.service.getDashboard(user.empresa_id, r);
  }

  @Get('export')
  @RequirePermission('COBRANZAS', 'COB_CART_VER')
  @ApiOperation({ summary: 'Exportar dashboard a Excel (6 hojas)' })
  async exportExcel(
    @GetUser() user: LoginUserInfo,
    @Query('rango_dias') rangoDias: string | undefined,
    @Res() res: Response,
  ) {
    const r = Math.min(Math.max(Number(rangoDias) || 30, 7), 90);
    const buffer = await this.exportService.exportarExcel(user.empresa_id, r);
    const filename = `cartera-dashboard-${r}d-${new Date().toISOString().slice(0, 10)}.xlsx`;
    res.setHeader(
      'Content-Type',
      'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
    );
    res.setHeader('Content-Disposition', `attachment; filename="${filename}"`);
    res.send(buffer);
  }
}
