/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import hasOwnProp from 'has-own-prop';

// This is set to the latest available version and should be updated to the next version before release
const DRUID_DOCS_VERSION = '0.19.0';

function fillVersion(str: string): string {
  return str.replace(/\{\{VERSION}}/g, DRUID_DOCS_VERSION);
}

export interface Links {
  websiteHref: string;
  githubHref: string;
  docsHref: string;
  communityHref: string;
  slackHref: string;
  userGroup: string;
  developerGroup: string;
}

const DEFAULT_LINKS: Links = {
  websiteHref: 'https://druid.apache.org',
  githubHref: 'https://github.com/apache/druid',
  docsHref: fillVersion('https://druid.apache.org/docs/{{VERSION}}'),
  communityHref: 'https://druid.apache.org/community/',
  slackHref: 'https://druid.apache.org/community/join-slack',
  userGroup: 'https://groups.google.com/forum/#!forum/druid-user',
  developerGroup: 'https://lists.apache.org/list.html?dev@druid.apache.org',
};

const links = DEFAULT_LINKS;

export function setLinkOverrides(linkOverrides: Links) {
  const keys = Object.keys(DEFAULT_LINKS) as (keyof Links)[];
  for (const k of keys) {
    if (hasOwnProp(linkOverrides, k)) {
      links[k] = fillVersion(String(linkOverrides[k]));
    }
  }
}

export type LinkNames =
  | 'WEBSITE'
  | 'GITHUB'
  | 'DOCS'
  | 'DOCS_SQL'
  | 'DOCS_RUNE'
  | 'DOCS_API'
  | 'COMMUNITY'
  | 'SLACK'
  | 'USER_GROUP'
  | 'DEVELOPER_GROUP';

export function getLink(linkName: LinkNames): string {
  switch (linkName) {
    case 'WEBSITE':
      return links.websiteHref;
    case 'GITHUB':
      return links.githubHref;
    case 'DOCS':
      return links.docsHref;
    case 'DOCS_SQL':
      return `${links.docsHref}/querying/sql.html`;
    case 'DOCS_RUNE':
      return `${links.docsHref}/querying/querying.html`;
    case 'DOCS_API':
      return `${links.docsHref}/operations/api-reference.html`;
    case 'COMMUNITY':
      return links.communityHref;
    case 'SLACK':
      return links.slackHref;
    case 'USER_GROUP':
      return links.userGroup;
    case 'DEVELOPER_GROUP':
      return links.developerGroup;
  }
}
