package utils

import (
	"github.com/labstack/echo/v4"

	"github.com/pingcap/test-infra/services/rms/log"
)

var (
	_ Context = &context{}
)

const UserKey = "user"

type Context interface {
	echo.Context
	ReqID() string
	Log() *log.Logger
}

type User struct {
	Name  string
	Group string
}

func (u User) IsAdmin() bool {
	return u.Group == "admin"
}

func NewContext(c echo.Context) Context {
	reqID := c.Request().Header.Get(echo.HeaderXRequestID)

	return &context{
		Context: c,
		log:     log.Log.With("reqID", reqID),
	}
}

type context struct {
	echo.Context
	log *log.Logger
}

func (c context) ReqID() string {
	return c.Request().Header.Get(echo.HeaderXRequestID)
}

func (c context) Log() *log.Logger {
	return c.log
}

func GetUser(c echo.Context) *User {
	u := c.Get("user")
	if u == nil {
		return nil
	}
	return u.(*User)
}

func SetUser(c echo.Context, user *User) {
	c.Set(UserKey, user)
}
