import {PermissionLabel} from "../models/transaction.entities";
import {GroupToken} from "libnexa-ts";

export function isAuthFit(authFlags: bigint | number, permission: PermissionLabel): boolean {
    if (authFlags > 0) {
        return false;
    }

    let flags = BigInt.asUintN(64, BigInt(authFlags));
    switch (permission) {
        case 'authorise':
            return GroupToken.allowsRenew(flags);
        case 'mint':
            return GroupToken.allowsMint(flags);
        case 'melt':
            return GroupToken.allowsMelt(flags);
        case 'rescript':
            return GroupToken.allowsRescript(flags);
        case 'subgroup':
            return GroupToken.allowsSubgroup(flags);
        default:
            return false;
    }
}

export function dupAuthority(authFlags: bigint | number, withSubgroup = true): bigint {
    if (authFlags > 0) {
        return 0n;
    }

    let flags = BigInt.asUintN(64, BigInt(authFlags));
    let newFlags = GroupToken.authFlags.AUTHORITY;

    if (GroupToken.allowsRenew(flags)) {
        newFlags |= GroupToken.authFlags.BATON;
    }
    if (GroupToken.allowsMint(flags)) {
        newFlags |= GroupToken.authFlags.MINT;
    }
    if (GroupToken.allowsMelt(flags)) {
        newFlags |= GroupToken.authFlags.MELT;
    }
    if (GroupToken.allowsRescript(flags)) {
        newFlags |= GroupToken.authFlags.RESCRIPT;
    }
    if (GroupToken.allowsSubgroup(flags) && withSubgroup) {
        newFlags |= GroupToken.authFlags.SUBGROUP;
    }

    return newFlags;
}

export function buildAuthority(perms: PermissionLabel[]): bigint {
    let newFlags = GroupToken.authFlags.AUTHORITY;
    for (let perm of perms) {
        switch (perm) {
            case 'authorise':
                newFlags |= GroupToken.authFlags.BATON;
                break;
            case 'mint':
                newFlags |= GroupToken.authFlags.MINT;
                break;
            case 'melt':
                newFlags |= GroupToken.authFlags.MELT;
                break;
            case 'rescript':
                newFlags |= GroupToken.authFlags.RESCRIPT;
                break;
            case 'subgroup':
                newFlags |= GroupToken.authFlags.SUBGROUP;
                break;
        }
    }
    return newFlags;
}
