package main

import (
	"flag"
	"fmt"
	// "log"
	"net/http"
	"strconv"

	"code.ndumas.com/ndumas/badges"
	"github.com/go-chi/chi/v5"
	"github.com/go-chi/chi/v5/middleware"
)

var FONT_PATH = "fonts"

type BadgeRenderer struct {
	Fonts map[string]string
}

func NewBadgeRenderer() *BadgeRenderer {
	var br BadgeRenderer
	br.Fonts = make(map[string]string)

	// walkfunc to find ttf files here
	return &br
}

func (br *BadgeRenderer) listFonts(w http.ResponseWriter, r *http.Request) {
}

func (br *BadgeRenderer) renderBadge(w http.ResponseWriter, r *http.Request) {
	q := r.URL.Query()

	if len(q["label"]) < 1 {
		w.WriteHeader(400)
		fmt.Fprintf(w, "please provide a label")
	}
	label := q["label"][0]

	if len(q["message"]) < 1 {
		w.WriteHeader(400)
		fmt.Fprintf(w, "please provide a message")
	}
	message := q["message"][0]

	if len(q["color"]) < 1 {
		w.WriteHeader(400)
		fmt.Fprintf(w, "please provide a color")
	}
	color := q["color"][0]

	if len(q["size"]) < 1 {
		w.WriteHeader(400)
		fmt.Fprintf(w, "please provide a size")
	}

	size, err := strconv.ParseInt(q["size"][0], 10, 64)
	if err != nil {
		w.WriteHeader(400)
		fmt.Fprintf(w, "could not convert size to integer: %s\n", err)

		return
	}

	if len(q["font"]) < 1 {
		w.WriteHeader(400)
		fmt.Fprintf(w, "please provide a font name")
	}
	font, ok := br.Fonts[q["font"][0]]

	if !ok {
		w.WriteHeader(400)
		fmt.Fprintf(w, "unknown font selection\n")
	}

	bg, err := badge.NewGenerator(font, int(size))

	if err != nil {
		w.WriteHeader(400)
		fmt.Fprintf(w, "error instantitating generator: %s\n", err)

		return
	}

	w.Header().Add("Content-Type", "image/svg+xml")

	switch q["style"][0] {
	case "flat":
		fmt.Fprintf(w, "%s", bg.GenerateFlat(label, message, color))

	default:
		w.WriteHeader(400)
		fmt.Fprintf(w, "no matching style found\n")
	}
}

var (
	port     int
	fontsDir string
)

func main() {
	flag.IntVar(&port, "port", 8484, "http listening port")
	flag.StringVar(&fontsDir, "fonts", "fonts/", "directory containing ttf files")

	flag.Parse()

	br := NewBadgeRenderer()

	r := chi.NewRouter()
	r.Use(middleware.Logger)
	// r.Use(middleware.Recoverer)
	r.Use(middleware.Compress(5, "image/svg+xml"))
	r.Get("/badge", br.renderBadge)
	r.Get("/fonts/{format}", br.listFonts)

	http.ListenAndServe(fmt.Sprintf(":%d", port), r)
}
