package net.sf.l2j.gameserver.handler.itemhandlers;


import net.sf.l2j.gameserver.datatables.NpcTable;
import net.sf.l2j.gameserver.handler.IItemHandler;
import net.sf.l2j.gameserver.idfactory.IdFactory;
import net.sf.l2j.gameserver.model.L2ItemInstance;
import net.sf.l2j.gameserver.model.L2Spawn;
import net.sf.l2j.gameserver.model.L2World;
import net.sf.l2j.gameserver.model.actor.instance.L2MonsterInstance;
import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
import net.sf.l2j.gameserver.model.actor.instance.L2PlayableInstance;
import net.sf.l2j.gameserver.network.SystemMessageId;
import net.sf.l2j.gameserver.network.serverpackets.MagicSkillUse;
import net.sf.l2j.gameserver.network.serverpackets.SystemMessage;
import net.sf.l2j.gameserver.templates.chars.L2NpcTemplate;
import net.sf.l2j.util.Rnd;

public class Nectar implements IItemHandler
{
    // ネクター
    private static int[] _itemIds = { 6391 };
    
	final static int _npcId_Young_Squash = 13008;		// 幼いポモナ
	final static int _npcId_Large_Young_Squash = 13011;	// 幼い大きなポモナ

    public void useItem(L2PlayableInstance playable, L2ItemInstance item)
    {
        L2PcInstance activeChar = (L2PcInstance)playable;
        L2NpcTemplate template1 = null;
        
        // ターゲットがL2MonsterInstanceでない場合はエラー
        if(!(activeChar.getTarget() instanceof L2MonsterInstance))
        {
            activeChar.sendPacket(new SystemMessage(SystemMessageId.INCORRECT_TARGET));
            return;
        }
        // ターゲットが幼いポモナ、幼い大きなポモナでない場合はエラー
        if (!(((L2MonsterInstance)activeChar.getTarget()).getNpcId() == _npcId_Young_Squash || 
                ((L2MonsterInstance)activeChar.getTarget()).getNpcId() == _npcId_Large_Young_Squash))
        {
            activeChar.sendPacket(new SystemMessage(SystemMessageId.INCORRECT_TARGET));
            return;
        }

        L2MonsterInstance targetObj = (L2MonsterInstance)activeChar.getTarget();
        
        // ターゲットが存在していて、死んでない場合のみ実行
        if(targetObj != null && !targetObj.isDead())
        {
            // ネクターを使用する際の画面効果
            MagicSkillUse MSU = new MagicSkillUse(activeChar,targetObj,2103,1,0,0);
            activeChar.sendPacket(MSU);
            activeChar.broadcastPacket(MSU);

            try
            {
                // 良質なポモナになるかの判定
                if(isQualityHigh(targetObj.getNpcId()))
                {
                    // 良質なポモナのNPC Template情報を取得
                    template1 = NpcTable.getInstance().getTemplate(targetObj.getNpcId()+1);
                    // NPC Template情報を元に出現データを作成
                    L2Spawn spawn = new L2Spawn(template1);
                    spawn.setId(IdFactory.getInstance().getNextId());
                    spawn.setLocx(targetObj.getX());
                    spawn.setLocy(targetObj.getY());
                    spawn.setLocz(targetObj.getZ());
                    // ターゲット(幼いポモナ)を消去
                    targetObj.deleteMe();
                    // 良質なポモナを出現
                    L2World.getInstance().storeObject(spawn.spawnOne(/*仮〓*/false));
                }
                else
                {
                    // 不良なポモナのNPC Template情報を取得
                    template1 = NpcTable.getInstance().getTemplate(targetObj.getNpcId()+2);
                    // NPC Template情報を元に出現データを作成
                    L2Spawn spawn = new L2Spawn(template1);
                    spawn.setId(IdFactory.getInstance().getNextId());
                    spawn.setLocx(targetObj.getX());
                    spawn.setLocy(targetObj.getY());
                    spawn.setLocz(targetObj.getZ());
                    // ターゲット(幼いポモナ)を消去
                    targetObj.deleteMe();
                    // 不良なポモナを出現
                    L2World.getInstance().storeObject(spawn.spawnOne(/*仮〓*/false));
                }
    
                // 使い終わったネクターを消去
                activeChar.destroyItem("Consume", item.getObjectId(), 1, null, false);
            }
            catch (Exception e)
            {
                activeChar.sendPacket(new SystemMessage(SystemMessageId.INCORRECT_TARGET));
            }
        }
    }
    
    public int[] getItemIds()
    {
        return _itemIds;
    }
    
    // 良質なポモナになるかの判定関数
    private boolean isQualityHigh(int npcId)
    {
        // 幼いポモナは３０％の確率で良質なポモナになる
        if(npcId == _npcId_Young_Squash && Rnd.get(100) < 30)
            return true;
        // 幼い大きなポモナは１５％の確率で良質な大きなポモナになる
        else if (npcId == _npcId_Large_Young_Squash && Rnd.get(100) < 15)
            return true;
        // それ以外は不良なポモナ／不良な大きなポモナになる
        else
            return false;
    }
}