// Copyright 2017 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Command server serves get.golang.org, redirecting users to the appropriate
// getgo installer based on the request path.
package server

import (
	"fmt"
	"net/http"
	"strings"
	"time"
)

const (
	base             = "https://dl.google.com/go/getgo/"
	windowsInstaller = base + "installer.exe"
	linuxInstaller   = base + "installer_linux"
	macInstaller     = base + "installer_darwin"
)

// substring-based redirects.
var stringMatch = map[string]string{
	// via uname, from bash
	"MINGW":  windowsInstaller, // Reported as MINGW64_NT-10.0 in git bash
	"Linux":  linuxInstaller,
	"Darwin": macInstaller,
}

func init() {
	http.HandleFunc("/", handler)
}

func handler(w http.ResponseWriter, r *http.Request) {
	if containsIgnoreCase(r.URL.Path, "installer.exe") {
		// cache bust
		http.Redirect(w, r, windowsInstaller+cacheBust(), http.StatusFound)
		return
	}

	for match, redirect := range stringMatch {
		if containsIgnoreCase(r.URL.Path, match) {
			http.Redirect(w, r, redirect, http.StatusFound)
			return
		}
	}

	http.NotFound(w, r)
}

func containsIgnoreCase(s, substr string) bool {
	return strings.Contains(
		strings.ToLower(s),
		strings.ToLower(substr),
	)
}

func cacheBust() string {
	return fmt.Sprintf("?%d", time.Now().Nanosecond())
}
