import { Jwt } from '../auth'

interface CommonPayload {
	exp: number
	iat?: number
}

export enum UserType {
	Registered = 'registered',
	Anonymous = 'anon',
	Guest = 'guest',
}

export interface UserPayload extends CommonPayload {
	username: string
	verified: boolean
	id: number
	device_id?: string
	impersonated_by?: number
	permissions: CompletePermissions
	enrollment_id?: string
	enrolled?: boolean
	type: UserType
}

export type CompletePermissions = {
	[key: string]: PerOrgPermissions
}
export type PerOrgPermissions = {
	[key: string]: string[]
}

export function extractOrganizersFromJwt(jwt: Jwt) {
	const payload = getParsedJwt(jwt.token)
	if (payload?.permissions != null) {
		return Object.keys(payload?.permissions)
	}
	return []
}

/**
 * Returns a JS object representation of a Javascript Web Token from its common encoded
 * string form.
 *
 * @template T the expected shape of the parsed token
 * @param {string} token a Javascript Web Token in base64 encoded, `.` separated form
 * @returns {(T | undefined)} an object-representation of the token
 * or undefined if parsing failed
 */
export function getParsedJwt<
	T extends object = { [k: string]: string | number }
>(token: string): T | undefined {
	try {
		// TODO: Don't use atob if the code is running on node
		return JSON.parse(atob(token.split('.')[1]))
	} catch {
		return undefined
	}
}
