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 } });
  }

  // Defaults explicitos (todo true) para un tenant que TODAVIA no tiene fila
  // en tenant_config -- pasa con cualquier tenant creado antes de esta
  // feature, o uno nuevo antes de que un admin toque sus toggles por primera
  // vez. Sin esto, activarTenant() tendria que decidir el default en dos
  // lugares (aca y en el gate) -- un solo lugar de verdad.
  async getTogglesOperativos(
    tenantId: number,
  ): Promise<{ permiteTiendas: boolean; permiteProductosPropios: boolean; facturaHabilitada: boolean }> {
    const config = await this.findByTenantId(tenantId);
    if (!config) {
      return { permiteTiendas: true, permiteProductosPropios: true, facturaHabilitada: true };
    }
    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);
  }
}
