// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.

import { TrouterSettings, TrouterTelemetrySettings } from "@skype/tstrouter";
import { CommunicationTokenCredential, SignalingClientOptions } from "./SignalingClient";
import { generateUuid } from "./TrouterUtils";
import { TrouterConfigClient } from "./TrouterConfigClient";

const defaultSettings: TrouterSettings = {
  version: "1.0.0", // SignalingClient version, required for trouter connection
  registrationId: "", // Required for trouter connection
  sessionId: "", // Required for trouter connection
  pnhAppId: "AcsWeb",
  pnhTemplate: "AcsWeb_Chat_2.1",
  platform: "SPOOL",
  platformUIVersion: "0.0.0",
  environment: "", // TBD
  productName: "acs-chat-web",
  trouterServiceUrl: "",
  registrarServiceUrl: "",
  registrarRefreshTimeoutInMs: 350000,
  timeoutOptions: {
    connectionTimeoutMs: 20000,
    fetchTimeoutMs: 10000,
    pingTimeoutMs: 40000,
    pongTimeoutMs: 5000,
    maxBackoffMs: 50000,
    requestTimeoutMs: 5000,
  },
  maxRegistrationTimeInMs: 7200000,
};

// Main function to create settings based on environment
export const createSettings = async (
  credential: CommunicationTokenCredential,
  options?: SignalingClientOptions
): Promise<TrouterSettings> => {
  const endpoint = options?.resourceEndpoint;

  // Throw an error if resourceEndpoint is null or undefined
  if (endpoint === undefined) {
    throw new Error("'endpoint' cannot be null");
  }

  // Initialize the settings by cloning the default ones
  const settings = { ...defaultSettings };
  settings.registrationId = generateUuid(); // Generate unique IDs
  settings.sessionId = generateUuid();

  // Fetch the real time configuration from the service
  const trouterConfigClient = new TrouterConfigClient(endpoint, options);
  const realTimeNotificationConfiguration = await trouterConfigClient.fetchServiceUrls(credential);

  // Append suffix to trouterServiceUrl and registrarServiceUrl
  settings.trouterServiceUrl = `${realTimeNotificationConfiguration.trouterServiceUrl}/v4/a`;
  settings.registrarServiceUrl = `${realTimeNotificationConfiguration.registrarServiceUrl}/v3/registrations`;

  // Customize settings if the environment is INT
  if (realTimeNotificationConfiguration.cloudType === "int") {
    settings.pnhAppId = "cns-e2e-test";
    settings.pnhTemplate = "cns-e2e-test:1.8";
  }

  settings.maxRegistrationTimeInMs =
    options?.registrationTimeInMs ?? defaultSettings.maxRegistrationTimeInMs;
  return settings;
};

export const defaultTelemetrySettings: TrouterTelemetrySettings = {
  // TBD Can we hook up OpenTelemetry?
  enabled: false,
};
