package reqctx

import (
	"errors"

	"github.com/gofiber/fiber/v2"
)

const authenticatedUserKey = "authenticatedUser"
const vfsAccessScope = "vfsAccessScope"
const currentAccountKey = "currentAccount"
const currentDriveKey = "currentDrive"
const currentOrganizationKey = "currentOrganization"

var ErrUnauthenticatedRequest = errors.New("unauthenticated request")

// AuthenticatedUser returns the authenticated user from the given fiber context.
// Returns ErrUnauthenticatedRequest if not authenticated.
// The caller must type assert the returned value to the appropriate user type.
func AuthenticatedUser(c *fiber.Ctx) any {
	return c.Locals(authenticatedUserKey)
}

// SetAuthenticatedUser sets the authenticated user in the fiber context.
func SetAuthenticatedUser(c *fiber.Ctx, user any) {
	c.Locals(authenticatedUserKey, user)
}

// SetCurrentAccount sets the current account in the fiber context.
func SetCurrentAccount(c *fiber.Ctx, account any) {
	c.Locals(currentAccountKey, account)
}

// SetCurrentDrive sets the current drive in the fiber context.
func SetCurrentDrive(c *fiber.Ctx, drive any) {
	c.Locals(currentDriveKey, drive)
}

// SetVFSAccessScope sets the VFS access scope in the fiber context.
func SetVFSAccessScope(c *fiber.Ctx, scope any) {
	c.Locals(vfsAccessScope, scope)
}

// SetCurrentOrganization sets the current organization in the fiber context.
func SetCurrentOrganization(c *fiber.Ctx, organization any) {
	c.Locals(currentOrganizationKey, organization)
}

// CurrentAccount returns the current account from the given fiber context.
func CurrentAccount(c *fiber.Ctx) any {
	return c.Locals(currentAccountKey)
}

// CurrentDrive returns the current drive from the given fiber context.
func CurrentDrive(c *fiber.Ctx) any {
	return c.Locals(currentDriveKey)
}

// CurrentOrganization returns the current organization from the given fiber context.
func CurrentOrganization(c *fiber.Ctx) any {
	return c.Locals(currentOrganizationKey)
}

// VFSAccessScope returns the VFS access scope from the given fiber context.
func VFSAccessScope(c *fiber.Ctx) any {
	return c.Locals(vfsAccessScope)
}
