import { Injectable, Logger } from '@nestjs/common';
import { Cron, CronExpression } from '@nestjs/schedule';
import { PrismaService } from 'src/prisma/prisma.service';

const HORAS_INACTIVIDAD = 48;

/**
 * Cierra los tickets sin actividad (plan §6.4). Si quedó a mitad de camino sin
 * resultado, es ABANDONADO; si nunca hubo consulta real, SIN_CONSULTA. Ninguno
 * de los dos cuenta en la autoresolución.
 */
@Injectable()
export class CierreInactividadCron {
  private readonly logger = new Logger(CierreInactividadCron.name);

  constructor(private readonly prisma: PrismaService) {}

  @Cron(CronExpression.EVERY_HOUR)
  async cerrar() {
    const limite = new Date(Date.now() - HORAS_INACTIVIDAD * 3_600_000);
    const ahora = new Date();
    const base = { estado: 'ABIERTO' as const, last_activity_at: { lt: limite } };
    const [abandonados, sinConsulta, resto] = await this.prisma.$transaction([
      this.prisma.tickets.updateMany({
        where: { ...base, resultado: null, es_consulta_real: true },
        data: { estado: 'CERRADO', resultado: 'ABANDONADO', cerrado_at: ahora },
      }),
      this.prisma.tickets.updateMany({
        where: { ...base, resultado: null, es_consulta_real: false },
        data: { estado: 'CERRADO', resultado: 'SIN_CONSULTA', cerrado_at: ahora },
      }),
      this.prisma.tickets.updateMany({ where: base, data: { estado: 'CERRADO', cerrado_at: ahora } }),
    ]);
    const total = abandonados.count + sinConsulta.count + resto.count;
    if (total > 0) this.logger.log(`Cerrados por inactividad: ${total} (abandonados ${abandonados.count})`);
  }
}
