// 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 com.google.common.base.MoreObjects;
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;

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();
    }
    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;
  }
}
