package appctx

import (
	"context"
	"fmt"
	"github.com/rs/zerolog"
	"lab.zaar.be/thefish/alchemyst-go/util"
)

const (
	configKey = "config"
	loggerKey = "logger"
)

type clientCtx struct {
	context.Context
}

var ClientState clientCtx

func NewClientContext(config *util.Config, logger *zerolog.Logger) {
	ctx := context.Context(context.TODO())
	ctx = context.WithValue(ctx, configKey, config)
	ctx = context.WithValue(ctx, loggerKey, logger)
	ClientState = clientCtx{ctx}
}

func Config(c context.Context) *util.Config {
	cfg, ok := c.Value(configKey).(*util.Config)
	if !ok {
		panic(fmt.Errorf("no access to config from context"))
	}
	return cfg
}

func Logger() *zerolog.Logger {
	return getLogger(ClientState.Context)
}

func getLogger(c context.Context) *zerolog.Logger {
	logger, ok := c.Value(loggerKey).(*zerolog.Logger)
	if !ok {
		panic(fmt.Errorf("no access to logger from context"))
	}
	return logger
}

//func FromContext(appctx context.Context) (*User, bool) {
//	u, ok := appctx.Value(userKey).(*User)
//	return u, ok
//}