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


package engine.objects;

import engine.gameManager.DbManager;
import engine.net.ByteBufferWriter;
import org.pmw.tinylog.Logger;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;


public class NPCRune extends AbstractGameObject {

    private final RuneBase runeBase;
    private final int player;
    private final ArrayList<SkillReq> skillsGranted;
    private final ArrayList<RuneBaseEffect> effectsGranted;

    /**
     * No Table ID Constructor
     */
    public NPCRune(RuneBase runeBase, int characterID) {
        super();
        this.runeBase = runeBase;
        this.player = characterID;
        if (this.runeBase != null)
            this.skillsGranted = DbManager.SkillReqQueries.GET_REQS_FOR_RUNE(this.runeBase.getObjectUUID());
        else
            this.skillsGranted = new ArrayList<>();
        this.effectsGranted = new ArrayList<>();
    }

    /**
     * Normal Constructor
     */
    public NPCRune(RuneBase runeBase, int characterID, int newUUID) {
        super(newUUID);
        this.runeBase = runeBase;
        this.player = characterID;
        if (this.runeBase == null)
            this.skillsGranted = DbManager.SkillReqQueries.GET_REQS_FOR_RUNE(this.runeBase.getObjectUUID());
        else
            this.skillsGranted = new ArrayList<>();
        this.effectsGranted = new ArrayList<>();
    }

    /**
     * ResultSet Constructor
     */
    public NPCRune(ResultSet rs) throws SQLException {
        super(rs);

        this.runeBase = RuneBase.getRuneBase(rs.getInt("RuneBaseID"));
        this.player = rs.getInt("NpcID");
        if (this.runeBase != null) {
            this.skillsGranted = DbManager.SkillReqQueries.GET_REQS_FOR_RUNE(this.runeBase.getObjectUUID());
            this.effectsGranted = DbManager.RuneBaseEffectQueries.GET_EFFECTS_FOR_RUNEBASE(this.runeBase.getObjectUUID());
        } else {
            Logger.error("Failed to find RuneBase for NPCRune " + this.getObjectUUID());
            this.skillsGranted = new ArrayList<>();
            this.effectsGranted = new ArrayList<>();
        }
    }

    public static void serializeForClientMsg(NPCRune npcRune, ByteBufferWriter writer) {
        if (npcRune.runeBase != null) {
            writer.putInt(npcRune.runeBase.getType());
            writer.putInt(0);
            writer.putInt(npcRune.runeBase.getObjectUUID());
            writer.putInt(npcRune.getObjectType().ordinal());
            writer.putInt(npcRune.getObjectUUID());
        } else {
            for (int i = 0; i < 5; i++)
                writer.putInt(0);
        }
    }

    /*
     * Getters
     */
    public RuneBase getRuneBase() {
        return this.runeBase;
    }

    public int getRuneBaseID() {
        if (this.runeBase != null)
            return this.runeBase.getObjectUUID();
        return 0;
    }

    public int getPlayerID() {
        return this.player;
    }

    public ArrayList<SkillReq> getSkillsGranted() {
        return this.skillsGranted;
    }

    /*
     * Serializing
     */

    public ArrayList<RuneBaseEffect> getEffectsGranted() {
        return this.effectsGranted;
    }

    @Override
    public void updateDatabase() {

    }
}