package main

import (
	"embed"
	"flag"
	"log"
	"net/http"

	bolt "go.etcd.io/bbolt"

	"git.c3pb.de/gbe/invinoveritas/auth"
)

//go:embed templates/*.tpl
var templateFS embed.FS

//go:embed static/*
var staticFS embed.FS

func httpError(w http.ResponseWriter, msg string, err error, status int) {
	if err != nil {
		msg += ": " + err.Error()
	}

	log.Println(msg)

	http.Error(w, msg, status)
}

type Handler struct {
	db *bolt.DB
	ap authProvider
}

func logRequest(r *http.Request) {
	log.Println("handling", r.Method, r.URL, "from", r.RemoteAddr, "by", auth.Get(r))
}

func main() {
	dbPath := flag.String("db", "vino.db", "Path to database file")
	listenAddr := flag.String("listen", "127.0.0.1:7878", "Listening address")
	flag.Parse()

	db, err := bolt.Open(*dbPath, 0644, nil)
	if err != nil {
		log.Fatalln("can't open DB:", err)
	}
	defer db.Close()

	err = initDB(db)
	if err != nil {
		log.Fatalln("can't initialize DB:", err)
	}

	http.HandleFunc("/favicon.ico", http.NotFound)

	http.Handle("/static/", http.FileServer(http.FS(staticFS)))

	ap := authProvider{
		db: db,
	}

	handler := Handler{
		db: db,
		ap: ap,
	}

	http.HandleFunc("/details/img", auth.Require(http.HandlerFunc(handler.img), ap))
	http.HandleFunc("/details/", auth.Require(http.HandlerFunc(handler.details), ap))
	http.HandleFunc("/user/", auth.Require(http.HandlerFunc(handler.user), ap))
	http.HandleFunc("/", auth.Require(http.HandlerFunc(handler.index), ap))

	log.Printf("here we go, listening on http://%s", *listenAddr)

	err = http.ListenAndServe(*listenAddr, nil)
	if err != nil {
		log.Fatalln("http handler failed:", err)
	}
}