/*
 * This program 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.
 *
 * This program 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.gameserver.model.actor.instance;

import com.l2jserver.Config;
import com.l2jserver.gameserver.SevenSigns;
import com.l2jserver.gameserver.SevenSignsFestival;
import com.l2jserver.gameserver.model.actor.L2Npc;
import com.l2jserver.gameserver.network.serverpackets.ActionFailed;
import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage;
import com.l2jserver.gameserver.templates.chars.L2NpcTemplate;
import com.l2jserver.util.StringUtil;


/**
 * Festival of Darkness Guide (Seven Signs)
 *
 * @author Tempy
 */
public final class L2FestivalGuideInstance extends L2Npc
{
    private final int _festivalType;
    private final int _festivalOracle;
    private final int _blueStonesNeeded;
    private final int _greenStonesNeeded;
    private final int _redStonesNeeded;

    /**
     * @param template
     */
    public L2FestivalGuideInstance(int objectId, L2NpcTemplate template)
    {
        super(objectId, template);
        setInstanceType(InstanceType.L2FestivalGiudeInstance);

        switch (getNpcId())
        {
            case 31127:
            case 31132:
                _festivalType = SevenSignsFestival.FESTIVAL_LEVEL_MAX_31;
                _festivalOracle = SevenSigns.CABAL_DAWN;
                _blueStonesNeeded = 900;
                _greenStonesNeeded = 540;
                _redStonesNeeded = 270;
                break;
            case 31128:
            case 31133:
                _festivalType = SevenSignsFestival.FESTIVAL_LEVEL_MAX_42;
                _festivalOracle = SevenSigns.CABAL_DAWN;
                _blueStonesNeeded = 1500;
                _greenStonesNeeded = 900;
                _redStonesNeeded = 450;
                break;
            case 31129:
            case 31134:
                _festivalType = SevenSignsFestival.FESTIVAL_LEVEL_MAX_53;
                _festivalOracle = SevenSigns.CABAL_DAWN;
                _blueStonesNeeded = 3000;
                _greenStonesNeeded = 1800;
                _redStonesNeeded = 900;
                break;
            case 31130:
            case 31135:
                _festivalType = SevenSignsFestival.FESTIVAL_LEVEL_MAX_64;
                _festivalOracle = SevenSigns.CABAL_DAWN;
                _blueStonesNeeded = 4500;
                _greenStonesNeeded = 2700;
                _redStonesNeeded = 1350;
                break;
            case 31131:
            case 31136:
                _festivalType = SevenSignsFestival.FESTIVAL_LEVEL_MAX_NONE;
                _festivalOracle = SevenSigns.CABAL_DAWN;
                _blueStonesNeeded = 6000;
                _greenStonesNeeded = 3600;
                _redStonesNeeded = 1800;
                break;

            case 31137:
            case 31142:
                _festivalType = SevenSignsFestival.FESTIVAL_LEVEL_MAX_31;
                _festivalOracle = SevenSigns.CABAL_DUSK;
                _blueStonesNeeded = 900;
                _greenStonesNeeded = 540;
                _redStonesNeeded = 270;
                break;
            case 31138:
            case 31143:
                _festivalType = SevenSignsFestival.FESTIVAL_LEVEL_MAX_42;
                _festivalOracle = SevenSigns.CABAL_DUSK;
                _blueStonesNeeded = 1500;
                _greenStonesNeeded = 900;
                _redStonesNeeded = 450;
                break;
            case 31139:
            case 31144:
                _festivalType = SevenSignsFestival.FESTIVAL_LEVEL_MAX_53;
                _festivalOracle = SevenSigns.CABAL_DUSK;
                _blueStonesNeeded = 3000;
                _greenStonesNeeded = 1800;
                _redStonesNeeded = 900;
                break;
            case 31140:
            case 31145:
                _festivalType = SevenSignsFestival.FESTIVAL_LEVEL_MAX_64;
                _festivalOracle = SevenSigns.CABAL_DUSK;
                _blueStonesNeeded = 4500;
                _greenStonesNeeded = 2700;
                _redStonesNeeded = 1350;
                break;
            case 31141:
            case 31146:
                _festivalType = SevenSignsFestival.FESTIVAL_LEVEL_MAX_NONE;
                _festivalOracle = SevenSigns.CABAL_DUSK;
                _blueStonesNeeded = 6000;
                _greenStonesNeeded = 3600;
                _redStonesNeeded = 1800;
                break;
            default:
            	_festivalType = SevenSignsFestival.FESTIVAL_LEVEL_MAX_NONE;
            	_festivalOracle = SevenSigns.CABAL_NULL;
            	_blueStonesNeeded = 0;
            	_greenStonesNeeded = 0;
            	_redStonesNeeded = 0;
        }
    }

