package main

import (
	"context"
	"flag"
	"io/ioutil"
	"net/http"
	"time"

	"code.hackerspace.pl/hscloud/go/mirko"
	"github.com/golang/glog"
)

var (
	flagListen  = "127.0.0.1:8080"
	flagConfig  = ""
	flagTLSKey  = ""
	flagTLSCert = ""
)

func main() {
	flag.StringVar(&flagListen, "admitomatic_listen", flagListen, "Address to listen on for HTTP traffic")
	flag.StringVar(&flagTLSKey, "admitomatic_tls_key", flagTLSKey, "TLS key to serve HTTP with")
	flag.StringVar(&flagTLSCert, "admitomatic_tls_cert", flagTLSCert, "TLS certificate to serve HTTP with")
	flag.StringVar(&flagConfig, "admitomatic_config", flagConfig, "Config path (prototext format)")
	flag.Parse()

	if flagConfig == "" {
		glog.Exitf("-admitomatic_config must be set")
	}
	if flagTLSKey == "" {
		glog.Exitf("-admitomatic_tls_key must be set")
	}
	if flagTLSCert == "" {
		glog.Exitf("-admitomatic_tls_cert must be set")
	}

	m := mirko.New()
	if err := m.Listen(); err != nil {
		glog.Exitf("Listen(): %v", err)
	}

	if err := m.Serve(); err != nil {
		glog.Exitf("Serve(): %v", err)
	}

	configData, err := ioutil.ReadFile(flagConfig)
	if err != nil {
		glog.Exitf("Could not read config: %v", err)
	}

	s, err := newService(configData)
	if err != nil {
		glog.Exitf("Could not start service: %v", err)
	}

	mux := http.NewServeMux()
	mux.HandleFunc("/", s.handler)
	// TODO(q3k): implement admission controller
	srv := &http.Server{Addr: flagListen, Handler: mux}

	glog.Infof("Listening on %q...", flagListen)
	go func() {
		if err := srv.ListenAndServeTLS(flagTLSCert, flagTLSKey); err != nil {
			glog.Error(err)
		}
	}()

	<-m.Done()
	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancel()
	srv.Shutdown(ctx)
}
