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


package engine.objects;

import engine.net.ByteBufferWriter;

import java.nio.ByteBuffer;

public enum CharacterTitle {

    NONE(0, 0, 0, ""),
    CSR_1(255, 0, 0, "CCR"),
    CSR_2(255, 0, 0, "CCR"),
    CSR_3(255, 0, 0, "CCR"),
    CSR_4(251, 181, 13, "CCR"),
    DEVELOPER(166, 153, 114, "Programmer"),
    QA(88, 250, 244, "GIRLFRIEND");

    int headerLength, footerLength;
    private ByteBuffer header;
    private ByteBuffer footer;

    CharacterTitle(int _r, int _g, int _b, String _prefix) {
        char[] str_header = ("^\\c" +
                (((_r < 100) ? ((_r < 10) ? "00" : "0") : "") + ((byte) _r & 0xFF)) +
                (((_g < 100) ? ((_g < 10) ? "00" : "0") : "") + ((byte) _g & 0xFF)) +
                (((_b < 100) ? ((_b < 10) ? "00" : "0") : "") + ((byte) _b & 0xFF)) +
                '<' + _prefix + "> ").toCharArray();

        char[] str_footer = ("^\\c255255255").toCharArray();

        this.headerLength = str_header.length;
        this.footerLength = str_footer.length;

        this.header = ByteBuffer.allocateDirect(headerLength << 1);
        this.footer = ByteBuffer.allocateDirect(footerLength << 1);

        ByteBufferWriter headWriter = new ByteBufferWriter(header);

        for (char c : str_header) {
            headWriter.putChar(c);
        }

        ByteBufferWriter footWriter = new ByteBufferWriter(footer);

        for (char c : str_footer) {
            footWriter.putChar(c);
        }
    }

    public void _serializeFirstName(ByteBufferWriter writer, String firstName) {
        _serializeFirstName(writer, firstName, false);
    }

    public void _serializeFirstName(ByteBufferWriter writer, String firstName, boolean smallString) {
        if (this.ordinal() == 0) {
            if (smallString)
                writer.putSmallString(firstName);
            else
                writer.putString(firstName);
            return;
        }

        char[] chars = firstName.toCharArray();

        if (smallString)
            writer.put((byte) (chars.length + this.headerLength));
        else
            writer.putInt(chars.length + this.headerLength);
        writer.putBB(header);

        for (char c : chars) {
            writer.putChar(c);
        }
    }

    public void _serializeLastName(ByteBufferWriter writer, String lastName, boolean haln, boolean asciiLastName) {
        _serializeLastName(writer, lastName, haln, asciiLastName, false);
    }

    public void _serializeLastName(ByteBufferWriter writer, String lastName, boolean haln, boolean asciiLastName, boolean smallString) {
        if (!haln || asciiLastName) {
            if (this.ordinal() == 0) {
                if (smallString)
                    writer.putSmallString(lastName);
                else
                    writer.putString(lastName);
                return;
            }
        }

        if (!haln || asciiLastName) {
            char[] chars = lastName.toCharArray();

            if (smallString)
                writer.put((byte) (chars.length + this.footerLength));
            else
                writer.putInt(chars.length + this.footerLength);

            for (char c : chars) {
                writer.putChar(c);
            }

            writer.putBB(footer);
        } else {
            if (smallString)
                writer.put((byte) this.footerLength);
            else
                writer.putInt(this.footerLength);
            writer.putBB(footer);
        }

    }
}