/*
 * Copyright (C) 2005-2008 L2J_JP / 2008-2013 L2J-SFJP
 * 
 * This file is part of L2J Server.
 * 
 * L2J Server 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 Server 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 events.LetterPiece;

import com.l2jserver.gameserver.instancemanager.QuestManager;
import com.l2jserver.gameserver.model.actor.L2Npc;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
import com.l2jserver.gameserver.model.event.LongTimeEvent;
import com.l2jserver.gameserver.model.quest.Quest;
import com.l2jserver.gameserver.model.quest.QuestState;

/**
 * L2Day Collect Piece of Letters Event
 *
http://svn.l2jfree.com/svn/l2j-free/trunk/l2jfree-datapack/data/scripts/custom/5011_l2day/__init__.py
# ----------------------------------------------------------------------------------
#	        Created by DJ_WEST. (C) Reallite Labs (www.reallite.cs2.ru)  1.11.2005
#	        Official idea - NCSoft. Version: 1.0
#	        Beautified by Lizard
# ----------------------------------------------------------------------------------
 *
 * @author JOJO Rewrite java.
 */
public class LetterPiece extends LongTimeEvent
{
	// Settings
	private static final String qn = "LetterPiece";	/*"5011_l2day"*/

	// [0] chance
	// [1] qty
	// [2...] item

//	/********************************************/
	/* 2009年6月 5周年バージョン                */
	private int[][] REWARDS_5YEAR = {
		{  1, 1,  6660 },	//1等 クイーンアント リング
		{  3, 1,  8762 },	//2等 最上級 生命の石：レベル76
		{  5, 1,  8752 },	//3等 上級　生命の石：レベル76
		{  7, 2,  3959 },	//4等 L2day 祝福された復活スクロール（2枚）
		{ 11, 2,  3958 },	//5等 L2day 祝福された帰還スクロール（2枚）
		{ 13, 1, 13429,		//6等 ベアー キャップ：イベント用
		         13430,		//    ピッグ キャップ：イベント用
		         13431 },	//    ピエロの帽子：イベント用
		{ 17, 2,   736 },	//7等 帰還スクロール2枚
	//	{ 17, 1, 13422 },	//7等 帰還スクロール2枚入りボックス
		{ 19, 2,  7162 },	//8等 原石2個
	//	{ 19, 1, 13423 },	//8等 原石2個入りボックス
		{ 24, 3, 10260,10261,10262,10263,10264,10265,10266,10267,10268,10269,10270 }, //9等 ジュース3本
	//	{ 24, 1, 13424 },	//9等 ジュース3本入りボックス
	};
	private int[][] REWARDS_GRACIA = {
		{  1, 1,  6661 },	//1等 オルフェン イアリング
		{  3, 1,  8752 },	//2等 上級　生命の石：レベル76
		{  5, 1,  8742 },	//3等 中級 生命の石：レベル76
		{  7, 1,  3959 },	//4等 L2day 祝福された復活スクロール（1枚）
		{ 11, 1,  3958 },	//5等 L2day 祝福された帰還スクロール（1枚）
		{ 13, 1, 13429,		//6等 ベアー キャップ：イベント用
		         13430,		//    ピッグ キャップ：イベント用
		         13431 },	//    ピエロの帽子：イベント用
		{ 17, 1,   736 },	//7等 帰還スクロール1枚
	//	{ 17, 1, 13425 },	//7等 帰還スクロール1枚入りボックス
		{ 19, 1,  7162 },	//8等 原石1個
	//	{ 19, 1, 13426 },	//8等 原石1個入りボックス
		{ 23, 2, 10260,10261,10262,10263,10264,10265,10266,10267,10268,10269,10270 }, //9等 ジュース2本
	//	{ 23, 1, 13427 },	//9等 ジュース2本入りボックス
	};
	private int[][] REWARDS_LINEAGEII = {
		{  1, 1,  6662 },	//1等 コア リング
		{  3, 1,  8752 },	//2等 上級　生命の石：レベル76
		{  5, 1,  8742 },	//3等 中級 生命の石：レベル76
		{  7, 1,  3959 },	//4等 L2day 祝福された復活スクロール（1枚）
		{ 11, 1,  3958 },	//5等 L2day 祝福された帰還スクロール（1枚）
		{ 13, 1, 13429,		//6等 ベアー キャップ：イベント用
		         13430,		//    ピッグ キャップ：イベント用
		         13431 },	//    ピエロの帽子：イベント用
		{ 17, 1,   736 },	//7等 帰還スクロール1枚
	//	{ 17, 1, 13425 },	//7等 帰還スクロール1枚入りボックス
		{ 19, 1,  7162 },	//8等 原石1個
	//	{ 19, 1, 13426 },	//8等 原石1個入りボックス
		{ 23, 1, 10260,10261,10262,10263,10264,10265,10266,10267,10268,10269,10270 }, //9等 ジュース1本
	//	{ 23, 1, 13428 },	//9等 ジュース1本入りボックス
	};
//	/********************************************/

//	/********************************************/
//	/* 2007年12月 ファーストスローン バージョン */
//	private int[][] REWARDS_LINEAGEII = {
//		{  1, 1, 6660 },	// 1等 クイーンアント リング
//		{  3, 1, 6662 },	// 2等 コア リング
//		{  5, 1, 8950 },	// 3等 L2Day：おしゃれさんのシャペロン
//		{  7, 1, 8949 },	// 4等 L2Day：フェアリーの触角
//		{ 11, 1, 8947 },	// 5等 L2Day：ウサギの耳
//		{ 13, 1,  729 },	// 6等 武器強化スクロール：Aグレード(1枚)
//		{ 17, 2,  947 },	// 7等 武器強化スクロール：Bグレード(2枚)
//		{ 19, 3,  951 },	// 8等 武器強化スクロール：Cグレード(3枚)
//		{ 23, 1, 3959 },	// 9等 L2day 祝福された復活スクロール(1枚)
//		{ 27, 1, 3958 },	//10等 L2day 祝福された帰還スクロール(1枚)
//		{ 29, 3, 3926,3927,3928,3929,3930,3931,3932,3933,3934,3935 } //11等 L2Day 補助魔法スクロール...
//	};
//	private int[][] REWARDS_THRONE = {
//		{  1, 1, 6660 },	//1等 クイーンアント リング
//		{  3, 1, 6662 },	//2等 コア リング
//		{  5, 1, 8951 },	//3等 L2Day：匠のゴーグル
//		{  7, 1, 8948 },	//4等 L2Day：天使の羽根
//		{ 11, 2,  947 },	//5等 武器強化スクロール：Bグレード(2枚)
//		{ 13, 3,  951 },	//6等 武器強化スクロール：Cグレード(3枚)
//		{ 17, 4,  955 },	//7等 武器強化スクロール：Dグレード(4枚)
//		{ 19, 1, 3959 },	//8等 L2day 祝福された復活スクロール(1枚)
//		{ 23, 1, 3958 },	//9等 L2day 祝福された帰還スクロール(1枚)
//		{ 27, 2, 3926,3927,3928,3929,3930,3931,3932,3933,3934,3935 } //10等 L2Day 補助魔法スクロール...
//	};
//	/********************************************/

//	/********************************************/
//	/* 2005年12月 クロニクル バージョン         */
//	private int[][] REWARDS_LINEAGEII = {
//		{ 10, 5,  947 },	//1等 武器強化スクロール：Bグレード(5枚)
//		{ 20, 3, 3959 },	//2等 L2day 祝福された復活スクロール(3枚)
//		{ 30, 3, 3958 },	//3等 L2day 祝福された帰還スクロール(3枚)
//		{ 40, 3, 3926,3927,3928,3929,3930,3931,3932,3933,3934,3935 } //4等 L2Dayスク3枚
//	};
//	private int[][] REWARDS_NCSOFT = {
//		{ 10, 5,  951 },	//1等 武器強化スクロール：Cグレード(5枚)
//		{ 20, 2, 3959 },	//2等 L2day 祝福された復活スクロール(2枚)
//		{ 30, 2, 3958 },	//3等 L2day 祝福された帰還スクロール(2枚)
//		{ 40, 2, 3926,3927,3928,3929,3930,3931,3932,3933/*,3934*/,3935 } //4等 L2Dayスク2枚
//	};
//	private int[][] REWARDS_CHRONICLE = {
//		{ 10, 5,  955 },	//1等 武器強化スクロール：Dグレード(5枚)
//		{ 20, 1, 3959 },	//2等 L2day 祝福された復活スクロール(1枚)
//		{ 30, 1, 3958 },	//3等 L2day 祝福された帰還スクロール(1枚)
//		{ 40, 1, 3926,3927,3928,3929/*,3930*/,3931,3932,3933/*,3934*/,3935 } //4等 L2Dayスク1枚
//	};
//	/********************************************/

