// • ▌ ▄ ·.  ▄▄▄·  ▄▄ • ▪   ▄▄· ▄▄▄▄·  ▄▄▄·  ▐▄▄▄  ▄▄▄ .
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
// ▀▀  █▪▀▀▀ ▀  ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀  ▀  ▀ ▀▀  █▪ ▀▀▀
//      Magicbane Emulator Project © 2013 - 2022
//                www.magicbane.com


package engine.objects;

import java.util.concurrent.atomic.AtomicInteger;

public class GuildStatusController {

    /*
     * 	Status is stored in a single integer contained within the Character Table
     *
     * 	This class is responsible for maintaining and interpreting that value.
     *
     *  Byte 1 - All		: Title 			[0x000000FF]
     *  Byte 2 - Low		: isFullMember 		[0x00000F00]
     *  Byte 2 - High		: isTaxCollector	[0x0000F000]
     *  Byte 3 - Low		: isRecruiter		[0x000F0000]
     *  Byte 3 - High		: isInnerCouncil	[0x00F00000]
     *  Byte 4 - Low		: isGuildLeader		[0x0F000000]
     *  Byte 4 - High		: Empty				[0xF0000000]
     */

    //Constants
    private static final int TITLE = 0x000000FF; // 00, F0 and 0F had no effect
    private static final int FULLMEMBER = 0x00000F00;
    private static final int TAXCOLLECTOR = 0x0000F000;
    private static final int RECRUITER = 0x000F0000;
    private static final int INNERCOUNCIL = 0x00F00000;
    private static final int GUILDLEADER = 0x0F000000;

    //Getters
    public static boolean isGuildLeader(AtomicInteger status) {
        return ((status.get() & GUILDLEADER) > 0);
    }

    public static boolean isInnerCouncil(AtomicInteger status) {
        return ((status.get() & INNERCOUNCIL) > 0);
    }

    public static boolean isRecruiter(AtomicInteger status) {
        return ((status.get() & RECRUITER) > 0);
    }

    public static boolean isTaxCollector(AtomicInteger status) {
        return ((status.get() & TAXCOLLECTOR) > 0);
    }

    public static boolean isFullMember(AtomicInteger status) {
        return ((status.get() & FULLMEMBER) > 0);
    }

    public static int getTitle(AtomicInteger status) {
        return status.get() & TITLE;
    }

    public static int getRank(AtomicInteger status) {
        int value = status.get();

        //Guild Leader
        if (value > 0x00FFFFFF) {
            return 10;
        }

        //Inner Council
        if (value > 0x000FFFFF) {
            return 9;
        }

        //Recruiter
        if (value > 0x0000FFFF) {
            return 8;
        }

        //Tax Collector
        if (value > 0x00000FFF) {
            return 7;
        }

        //Full Member
        if (value > 0x000000FF) {
            return 6;
        }

        //Petitioner
        return 5;
    }

    //Setters
    public static void setTitle(AtomicInteger current, int i) {
        int value;
        i &= TITLE;
        do {
            value = current.get();
        } while (!current.compareAndSet(value, (value & ~TITLE) | i));
    }

    public static void setFullMember(AtomicInteger status, boolean newValue) {
        setNibble(status, newValue, FULLMEMBER);
    }

    public static void setTaxCollector(AtomicInteger status, boolean newValue) {
        setNibble(status, newValue, TAXCOLLECTOR);
    }

    public static void setRecruiter(AtomicInteger status, boolean newValue) {
        setNibble(status, newValue, RECRUITER);
    }

    public static void setInnerCouncil(AtomicInteger status, boolean newValue) {
        setNibble(status, newValue, INNERCOUNCIL);
    }

    public static void setGuildLeader(AtomicInteger status, boolean newValue) {
        setNibble(status, newValue, GUILDLEADER);
    }

    private static void setNibble(AtomicInteger current, boolean newValue, int mask) {
        int value, i = ((newValue) ? mask & -1 : 0);
        do {
            value = current.get();
        } while (!current.compareAndSet(value, (value & ~mask) | i));
    }
}