// Copyright (C) 2014 The Android Open Source Project
//
// Licensed 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.

package com.googlesource.gerrit.plugins.gitblit;

import java.net.InetAddress;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.UnknownHostException;
import java.util.Arrays;
import java.util.List;

import org.eclipse.jgit.lib.Config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.common.base.MoreObjects;

public class GitBlitUrlsConfig {
  private static final int SSH_DEF_PORT = 22;
  private static final String GITBLIT_REPO = "{0}";
  private static final String GITBLIT_USER = "{1}";
  private static final Logger log = LoggerFactory
      .getLogger(GitBlitUrlsConfig.class);

  private String canonicalWebUrlString;
  private String sshdListenAddressString;
  private String httpdListenUrlString;
  private List<String> downloadSchemes;

  public GitBlitUrlsConfig(Config config) {
    canonicalWebUrlString = config.getString("gerrit", null, "canonicalWebUrl");
    sshdListenAddressString = config.getString("sshd", null, "listenAddress");
    httpdListenUrlString = config.getString("httpd", null, "listenUrl");
    downloadSchemes = Arrays.asList(config.getStringList("download", null, "scheme"));
  }

  public String getGitSshUrl() {
    if (sshdListenAddressString == null) {
      return "";
    }
    if (!downloadSchemes.isEmpty() && !downloadSchemes.contains("ssh")) {
      return "";
    }

    String[] urlParts = sshdListenAddressString.split(":");
    if (urlParts.length < 2) {
      log.error("Invalid SSHD listenUrl: " + sshdListenAddressString);
      return "";
    }
    try {
      String hostname = getHost(urlParts[0]);
      int port = getPort(urlParts[1]);

      return "ssh://" + GITBLIT_USER + "@" + hostname
          + (port == SSH_DEF_PORT ? "" : ":" + port) + "/" + GITBLIT_REPO + "";
    } catch (UnknownHostException e) {
      log.error("Cannot detect localhostname");
      return "";
    }
  }

  private int getPort(String port) {
    return Integer.parseInt(port);
  }

  private String getHost(String hostname) throws UnknownHostException {
    if (hostname.equals("*")) {
      try {
        if (canonicalWebUrlString != null) {
          return new URI(canonicalWebUrlString).getHost();
        }
      } catch (URISyntaxException e) {
        log.error("Cannot parse canonicalWebUrl and get external hostname,"
            + " fallback to auto-detected local hostname", e);
      }
      return InetAddress.getLocalHost().getCanonicalHostName();
    } else {
      return hostname;
    }
  }

  public String getGitHttpUrl() throws UnknownHostException {
    String httpListenUrl = getHttpListenUrl();
    if (httpListenUrl == null) {
      return "";
    }
      if (!downloadSchemes.isEmpty() && !downloadSchemes.contains("http")) {
        return "";
      }

    String httpUrl = MoreObjects.firstNonNull(canonicalWebUrlString, httpListenUrl);
    httpUrl = httpUrl.replace("://", "://" + GITBLIT_USER + "@");
    httpUrl += (httpUrl.endsWith("/") ? "" : "/") + GITBLIT_REPO;
    return httpUrl;
  }

  private String getHttpListenUrl() throws UnknownHostException {
    if (httpdListenUrlString == null) {
      return null;
    }
    String url = httpdListenUrlString.replaceFirst("proxy-", "");
    if (url.indexOf('*') > 0) {
      url =
          url.replaceFirst("\\*", InetAddress.getLocalHost()
              .getCanonicalHostName());
    }
    return url;
  }
}
