import { Body, Controller, Get, Param, Post, Put, Query, Res, UseGuards } from '@nestjs/common';
import type { Response } from 'express';
import { ErpJwtGuard } from 'src/sesion/erp-jwt.guard';
import { NovasisGuard } from 'src/sesion/novasis.guard';
import {
  GuardarConfigDto,
  AdjuntoReporteParams,
  EtiquetaDto,
  MensajeParams,
  RangoQuery,
  TicketIdParams,
  TicketsReporteQuery,
} from './dto/reporte.dto';
import { ReporteService } from './reporte.service';

const DIA = 86_400_000;

function rango(q: RangoQuery) {
  const hasta = q.hasta ? new Date(q.hasta.getTime() + DIA) : new Date(Date.now() + 60_000);
  const desde = q.desde ?? new Date(hasta.getTime() - 30 * DIA);
  return { desde, hasta };
}

/** Solo el superadmin de Novasis (D11). Ve todas las empresas: es el único lugar del servicio que lo hace. */
@Controller({ path: 'reporte', version: '1' })
@UseGuards(ErpJwtGuard, NovasisGuard)
export class ReporteController {
  constructor(private readonly reporte: ReporteService) {}

  /** Configuración operativa del agente. Nunca secretos (ni API keys ni tokens). */
  @Get('configuracion')
  configuracion() {
    return this.reporte.configuracion();
  }

  @Put('configuracion')
  guardarConfiguracion(@Body() dto: GuardarConfigDto) {
    return this.reporte.guardarConfiguracion(dto.clave as never, dto.empresa_id ?? null, dto.valor ?? null);
  }

  @Post('configuracion/youtrack/probar')
  probarYoutrack() {
    return this.reporte.probarYoutrack();
  }

  @Get('resumen')
  resumen(@Query() q: RangoQuery) {
    return this.reporte.resumen(rango(q));
  }

  @Get('tickets')
  tickets(@Query() q: TicketsReporteQuery) {
    return this.reporte.tickets({
      ...rango(q),
      resultado: q.resultado,
      motivo: q.motivo,
      empresaId: q.empresa_id,
      pagina: q.pagina ?? 1,
    });
  }

  @Get('tickets/:id')
  detalle(@Param() p: TicketIdParams) {
    return this.reporte.detalle(p.id);
  }

  @Get('tickets/:id/adjuntos/:adjunto')
  async adjunto(@Param() p: AdjuntoReporteParams, @Res() res: Response) {
    const a = await this.reporte.adjunto(p.id, p.adjunto);
    res.setHeader('Content-Type', a.tipo);
    res.setHeader('Cache-Control', 'private, max-age=3600');
    res.setHeader('X-Content-Type-Options', 'nosniff');
    res.end(a.datos);
  }

  @Put('tickets/:id/mensajes/:orden/etiqueta')
  etiquetar(@Param() p: MensajeParams, @Body() dto: EtiquetaDto) {
    return this.reporte.etiquetar(p.id, p.orden, dto.correcta);
  }
}
