// A minimal redirector for b/123 style links to redmine.

package main

import (
	"fmt"
	"regexp"

	"github.com/golang/glog"

	"flag"
	"net/http"
)

func init() {
	flag.Set("logtostderr", "true")
}

var (
	flagListen  string
	flagTarget  string
	flagProject string

	reIssue = regexp.MustCompile(`^/([0-9]+)$`)
)

func main() {
	flag.StringVar(&flagListen, "b_listen", "0.0.0.0:8000", "Address to listen at")
	flag.StringVar(&flagTarget, "b_target", "issues.hackerspace.pl", "Redmine instance address")
	flag.StringVar(&flagProject, "b_project", "hswaw", "Redmine project name")
	flag.Parse()

	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		scheme := r.URL.Scheme
		if scheme == "" {
			scheme = "https"
		}
		if r.URL.Path == "/" {
			http.Redirect(w, r, fmt.Sprintf("%s://%s/my/page", scheme, flagTarget), 302)
			return
		}
		if r.URL.Path == "/new" {
			http.Redirect(w, r, fmt.Sprintf("%s://%s/projects/%s/issues/new", scheme, flagTarget, flagProject), 302)
			return
		}
		if matches := reIssue.FindStringSubmatch(r.URL.Path); len(matches) == 2 {
			num := matches[1]
			http.Redirect(w, r, fmt.Sprintf("%s://%s/issues/%s", scheme, flagTarget, num), 302)
			return
		}

		fmt.Fprintf(w, `<!DOCTYPE html>
			<title>🅱️</title>
			<center><iframe width="1120" height="630" src="https://www.youtube.com/embed/el0PtDvg2AE?start=4994&autoplay=1" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></center>
		`)
	})

	glog.Infof("Listening on %q...", flagListen)
	err := http.ListenAndServe(flagListen, nil)
	if err != nil {
		glog.Exit(err)
	}
}
