/**
 * This file lists helpers for returning global constants in Status. These should not change once
 * an instance has booted up, so they need not be returned via JSON requests.
 *
 * Settings are set via <script> on pages in status/pages, filled in by serverside template.
 */

class StatusSettings {
  public swarmingUrl: string = '';
  public treeStatusBaseUrl: string = '';
  // Url with '{{TaskID}}' as a placeholder.
  public logsUrlTemplate: string = '';
  public taskSchedulerUrl: string = '';
  public defaultRepo: string = '';
  public repos: Map<string, string> = new Map();
}

function settings(): StatusSettings | undefined {
  return (<any>window).StatusSettings;
}

// swarmingUrl: Base URL for linking to swarming task data.
export function swarmingUrl() {
  return settings()?.swarmingUrl;
}

// treeStatusBaseUrl: Base URL for getting tree status of specific repos.
export function treeStatusBaseUrl() {
  return settings()?.treeStatusBaseUrl;
}

// taskSchedulerUrl: Base URL for linking to Task Scheduler data.
export function taskSchedulerUrl() {
  return settings()?.taskSchedulerUrl;
}

// logsUrl: Returns a logsUrl for the given taskId.
export function logsUrl(taskId: string): string {
  const temp = settings()?.logsUrlTemplate;
  if (!temp) {
    return '#';
  }
  if (temp.includes('annotations')) {
    if (!taskId.endsWith('0')) {
      return '#';
    }
    // Hack because chromium logs replaces a persistent trailing '0' with a '1' for log urls.
    taskId = taskId.slice(0, -1) + '1';
  }
  return temp.replace('{{TaskID}}', taskId);
}

// defaultRepo: Repo to use on initial load.
export function defaultRepo() {
  return settings()?.defaultRepo || '';
}

// repos: List of available repos.
export function repos() {
  const r = settings()?.repos;
  return r ? [...r.keys()] : [];
}

export function repoUrl(r: string) {
  return settings()?.repos.get(r) || '';
}

// revisionUrlTemplate: Returns the base url for a repo's revisions. Can be
// concatenated with a hash to form a valid url.
export function revisionUrlTemplate(repo: string) {
  return settings()?.repos.get(repo);
}

// SetTestSettings: Inject setting values for tests.
export function SetTestSettings(s: StatusSettings) {
  (<any>window).StatusSettings = s;
}
