package icontext

import (
	"context"
	"time"
)

type UserEmail struct{}

func NewUserEmailContext(ctx context.Context, email string) context.Context {
	return context.WithValue(ctx, UserEmail{}, email)
}

func UserEmailFromCtx(ctx context.Context) string {
	if v := ctx.Value(UserEmail{}); v != nil {
		return v.(string)
	}
	return ""
}

type OperateAt struct{}

func NewOperateAtContext(ctx context.Context, t time.Time) context.Context {
	return context.WithValue(ctx, OperateAt{}, t)
}

func OperateAtFromCtx(ctx context.Context) time.Time {
	if v := ctx.Value(OperateAt{}); v != nil {
		return v.(time.Time)
	}

	return time.Now().UTC()
}

type OperateMessage struct{}

func NewOperateMessageContext(ctx context.Context, msg string) context.Context {
	return context.WithValue(ctx, OperateMessage{}, msg)
}

func OperateMessageFromCtx(ctx context.Context) string {
	if v := ctx.Value(OperateMessage{}); v != nil {
		return v.(string)
	}
	return ""
}
