package user

import (
	"embed"
	"fmt"
	"github.com/go-chi/chi/v5"
	"github.com/go-chi/jwtauth/v5"
	"github.com/unrolled/render"
	"net/http"
	"time"
)

// content holds our static web server content.
//go:embed templates/*
var webserver embed.FS

var ren *render.Render


var tokenAuth *jwtauth.JWTAuth


type UserConfig struct {
	RequiredMailValidationBeforeLogin bool
}

func NewConfig() UserConfig {
	u := UserConfig{
		RequiredMailValidationBeforeLogin: true,
	}

	return u
}

func Register(router chi.Router, token *jwtauth.JWTAuth, config UserConfig) {
	ren = render.New(render.Options{
		//Layout: "layout",
		FileSystem: &render.EmbedFileSystem{
			FS: webserver,
		},
	})

	router.Get("/login", loginForm)
	router.Post("/login", login)
	router.Get("/register", registerForm)
	router.Post("/register", register)
	router.Get("/logout", logout)

	//tokenAuth = jwtauth.New("HS256", []byte("secret"), nil)
	tokenAuth = token

	router.Group(func(r chi.Router) {
		r.Use(jwtauth.Verifier(tokenAuth))
		r.Get("/me", func(w http.ResponseWriter, r *http.Request) {
			_, claims, _ := jwtauth.FromContext(r.Context())
			if val, ok := claims["username"]; ok {
				w.Write([]byte(fmt.Sprintf("hi %v", val)))
			} else {
				w.Write([]byte("Du bist nicht eingeloggt"))
			}

		})
	})


}

func loginForm(w http.ResponseWriter, r *http.Request) {
	ren.HTML(w, http.StatusOK, "login", nil)
}

func registerForm(w http.ResponseWriter, r *http.Request) {
	ren.HTML(w, http.StatusOK, "register", nil)
}

func login(w http.ResponseWriter, r *http.Request) {
	r.ParseForm()


	uc := GetUserClient()
	res, _ := uc.login(r.FormValue("username"), r.FormValue("password"))
	if res {

		_, tokenstring, err := tokenAuth.Encode(map[string]interface{}{"username": r.FormValue("username")})
		if err != nil {
			panic(err)
		}
		expiration := time.Now().Add(365 * 24 * time.Hour)
		cookie    :=    http.Cookie{Name: "jwt",Value:tokenstring,Expires:expiration}
		http.SetCookie(w, &cookie)
		w.Write([]byte("Login ok"))
	} else {
		w.Write([]byte("Login failed"))
	}
}

func logout(w http.ResponseWriter, r *http.Request)  {
	cookie := http.Cookie{
		Name:       "jwt",
		Value:      "",
	}
	http.SetCookie(w, &cookie)
	w.Write([]byte("Du wurdest ausgeloggt"))
}

func register(w http.ResponseWriter, r *http.Request) {
	r.ParseForm()

	uc := GetUserClient()
	res, _ := uc.register(r.FormValue("username"), r.FormValue("password"), r.FormValue("email"))
	if res {
		w.Write([]byte("Register ok"))
	} else {
		w.Write([]byte("Register failed"))
	}
}

