package ai.instance.drakenspire;

import java.util.concurrent.Future;
import java.util.concurrent.atomic.AtomicBoolean;

import com.aionemu.commons.utils.Rnd;
import com.aionemu.gameserver.ai.AIActions;
import com.aionemu.gameserver.ai.AIName;
import com.aionemu.gameserver.model.gameobjects.Creature;
import com.aionemu.gameserver.model.gameobjects.Npc;
import com.aionemu.gameserver.model.gameobjects.VisibleObject;
import com.aionemu.gameserver.skillengine.SkillEngine;
import com.aionemu.gameserver.skillengine.effect.AbnormalState;
import com.aionemu.gameserver.skillengine.model.SkillTemplate;
import com.aionemu.gameserver.utils.ThreadPoolManager;

import ai.AggressiveNoLootNpcAI;

/**
 * @author Estrayl
 */
@AIName("orissan")
public class OrissanAI extends AggressiveNoLootNpcAI {

	private final AtomicBoolean isActive = new AtomicBoolean();
	private Future<?> task;
	private int lastSpawnEvent; // 1 == Frigid Crystals, 2 == Icing Crystals

	public OrissanAI(Npc owner) {
		super(owner);
	}

	@Override
	protected void handleSpawned() {
		super.handleSpawned();
		lastSpawnEvent = Rnd.get(1, 2);
		// task = ThreadPoolManager.getInstance().schedule(this::startSummoningEvent, 30000);
	}

	@Override
	protected void handleCreatureAggro(Creature creature) {
		super.handleCreatureAggro(creature);
		// if (isActive.compareAndSet(false, true))
		// task = ThreadPoolManager.getInstance().schedule(this::startSummoningEvent, 30000);
	}

	private void startSummoningEvent() {
		getOwner().clearQueuedSkills();
		getOwner().queueSkill(21646, 1, 10000);
	}

	@Override
	public void onEndUseSkill(SkillTemplate st, int skillLevel) {
		switch (st.getSkillId()) {
			case 21533: // Ice Explosion
				lastSpawnEvent = 1;
				task = ThreadPoolManager.getInstance().schedule(this::startSummoningEvent, 30000);
				break;
			case 21637: // Rigid Gait
				ThreadPoolManager.getInstance().schedule(this::attackIcingCrystal, 4500);
				break;
			case 21646: // Summon Freezing Crystal
				if (lastSpawnEvent == 1) {
					spawnIcingCrystals();
					task = ThreadPoolManager.getInstance().schedule(() -> {
						getOwner().getEffectController().setAbnormal(AbnormalState.SANCTUARY);
						attackIcingCrystal();
					}, 10000);
				} else {
					spawnFrigidCrystals();
					task = ThreadPoolManager.getInstance().schedule(() -> {
						getOwner().clearQueuedSkills();
						getOwner().queueSkill(21632, 1, 0); // Frigid Blast
						getOwner().queueSkill(21633, 1, 8000); // Ice Explosion
					}, 10000);
				}
				break;
		}
	}

	private void attackIcingCrystal() {
		Npc servant = null;
		for (VisibleObject vo : getKnownList().getKnownObjects().values()) {
			if (vo instanceof Npc && ((Npc) vo).getNpcId() == 855700 && !((Npc) vo).isDead() && !((Creature) vo).getLifeStats().isAboutToDie()) {
				servant = (Npc) vo;
				break;
			}
		}
		if (servant != null) {
			AIActions.targetCreature(this, servant);
			SkillEngine.getInstance().getSkill(getOwner(), 21637, 67, servant).useSkill();
		} else {
			getOwner().getEffectController().unsetAbnormal(AbnormalState.SANCTUARY);
			lastSpawnEvent = 2;
			task = ThreadPoolManager.getInstance().schedule(this::startSummoningEvent, 30000);
		}
	}

	private void spawnIcingCrystals() {
		spawn(855608, 822.0f, 567.7f, 1701.045f, (byte) 0);
		spawn(855608, 811.6f, 577.7f, 1701.045f, (byte) 0);
		spawn(855608, 811.7f, 556.5f, 1701.045f, (byte) 0);
		spawn(855608, 801.1f, 567.9f, 1701.045f, (byte) 0);
	}

	private void spawnFrigidCrystals() {
		spawn(855607, 790.7f, 567.7f, 1701.045f, (byte) 0);
		spawn(855607, 797.0f, 552.0f, 1701.045f, (byte) 0);
		spawn(855607, 797.1f, 583.1f, 1701.045f, (byte) 0);
		spawn(855607, 801.1f, 567.9f, 1701.045f, (byte) 0);
		spawn(855607, 802.5f, 557.9f, 1701.045f, (byte) 0);
		spawn(855607, 802.7f, 576.6f, 1701.045f, (byte) 0);
		spawn(855607, 811.6f, 577.8f, 1701.045f, (byte) 0);
		spawn(855607, 811.6f, 587.7f, 1701.045f, (byte) 0);
		spawn(855607, 811.7f, 556.5f, 1701.045f, (byte) 0);
		spawn(855607, 811.8f, 567.9f, 1701.045f, (byte) 0);
		spawn(855607, 812.0f, 545.5f, 1701.045f, (byte) 0);
		spawn(855607, 820.3f, 557.9f, 1701.045f, (byte) 0);
		spawn(855607, 820.5f, 576.4f, 1701.045f, (byte) 0);
		spawn(855607, 822.0f, 567.7f, 1701.045f, (byte) 0);
		spawn(855607, 826.1f, 551.2f, 1701.045f, (byte) 0);
		spawn(855607, 825.9f, 582.1f, 1701.045f, (byte) 0);
		spawn(855607, 832.8f, 567.6f, 1701.045f, (byte) 0);
	}

	private void cancelTask() {
		if (task != null && !task.isDone()) {
			task.cancel(true);
		}
	}

	@Override
	protected void handleBackHome() {
		isActive.set(false);
		cancelTask();
		super.handleBackHome();
	}

	@Override
	protected void handleDied() {
		cancelTask();
		super.handleDespawned();
	}

	@Override
	protected void handleDespawned() {
		cancelTask();
		super.handleDespawned();
	}
}
