package ctxutils

import (
	"encoding/json"

	"github.com/gofiber/fiber/v2"

	"github.com/oidc-mytoken/server/internal/utils/logger"
	"github.com/oidc-mytoken/server/shared/mytoken/universalmytoken"
)

// GetMytokenStr checks a fiber.Ctx for a mytoken and returns the token string as passed to the request
func GetMytokenStr(ctx *fiber.Ctx) string {
	req := struct {
		Mytoken string `json:"mytoken"`
	}{}
	if err := json.Unmarshal(ctx.Body(), &req); err == nil {
		if req.Mytoken != "" {
			return req.Mytoken
		}
	}
	if tok := GetAuthHeaderToken(ctx); tok != "" {
		return tok
	}
	if tok := ctx.Cookies("mytoken"); tok != "" {
		return tok
	}
	return ""
}

// GetMytoken checks a fiber.Ctx for a mytoken and returns a token object
func GetMytoken(ctx *fiber.Ctx) (*universalmytoken.UniversalMytoken, bool) {
	rlog := logger.GetRequestLogger(ctx)
	tok := GetMytokenStr(ctx)
	if tok == "" {
		return nil, false
	}
	t, err := universalmytoken.Parse(rlog, tok)
	if err != nil {
		return nil, true
	}
	return &t, true
}