const KEY_MAP: Record<string, string> = {
    activeRole:    'r',
    page:          'p',
    page_size:     'ps',
    search:        's',
    user_id:       'u',
    status:        'st',
    project_code:  'pc',
    contract_code: 'cc',
    dua_code:      'dc',
    category:      'ca',
};
const REVERSE_MAP = Object.fromEntries(Object.entries(KEY_MAP).map(([k, v]) => [v, k]));

export function encodeParams(params: Record<string, string>): string {
    const shortened = Object.fromEntries(
        Object.entries(params).map(([k, v]) => [KEY_MAP[k] ?? k, v])
    );
    return btoa(new URLSearchParams(shortened).toString()).replace(/=+$/, '');
}

export function decodeParams(token: string): Record<string, string> {
    try {
        const padded = token.padEnd(token.length + (4 - token.length % 4) % 4, '=');
        const entries = Object.fromEntries(new URLSearchParams(atob(padded)));
        return Object.fromEntries(
            Object.entries(entries).map(([k, v]) => [REVERSE_MAP[k] ?? k, v])
        );
    } catch {
        return {};
    }
}

// Used as fallback when no ?t= token is present (e.g. plain links from emails)
export function readPlainParams(searchParams: URLSearchParams): Record<string, string> {
    const result: Record<string, string> = {};
    searchParams.forEach((value, key) => {
        result[REVERSE_MAP[key] ?? key] = value; // handles both short and long keys
    });
    return result;
}
