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

package main

import (
	"flag"
	"fmt"
	"io/ioutil"
	"net/http"
	"os"
	"path"
	"path/filepath"
	"strings"
)

type skyHandlerRoot struct {
	root string
}

func skyHandler(root string) http.Handler {
	return &skyHandlerRoot{root}
}

func (handler *skyHandlerRoot) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	if strings.HasPrefix(r.URL.Path, "/.git") {
		w.WriteHeader(http.StatusNotFound)
		return
	}
	path := path.Join(handler.root, r.URL.Path)
	if strings.HasSuffix(path, ".sky") {
		w.Header().Set("Content-Type", "text/sky")
	}
	w.Header().Set("Cache-Control", "no-cache")
	http.ServeFile(w, r, path)
}

func usage() {
	fmt.Fprintf(os.Stderr, "Usage: sky_server [flags] MOJO_SRC_ROOT PORT\n\n")
	fmt.Fprintf(os.Stderr, "launches a basic http server with mappings into the\n")
	fmt.Fprintf(os.Stderr, "mojo repository for framework/service paths.\n")
	fmt.Fprintf(os.Stderr, "[flags] MUST be before arguments, because go:flag.\n\n")
	flag.PrintDefaults()
	os.Exit(2)
}

func addMapping(from_path string, to_path string) {
	// Print to stderr to it's more obvious what this binary does.
	fmt.Fprintf(os.Stderr, "  %s -> %s\n", from_path, to_path)
	http.Handle(from_path, http.StripPrefix(from_path, skyHandler(to_path)))
}

func main() {
	var configuration = flag.String("t", "Release", "The target configuration (i.e. Release or Debug)")

	flag.Parse()
	flag.Usage = usage
	// The built-in go:flag is awful.  It only allows short-name arguments
	// and they *must* be before any unnamed arguments.  There are better ones:
	// https://godoc.org/github.com/jessevdk/go-flags
	// but for now we're using raw-go.
	if flag.NArg() != 3 {
		usage()
	}

	root, _ := filepath.Abs(flag.Arg(0))
	port := flag.Arg(1)
	packageRoot := flag.Arg(2)

	// genRoot should not be needed once we figure out how mojom generation
	// for sdk users should work.
	genRoot := path.Join(root, "out", *configuration, "gen")

	fmt.Fprintf(os.Stderr, "Mappings for localhost:%s:\n", port)

	fmt.Fprintf(os.Stderr, "  / -> %s\n", root)
	http.Handle("/", skyHandler(root))

	fmt.Fprintf(os.Stderr, "  /echo_post -> custom echo handler\n")
	http.HandleFunc("/echo_post", func(w http.ResponseWriter, r *http.Request) {
		defer r.Body.Close()
		body, _ := ioutil.ReadAll(r.Body)
		w.Write(body)
	})

	addMapping("/gen/", genRoot)
	addMapping("/packages/", packageRoot)

	http.ListenAndServe(":"+port, nil)
}
