import { Injectable } from "@nestjs/common";
import { InjectRepository } from "@nestjs/typeorm";
import { Repository } from "typeorm";
import { TenantConfig } from "./entities/tenant-config.entity";

// Literal "controlPlane" (no CONTROL_PLANE_CONNECTION importado de
// control-plane.module.ts) deliberado: ese modulo importa esta clase para
// registrarla como provider, asi que importar la constante de vuelta desde
// aca cierra un ciclo de modulos ES que deja CONTROL_PLANE_CONNECTION en
// `undefined` al momento de evaluar el decorador (confirmado arrancando la
// app real: @InjectRepository recibia undefined como nombre de conexion,
// generando un token distinto al que registra TypeOrmModule.forFeature en
// control-plane.module.ts). Mismo patron ya usado en identity.service.ts y
// tenancy/tenant-connection-registry.service.ts para el mismo motivo.

@Injectable()
export class TenantConfigService {
  constructor(
    @InjectRepository(TenantConfig, "controlPlane")
    private readonly repository: Repository<TenantConfig>,
  ) {}

  async findByTenantId(tenantId: number): Promise<TenantConfig | null> {
    return this.repository.findOne({ where: { tenantId } });
  }

  // null = el tenant no tiene fila en tenant_config: es un sitio nuevo (o uno
  // que nunca uso estos toggles) y quien llama debe caer al default del
  // catalogo de taller_parametros, que es apagado. Antes devolvia todo true
  // aqui, y eso hacia que un sitio nuevo arrancara con facturacion, tiendas
  // y productos encendidos. Los tenants que ya operaban conservan sus filas
  // (con sus valores) y por eso no cambian de comportamiento.
  async getTogglesOperativos(tenantId: number): Promise<{
    permiteTiendas: boolean;
    permiteProductosPropios: boolean;
    facturaHabilitada: boolean;
  } | null> {
    const config = await this.findByTenantId(tenantId);
    if (!config) return null;
    return {
      permiteTiendas: config.permiteTiendas,
      permiteProductosPropios: config.permiteProductosPropios,
      facturaHabilitada: config.facturaHabilitada,
    };
  }

  async updateTogglesOperativos(
    tenantId: number,
    toggles: Partial<{
      permiteTiendas: boolean;
      permiteProductosPropios: boolean;
      facturaHabilitada: boolean;
    }>,
  ): Promise<TenantConfig> {
    const existing = await this.findByTenantId(tenantId);
    if (existing) {
      await this.repository.update(existing.id, toggles);
      return { ...existing, ...toggles };
    }
    const created = this.repository.create({ tenantId, ...toggles });
    return this.repository.save(created);
  }
}