	// QUEST ITEMS : Letters to form words
	@SuppressWarnings("unused")
	private static final int
	A  = 3875,
	C  = 3876,
	E  = 3877,
	F  = 3878,
	G  = 3879,
	H  = 3880,
	I  = 3881,
	L  = 3882,
	N  = 3883,
	O  = 3884,
	R  = 3885,
	S  = 3886,
	T  = 3887,
	II = 3888,
	Y  = 13417,
	_5 = 13418;

	private class ItemTable
	{
		final String name;
		final int[][] reword;
		final int[] ingredient;
		ItemTable(String name, int[][] reword, int[] ingredient)
		{
			this.name = name;
			this.reword = reword;
			this.ingredient = ingredient;
		}
	}
	private ItemTable[] itemTable = {
		new ItemTable("THRONE",    REWARDS_5YEAR,     new int[]{ T, 1, H, 1, R, 1, O, 1, N, 1, E, 1 }),
		new ItemTable("LINEAGEII", REWARDS_LINEAGEII, new int[]{ L, 1, I, 1, N, 1, E, 1, A, 1, G, 1, E, 1, II, 1 }),
		new ItemTable("GRACIA",    REWARDS_GRACIA,    new int[]{ G, 1, R, 1, A, 2, C, 1, I, 1 }),
//		new ItemTable("NCSOFT",    REWARDS_NCSOFT,    new int[]{ N, 1, C, 1, S, 1, O, 1, F, 1, T, 1 }),
//		new ItemTable("CHRONICLE", REWARDS_CHRONICLE, new int[]{ C, 1, H, 1, R, 1, O, 1, N, 1, I, 1, C, 1, L, 1, E, 1 }),
//		new ItemTable("5YEAR",     REWARDS_5YEAR,     new int[]{_5, 1, Y, 1, E, 1, A, 1, R, 1 }),
//		new ItemTable("FLAYER",    REWARDS_FLAYER,    new int[]{ F, 1, L, 1, A, 1, Y, 1, E, 1, R, 1 }),
//		new ItemTable("FRINTESSA", REWARDS_FRINTESSA, new int[]{ F, 1, R, 1, I, 1, N, 1, T, 1, E, 1, S, 2, A, 1 }),
//		new ItemTable("HALISHA",   REWARDS_HALISHA,   new int[]{ H, 2, A, 2, L, 1, I, 1, S, 1 }),
//		new ItemTable("ORFEN",     REWARDS_ORFEN,     new int[]{ O, 1, R, 1, F, 1, E, 1, N, 1 }),
//		new ItemTable("CHAOTIC",   REWARDS_CHAOTIC,   new int[]{ C, 1, H, 1, A, 1, O, 1, T, 1, I, 1, C, 1 }),
	};

