package main

import (
	"encoding/base64"
	"html/template"
	"log"
	"net/http"
	"os"

	"code.secondbit.org/auth.hg"
	"code.secondbit.org/events.hg"
	"github.com/gorilla/mux"
)

func main() {
	log.SetFlags(log.LstdFlags | log.Llongfile)
	log.Printf("Running version '%s'\n", auth.Version)
	var config auth.Config
	var jwtSecret string
	var err error
	if os.Getenv("JWT_SECRET") == "" {
		log.Fatal("JWT_SECRET must be set.")
	} else {
		jwtSecret = os.Getenv("JWT_SECRET")
	}
	if os.Getenv("JWT_SECRET_IS_BASE64_ENCODED") == "true" {
		config.JWTPrivateKey, err = base64.StdEncoding.DecodeString(jwtSecret)
		if err != nil {
			panic(err)
		}
	} else {
		config.JWTPrivateKey = []byte(jwtSecret)
	}
	if os.Getenv("AUTH_PG_DB") != "" {
		p, err := auth.NewPostgres(os.Getenv("AUTH_PG_DB"))
		if err != nil {
			panic(err)
		}
		config.ClientStore = &p
		config.AuthCodeStore = &p
		config.ProfileStore = &p
		config.TokenStore = &p
		config.SessionStore = &p
	} else {
		store := auth.NewMemstore()
		config.ClientStore = store
		config.AuthCodeStore = store
		config.ProfileStore = store
		config.TokenStore = store
		config.SessionStore = store
	}
	config.Template = template.Must(template.New("base").ParseGlob("./templates/*.gotmpl"))
	config.LoginURI = "/login"
	if os.Getenv("AUTH_NSQD_ADDR") != "" {
		publisher, err := events.NewNSQPublisher("code.secondbit.org/auth/authd-"+auth.Version, os.Getenv("AUTH_NSQD_ADDR"))
		if err != nil {
			log.Fatal(err)
		}
		config.EventsPublisher = publisher
	} else {
		config.EventsPublisher = events.NewStdoutPublisher()
	}
	err = config.Init()
	if err != nil {
		log.Fatal(err)
	}
	context, err := auth.NewContext(config)
	if err != nil {
		panic(err)
	}

	router := mux.NewRouter()
	auth.RegisterOAuth2(router, context)
	auth.RegisterSessionHandlers(router, context)
	auth.RegisterProfileHandlers(router, context)
	auth.RegisterClientHandlers(router, context)
	http.Handle("/", router)
	log.Println("Listening on port 9000")
	log.Fatal(http.ListenAndServe("0.0.0.0:9000", nil))
}
