import jwt from 'jsonwebtoken';

/**
 * Vygeneruje a vrátí podepsaný JWT token pro daný login.
 * 
 * @param login přihlašovací jméno uživatele
 * @param trusted příznak, zda se jedná o ověřeného uživatele
 * @returns JWT token
 */
export function generateToken(login?: string, trusted?: boolean): string {
    if (!process.env.JWT_SECRET) {
        throw Error("Není vyplněna proměnná prostředí JWT_SECRET");
    }
    if (process.env.JWT_SECRET.length < 32) {
        throw Error("Proměnná prostředí JWT_SECRET musí být minimálně 32 znaků");
    }
    if (!login || login.trim().length === 0) {
        throw Error("Nebyl předán login");
    }
    const payload = { login, trusted: trusted || false, logoutUrl: process.env.LOGOUT_URL };
    return jwt.sign(payload, process.env.JWT_SECRET);
}

/**
 * Vrátí true, pokud je předaný JWT token platný.
 * 
 * @param token JWT token
 */
export function verify(token: string): boolean {
    if (!process.env.JWT_SECRET) {
        throw Error("Není vyplněna proměnná prostředí JWT_SECRET");
    }
    try {
        jwt.verify(token, process.env.JWT_SECRET);
        return true;
    } catch (err) {
        return false;
    }
}

/**
 * Vrátí login z daného JWT tokenu, pokud je token platný.
 * 
 * @param token JWT token
 */
export function getLogin(token?: string): string {
    if (!process.env.JWT_SECRET) {
        throw Error("Není vyplněna proměnná prostředí JWT_SECRET");
    }
    if (!token) {
        throw Error("Nebyl předán token");
    }
    const payload: any = jwt.verify(token, process.env.JWT_SECRET);
    return payload.login;
}

/**
 * Vrátí zda je uživatel používající daný token ověřený, pokud je token platný.
 * 
 * @param token JWT token
 */
export function getTrusted(token?: string): boolean {
    if (!process.env.JWT_SECRET) {
        throw Error("Není vyplněna proměnná prostředí JWT_SECRET");
    }
    if (!token) {
        throw Error("Nebyl předán token");
    }
    const payload: any = jwt.verify(token, process.env.JWT_SECRET);
    return payload.trusted || false;
}