	private static final int[] MANAGERS =
	{
		31854,	//イベント管理人 ヒューマン
		31855,	//イベント管理人 エルフ
		31856,	//イベント管理人 ダークエルフ
		31857,	//イベント管理人 ドワーフ
		31858,	//イベント管理人 オーク
	};

	// doRequestedEvent
	private String do_RequestedEvent(String event, QuestState st, int[][] rewardTable, int[] ingredientTable)
	{
		for (int i = 0; i < ingredientTable.length; i += 2)
			if (st.getQuestItemsCount(ingredientTable[i+0]) < ingredientTable[i+1])
				return "no.htm";
		for (int i = 0; i < ingredientTable.length; i += 2)
			st.takeItems(ingredientTable[i+0], ingredientTable[i+1]);

		int total = 0;
		for (int[] a : rewardTable)
			total += a[0];
		int rnd = st.getRandom(total);
		for (int[] a : rewardTable) {
			// [0] chance
			// [1] qty
			// [2...] item
			/*static*/final int IX = 2;
			if ((rnd -= a[0]) < 0) {
				int qty = a[1];
				if (a.length - IX == 1) {
					st.giveItems(a[IX], qty);
				}
				else
				{
					while (--qty >= 0)
						st.giveItems(a[IX + st.getRandom(a.length - IX)], 1);
				}
				return "finish.htm";
			}
		}
		throw new RuntimeException();
	}

	// main code

	private LetterPiece()
	{
		super(qn, "events");
		
		addStartNpc(MANAGERS);
		addFirstTalkId(MANAGERS);
		addTalkId(MANAGERS);
		addSpawnId(MANAGERS);
	}

	@Override
	public String onSpawn(L2Npc npc)
	{
		npc.setTitle("文字の欠片");
		return super.onSpawn(npc);
	}

	@Override
	public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
	{
		if (event.length() == 0 || event.equals("0"))	// <a>もどる</a>
			return npc.getId()+".htm";				// 31854.htm〜31858.htm
		QuestState st = player.getQuestState(getName());
		if (st != null) {
			String htmltext = event;
			for (ItemTable items : itemTable) {
				if (event.equals(items.name)) {
					htmltext = do_RequestedEvent(event, st, items.reword, items.ingredient);
					break;
				}
			}
			if (htmltext != event)
				st.exitQuest(false);
			return htmltext;
		}
		return null;
	}

	@Override
	public String onFirstTalk(L2Npc npc, L2PcInstance player)
	{
		QuestState st = player.getQuestState(getName());
		if (st == null)
		{
			Quest q = QuestManager.getInstance().getQuest(getName());
			st = q.newQuestState(player);
		}
		return npc.getId()+".htm";	// 31854.htm〜31858.htm
	}

	// Quest class and state definition
	public static void main(String[] args)
	{
		new LetterPiece();
	}
}