    public int getFestivalType()
    {
    	return _festivalType;
    }

    public int getFestivalOracle()
    {
    	return _festivalOracle;
    }

    public int getStoneCount(int stoneType)
    {
    	switch(stoneType)
    	{
    		case SevenSigns.SEAL_STONE_BLUE_ID:
    			return _blueStonesNeeded;
    		case SevenSigns.SEAL_STONE_GREEN_ID:
    			return _greenStonesNeeded;
    		case SevenSigns.SEAL_STONE_RED_ID:
    			return _redStonesNeeded;
    		default:
    			return -1;
    	}
    }

    public final void showChatWindow(L2PcInstance player, int val, String suffix, boolean isDescription)
    {
        String filename = SevenSigns.SEVEN_SIGNS_HTML_PATH + "festival/";
        filename += (isDescription) ? "desc_" : "festival_";
        filename += (suffix != null) ? val + suffix + ".htm" : val + ".htm";

        // Send a Server->Client NpcHtmlMessage containing the text of the L2NpcInstance to the L2PcInstance
        NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
        html.setFile(player.getHtmlPrefix(), filename);
        html.replace("%objectId%",String.valueOf(getObjectId()));
        html.replace("%festivalType%", SevenSignsFestival.getFestivalName(_festivalType));
        html.replace("%cycleMins%", String.valueOf(SevenSignsFestival.getInstance().getMinsToNextCycle()));
        if (!isDescription && "2b".equals(val + suffix))
            html.replace("%minFestivalPartyMembers%", String.valueOf(Config.ALT_FESTIVAL_MIN_PLAYER));

        // If the stats or bonus table is required, construct them.
        if (val == 5) html.replace("%statsTable%", getStatsTable());
        if (val == 6) html.replace("%bonusTable%", getBonusTable());

        //festival's fee
        if (val == 1)
        {
    		html.replace("%blueStoneNeeded%",String.valueOf(_blueStonesNeeded));
    		html.replace("%greenStoneNeeded%",String.valueOf(_greenStonesNeeded));
    		html.replace("%redStoneNeeded%",String.valueOf(_redStonesNeeded));
        }

        player.sendPacket(html);

        // Send a Server->Client ActionFailed to the L2PcInstance in order to avoid that the client wait another packet
        player.sendPacket( ActionFailed.STATIC_PACKET );
    }

    private static final String getStatsTable()
    {
        final StringBuilder tableHtml = new StringBuilder(1000);

        // Get the scores for each of the festival level ranges (types).
        for (int i = 0; i < 5; i++)
        {
            int dawnScore = SevenSignsFestival.getInstance().getHighestScore(SevenSigns.CABAL_DAWN, i);
            int duskScore = SevenSignsFestival.getInstance().getHighestScore(SevenSigns.CABAL_DUSK, i);
            String festivalName = SevenSignsFestival.getFestivalName(i);
            String winningCabal = "Children of Dusk";

            if (dawnScore > duskScore)
                winningCabal = "Children of Dawn";
            else if (dawnScore == duskScore)
                winningCabal = "None";

            StringUtil.append(tableHtml,
                    "<tr><td width=\"100\" align=\"center\">",
                    festivalName,
                    "</td><td align=\"center\" width=\"35\">",
                    String.valueOf(duskScore),
                    "</td><td align=\"center\" width=\"35\">",
                    String.valueOf(dawnScore),
                    "</td><td align=\"center\" width=\"130\">",
                    winningCabal,
                    "</td></tr>"
                    );
        }

        return tableHtml.toString();
    }

    private static final String getBonusTable()
    {
        final StringBuilder tableHtml = new StringBuilder(500);

        // Get the accumulated scores for each of the festival level ranges (types).
        for (int i = 0; i < 5; i++)
        {
            int accumScore = SevenSignsFestival.getInstance().getAccumulatedBonus(i);
            String festivalName = SevenSignsFestival.getFestivalName(i);

            StringUtil.append(tableHtml,
                    "<tr><td align=\"center\" width=\"150\">",
                    festivalName,
                    "</td><td align=\"center\" width=\"150\">",
                    String.valueOf(accumScore),
                    "</td></tr>"
                    );
        }

        return tableHtml.toString();
    }
}
