/*
 * Copyright © 2004-2023 L2J DataPack
 * 
 * This file is part of L2J DataPack.
 * 
 * L2J DataPack is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * L2J DataPack is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */
package com.l2jserver.datapack.ai.individual;

import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

import com.l2jserver.datapack.ai.npc.AbstractNpcAI;
import com.l2jserver.gameserver.instancemanager.RaidBossSpawnManager;
import com.l2jserver.gameserver.instancemanager.RaidBossSpawnManager.StatusEnum;
import com.l2jserver.gameserver.instancemanager.ZoneManager;
import com.l2jserver.gameserver.model.L2Spawn;
import com.l2jserver.gameserver.model.actor.L2Attackable;
import com.l2jserver.gameserver.model.actor.L2Npc;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
import com.l2jserver.gameserver.model.zone.type.L2EffectZone;
import com.l2jserver.gameserver.network.NpcStringId;
import com.l2jserver.gameserver.network.clientpackets.Say2;

/**
 * Queen Shyeed AI
 * @author malyelfik
 * @author maneco2
 */
public final class QueenShyeed extends AbstractNpcAI {
	// NPCs
	private static final int SHYEED = 25671;
	private static final int SPIKED_STAKATO = 22617;
	private static final int SPIKED_STAKATO_WORKER = 22618;
	private static final int SPIKED_STAKATO_SORCERER = 22623;
	private static final int SPIKED_STAKATO_SOLDIER = 22627;
	private static final int SPIKED_STAKATO_DRONE = 22628;
	// ZONES
	private static final L2EffectZone MOB_BUFF_ZONE = ZoneManager.getInstance().getZoneById(200103, L2EffectZone.class);
	private static final L2EffectZone MOB_BUFF_DISPLAY_ZONE = ZoneManager.getInstance().getZoneById(200104, L2EffectZone.class);
	private static final L2EffectZone PC_BUFF_ZONE = ZoneManager.getInstance().getZoneById(200105, L2EffectZone.class);

	private final List<L2Attackable> _minions = new CopyOnWriteArrayList<>();
	
	private L2Attackable _mob = null;
	
	public QueenShyeed() {
		super(QueenShyeed.class.getSimpleName(), "ai/individual");
		registerMobs(SHYEED,SPIKED_STAKATO,SPIKED_STAKATO_WORKER,SPIKED_STAKATO_SORCERER,SPIKED_STAKATO_SOLDIER,SPIKED_STAKATO_DRONE);
		checkShyeed();
	}
	
	private void checkShyeed() {
		startQuestTimer("SHYEED_DEAD", 30000, null, null);
	}
	
	@Override
	public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) {
		if (event.equalsIgnoreCase("SHYEED_DEAD")) {
			if (RaidBossSpawnManager.getInstance().getRaidBossStatusId(SHYEED) == StatusEnum.DEAD) {
				// Buffs
				PC_BUFF_ZONE.setEnabled(true);
				MOB_BUFF_ZONE.setEnabled(false);
				MOB_BUFF_DISPLAY_ZONE.setEnabled(false);
				//Spawns
				_mob = (L2Attackable) addSpawn(SPIKED_STAKATO, 79783, -54677, -6120, 0, false, 0);
				_minions.add(_mob);
				_mob = (L2Attackable) addSpawn(SPIKED_STAKATO, 80370, -56113, -6136, 0, false, 0);
				_minions.add(_mob);
				_mob = (L2Attackable) addSpawn(SPIKED_STAKATO_WORKER, 80061, -55042, -6120, 0, false, 0);
				_minions.add(_mob);
				_mob = (L2Attackable) addSpawn(SPIKED_STAKATO_WORKER, 79106, -56292, -6120, 0, false, 0);
				_minions.add(_mob);
				_mob = (L2Attackable) addSpawn(SPIKED_STAKATO_SORCERER, 79081, -54904, -6120, 0, false, 0);
				_minions.add(_mob);
				_mob = (L2Attackable) addSpawn(SPIKED_STAKATO_SORCERER, 79908, -56039, -6120, 0, false, 0);
				_minions.add(_mob);
				_mob = (L2Attackable) addSpawn(SPIKED_STAKATO_SOLDIER, 79473, -55709, -6128, 0, false, 0);
				_minions.add(_mob);
				_mob = (L2Attackable) addSpawn(SPIKED_STAKATO_SOLDIER, 79575, -55153, -6128, 0, false, 0);
				_minions.add(_mob);
				_mob = (L2Attackable) addSpawn(SPIKED_STAKATO_DRONE, 80318, -55624, -6120, 0, false, 0);
				_minions.add(_mob);
				_mob = (L2Attackable) addSpawn(SPIKED_STAKATO_DRONE, 78904, -55535, -6120, 0, false, 0);
				_minions.add(_mob);
			}
		}
		return super.onAdvEvent(event, npc, player);
	}
	
	@Override
	public String onSpawn(L2Npc npc) {
		if (npc.getId() == SHYEED) {
			if (RaidBossSpawnManager.getInstance().getRaidBossStatusId(SHYEED) == StatusEnum.ALIVE) {
				PC_BUFF_ZONE.setEnabled(false);
				MOB_BUFF_ZONE.setEnabled(true);
				MOB_BUFF_DISPLAY_ZONE.setEnabled(true);
				if (_minions != null) {
					_minions.forEach(m -> m.decayMe());
					_minions.clear();
				}
			}
		} else {
			if (_mob != null) {
				final L2Spawn spawn = _mob.getSpawn();
				spawn.setAmount(1);
				spawn.setRespawnDelay(64);
				spawn.startRespawn();
			}
		}
		return super.onSpawn(npc);
	}
	
	@Override
	public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon) {
		if (npc.getId() == SHYEED) {
			broadcastNpcSay(npc, Say2.NPC_ALL, NpcStringId.SHYEEDS_CRY_IS_STEADILY_DYING_DOWN);
			startQuestTimer("SHYEED_DEAD", 7000, null, null);
			PC_BUFF_ZONE.setEnabled(true);
			MOB_BUFF_ZONE.setEnabled(false);
			MOB_BUFF_DISPLAY_ZONE.setEnabled(false);
		}
		return super.onKill(npc, killer, isSummon);
	}
}