import { Injectable } from '@nestjs/common';
import { PrismaService } from 'src/prisma/prisma.service';
import { EstadoSuscripcion } from 'src/suscripciones/dto/enum-sucripcion';

@Injectable()
export class ModulosService {
  constructor(private readonly prisma: PrismaService) {}

  /** Retorna todos los módulos activos del sistema (uso interno). */
  findAll() {
    return this.prisma.modulos.findMany({
      where: { active: true },
      orderBy: { codigo: 'asc' },
    });
  }

  /**
   * Retorna solo los módulos habilitados para la suscripción activa de la empresa.
   * Si la empresa no tiene suscripción activa (ej: superAdmin) retorna todos los módulos.
   */
  async findAllForEmpresa(empresaId: string) {
    const suscripcion = await this.prisma.suscripciones.findFirst({
      where: {
        empresa_id: empresaId,
        estado: {
          in: [EstadoSuscripcion.Activo, EstadoSuscripcion.EnGracia, EstadoSuscripcion.Pausado],
        },
      },
      orderBy: { created_at: 'desc' },
      select: { id: true },
    });

    if (!suscripcion) {
      // Sin suscripción → superAdmin u otro caso especial → todos los módulos
      return this.findAll();
    }

    const moduloIds = await this.prisma.suscripcion_modulos.findMany({
      where: {
        suscripcion_id: suscripcion.id,
        activo: true,
        modulos: { active: true },
      },
      select: { modulo_id: true },
    });

    const ids = moduloIds.map((m) => m.modulo_id).filter(Boolean) as string[];

    if (!ids.length) return [];

    return this.prisma.modulos.findMany({
      where: { id: { in: ids }, active: true },
      orderBy: { codigo: 'asc' },
    });
  }
}
