package main

import (
	"context"
	"embed"
	"fmt"
	"html/template"

	"git.keks.cloud/kekskurse/miniauth/pkg/smtpclient"
	"git.keks.cloud/kekskurse/miniauth/pkg/userstore"
	"git.keks.cloud/kekskurse/miniauth/pkg/web"
	"github.com/gin-gonic/gin"
	"github.com/rs/zerolog/log"
	"github.com/sethvargo/go-envconfig"
)

//go:embed templates/*
var templatesFS embed.FS

func main() {
	cnf := config()
	router := setupRouter(cnf)
	router.Run(fmt.Sprintf(":%v", cnf.Port))
}

type gloableConfig struct {
	UserStoreConfig userstore.Config      `env:", prefix=USERSTORE_"`
	Port            int                   `env:"PORT, default=8080"`
	SMTPConfig      smtpclient.SMTPConfig `env:", prefix=SMTP_"`
	WebConfig       web.WebConfig         `env:", prefix=WEB_"`
}

func config() gloableConfig {
	var c gloableConfig
	err := envconfig.Process(context.Background(), &c)
	if err != nil {
		log.Fatal().Err(err).Msg("cant parse config")
	}
	return c
}

func loadTemplates() *template.Template {
	tmpl, err := template.ParseFS(templatesFS, "templates/*.html")
	if err != nil {
		panic(err) // Handle error entsprechend
	}
	return tmpl
}

func setupRouter(cfg gloableConfig) *gin.Engine {
	router := gin.Default()
	router.SetHTMLTemplate(loadTemplates())
	routesWeb := router.Group("/web")

	webServer := web.NewWeb(cfg.WebConfig)
	webServer.RegisterRoutes(routesWeb)

	router.GET("/", func(c *gin.Context) {})
	router.GET("/ping", func(c *gin.Context) { c.String(200, "pong") })

	return router
}