import {
  AssistantCloudAPI,
  type AssistantCloudConfig,
  type SdkIdentity,
  type AssistantCloudTelemetryConfig,
} from "./AssistantCloudAPI";
import { AssistantCloudAuthTokens } from "./AssistantCloudAuthTokens";
import { AssistantCloudProjects } from "./AssistantCloudProjects";
import { AssistantCloudRuns } from "./AssistantCloudRuns";
import { AssistantCloudThreads } from "./AssistantCloudThreads";
import { AssistantCloudFiles } from "./AssistantCloudFiles";
import {
  AssistantCloudEvents,
  clearPendingAssistantCloudEvents,
} from "./AssistantCloudEvents";
import { AssistantCloudScores } from "./AssistantCloudScores";

export class AssistantCloud {
  public readonly threads;
  public readonly projects;
  public readonly auth;
  public readonly runs;
  public readonly files;
  public readonly events;
  public readonly scores;
  public readonly telemetry: AssistantCloudTelemetryConfig;
  public readonly registerSdk: (sdk: SdkIdentity) => void;

  constructor(config: AssistantCloudConfig) {
    const api = new AssistantCloudAPI(config);
    this.registerSdk = api.registerSdk;
    const t = config.telemetry;
    const telemetry =
      t === false
        ? { enabled: false }
        : t === true || t === undefined
          ? { enabled: true }
          : {
              ...t,
              enabled: t.enabled !== false,
            };
    this.telemetry = new Proxy(telemetry, {
      set: (target, property, value) => {
        const updated = Reflect.set(target, property, value);
        if (
          (property === "enabled" || property === "events") &&
          (target.enabled === false || target.events === false)
        ) {
          clearPendingAssistantCloudEvents(this.events);
        }
        return updated;
      },
    });

    this.threads = new AssistantCloudThreads(api);
    this.projects = new AssistantCloudProjects(api);
    this.auth = {
      tokens: new AssistantCloudAuthTokens(api),
      invalidate: () => {
        api.invalidateAuth();
        clearPendingAssistantCloudEvents(this.events);
      },
    };
    this.runs = new AssistantCloudRuns(api);
    this.files = new AssistantCloudFiles(api);
    this.events = new AssistantCloudEvents(
      api,
      () => this.telemetry.enabled !== false && this.telemetry.events !== false,
    );
    this.scores = new AssistantCloudScores(api);
  }
}
