/*
 * Copyright (C) 2004-2015 L2J Server
 * 
 * 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 .
 */
package com.l2jserver.gameserver.model.base;
import static com.l2jserver.gameserver.model.base.ClassLevel.FIRST;
import static com.l2jserver.gameserver.model.base.ClassLevel.FOURTH;
import static com.l2jserver.gameserver.model.base.ClassLevel.SECOND;
import static com.l2jserver.gameserver.model.base.ClassLevel.THIRD;
import static com.l2jserver.gameserver.model.base.ClassType.Fighter;
import static com.l2jserver.gameserver.model.base.ClassType.Mystic;
import static com.l2jserver.gameserver.model.base.ClassType.Priest;
import java.util.EnumSet;
import com.l2jserver.gameserver.enums.Race;
/**
 * @author luisantonioa
 */
public enum PlayerClass
{
	HumanFighter(Race.HUMAN, Fighter, FIRST),
	Warrior(Race.HUMAN, Fighter, SECOND),
	Gladiator(Race.HUMAN, Fighter, THIRD),
	Warlord(Race.HUMAN, Fighter, THIRD),
	HumanKnight(Race.HUMAN, Fighter, SECOND),
	Paladin(Race.HUMAN, Fighter, THIRD),
	DarkAvenger(Race.HUMAN, Fighter, THIRD),
	Rogue(Race.HUMAN, Fighter, SECOND),
	TreasureHunter(Race.HUMAN, Fighter, THIRD),
	Hawkeye(Race.HUMAN, Fighter, THIRD),
	HumanMystic(Race.HUMAN, Mystic, FIRST),
	HumanWizard(Race.HUMAN, Mystic, SECOND),
	Sorceror(Race.HUMAN, Mystic, THIRD),
	Necromancer(Race.HUMAN, Mystic, THIRD),
	Warlock(Race.HUMAN, Mystic, THIRD),
	Cleric(Race.HUMAN, Priest, SECOND),
	Bishop(Race.HUMAN, Priest, THIRD),
	Prophet(Race.HUMAN, Priest, THIRD),
	
	ElvenFighter(Race.ELF, Fighter, FIRST),
	ElvenKnight(Race.ELF, Fighter, SECOND),
	TempleKnight(Race.ELF, Fighter, THIRD),
	Swordsinger(Race.ELF, Fighter, THIRD),
	ElvenScout(Race.ELF, Fighter, SECOND),
	Plainswalker(Race.ELF, Fighter, THIRD),
	SilverRanger(Race.ELF, Fighter, THIRD),
	ElvenMystic(Race.ELF, Mystic, FIRST),
	ElvenWizard(Race.ELF, Mystic, SECOND),
	Spellsinger(Race.ELF, Mystic, THIRD),
	ElementalSummoner(Race.ELF, Mystic, THIRD),
	ElvenOracle(Race.ELF, Priest, SECOND),
	ElvenElder(Race.ELF, Priest, THIRD),
	
	DarkElvenFighter(Race.DARK_ELF, Fighter, FIRST),
	PalusKnight(Race.DARK_ELF, Fighter, SECOND),
	ShillienKnight(Race.DARK_ELF, Fighter, THIRD),
	Bladedancer(Race.DARK_ELF, Fighter, THIRD),
	Assassin(Race.DARK_ELF, Fighter, SECOND),
	AbyssWalker(Race.DARK_ELF, Fighter, THIRD),
	PhantomRanger(Race.DARK_ELF, Fighter, THIRD),
	DarkElvenMystic(Race.DARK_ELF, Mystic, FIRST),
	DarkElvenWizard(Race.DARK_ELF, Mystic, SECOND),
	Spellhowler(Race.DARK_ELF, Mystic, THIRD),
	PhantomSummoner(Race.DARK_ELF, Mystic, THIRD),
	ShillienOracle(Race.DARK_ELF, Priest, SECOND),
	ShillienElder(Race.DARK_ELF, Priest, THIRD),
	
	OrcFighter(Race.ORC, Fighter, FIRST),
	OrcRaider(Race.ORC, Fighter, SECOND),
	Destroyer(Race.ORC, Fighter, THIRD),
	OrcMonk(Race.ORC, Fighter, SECOND),
	Tyrant(Race.ORC, Fighter, THIRD),
	OrcMystic(Race.ORC, Mystic, FIRST),
	OrcShaman(Race.ORC, Mystic, SECOND),
	Overlord(Race.ORC, Mystic, THIRD),
	Warcryer(Race.ORC, Mystic, THIRD),
	
	DwarvenFighter(Race.DWARF, Fighter, FIRST),
	DwarvenScavenger(Race.DWARF, Fighter, SECOND),
	BountyHunter(Race.DWARF, Fighter, THIRD),
	DwarvenArtisan(Race.DWARF, Fighter, SECOND),
	Warsmith(Race.DWARF, Fighter, THIRD),
	
	dummyEntry1(null, null, null),
	dummyEntry2(null, null, null),
	dummyEntry3(null, null, null),
	dummyEntry4(null, null, null),
	dummyEntry5(null, null, null),
	dummyEntry6(null, null, null),
	dummyEntry7(null, null, null),
	dummyEntry8(null, null, null),
	dummyEntry9(null, null, null),
	dummyEntry10(null, null, null),
	dummyEntry11(null, null, null),
	dummyEntry12(null, null, null),
	dummyEntry13(null, null, null),
	dummyEntry14(null, null, null),
	dummyEntry15(null, null, null),
	dummyEntry16(null, null, null),
	dummyEntry17(null, null, null),
	dummyEntry18(null, null, null),
	dummyEntry19(null, null, null),
	dummyEntry20(null, null, null),
	dummyEntry21(null, null, null),
	dummyEntry22(null, null, null),
	dummyEntry23(null, null, null),
	dummyEntry24(null, null, null),
	dummyEntry25(null, null, null),
	dummyEntry26(null, null, null),
	dummyEntry27(null, null, null),
	dummyEntry28(null, null, null),
	dummyEntry29(null, null, null),
	dummyEntry30(null, null, null),
	/*
	 * (3rd classes)
	 */
	duelist(Race.HUMAN, Fighter, FOURTH),
	dreadnought(Race.HUMAN, Fighter, FOURTH),
	phoenixKnight(Race.HUMAN, Fighter, FOURTH),
	hellKnight(Race.HUMAN, Fighter, FOURTH),
	sagittarius(Race.HUMAN, Fighter, FOURTH),
	adventurer(Race.HUMAN, Fighter, FOURTH),
	archmage(Race.HUMAN, Mystic, FOURTH),
	soultaker(Race.HUMAN, Mystic, FOURTH),
	arcanaLord(Race.HUMAN, Mystic, FOURTH),
	cardinal(Race.HUMAN, Priest, FOURTH),
	hierophant(Race.HUMAN, Priest, FOURTH),
	
	evaTemplar(Race.ELF, Fighter, FOURTH),
	swordMuse(Race.ELF, Fighter, FOURTH),
	windRider(Race.ELF, Fighter, FOURTH),
	moonlightSentinel(Race.ELF, Fighter, FOURTH),
	mysticMuse(Race.ELF, Mystic, FOURTH),
	elementalMaster(Race.ELF, Mystic, FOURTH),
	evaSaint(Race.ELF, Priest, FOURTH),
	
	shillienTemplar(Race.DARK_ELF, Fighter, FOURTH),
	spectralDancer(Race.DARK_ELF, Fighter, FOURTH),
	ghostHunter(Race.DARK_ELF, Fighter, FOURTH),
	ghostSentinel(Race.DARK_ELF, Fighter, FOURTH),
	stormScreamer(Race.DARK_ELF, Mystic, FOURTH),
	spectralMaster(Race.DARK_ELF, Mystic, FOURTH),
	shillienSaint(Race.DARK_ELF, Priest, FOURTH),
	
	titan(Race.ORC, Fighter, FOURTH),
	grandKhavatari(Race.ORC, Fighter, FOURTH),
	dominator(Race.ORC, Mystic, FOURTH),
	doomcryer(Race.ORC, Mystic, FOURTH),
	
	fortuneSeeker(Race.DWARF, Fighter, FOURTH),
	maestro(Race.DWARF, Fighter, FOURTH),
	
	dummyEntry31(null, null, null),
	dummyEntry32(null, null, null),
	dummyEntry33(null, null, null),
	dummyEntry34(null, null, null),
	
	maleSoldier(Race.KAMAEL, Fighter, FIRST),
	femaleSoldier(Race.KAMAEL, Fighter, FIRST),
	trooper(Race.KAMAEL, Fighter, SECOND),
	warder(Race.KAMAEL, Fighter, SECOND),
	berserker(Race.KAMAEL, Fighter, THIRD),
	maleSoulbreaker(Race.KAMAEL, Fighter, THIRD),
	femaleSoulbreaker(Race.KAMAEL, Fighter, THIRD),
	arbalester(Race.KAMAEL, Fighter, THIRD),
	doombringer(Race.KAMAEL, Fighter, FOURTH),
	maleSoulhound(Race.KAMAEL, Fighter, FOURTH),
	femaleSoulhound(Race.KAMAEL, Fighter, FOURTH),
	trickster(Race.KAMAEL, Fighter, FOURTH),
	inspector(Race.KAMAEL, Fighter, THIRD),
	judicator(Race.KAMAEL, Fighter, FOURTH),
	
	dummyEntry35(null, null, null),
	dummyEntry36(null, null, null),
	
	sigelKnight(null, Fighter, null),
	tyrWarrior(null, Fighter, null),
	otherRogue(null, Fighter, null),
	yrArcher(null, Fighter, null),
	feohWizard(null, Mystic, null),
	issEnchanter(null, Priest, null),
	wynnSummoner(null, Mystic, null),
	eolhHealer(null, Priest, null),
	
	dummyEntry37(null, null, null),
	
	sigelPhoenixKnight(Race.HUMAN, Fighter, ClassLevel.AWAKEN),
	sigelHellKnight(Race.HUMAN, Fighter, ClassLevel.AWAKEN),
	sigelEvasTemplar(Race.ELF, Fighter, ClassLevel.AWAKEN),
	sigelShilenTemplar(Race.DARK_ELF, Fighter, ClassLevel.AWAKEN),
	tyrrDuelist(Race.HUMAN, Fighter, ClassLevel.AWAKEN),
	tyrrDreadnought(Race.HUMAN, Fighter, ClassLevel.AWAKEN),
	tyrrTitan(Race.ORC, Fighter, ClassLevel.AWAKEN),
	tyrrGrandKhavatari(Race.ORC, Fighter, ClassLevel.AWAKEN),
	tyrrMaestro(Race.DWARF, Fighter, ClassLevel.AWAKEN),
	tyrrDoombringer(Race.KAMAEL, Fighter, ClassLevel.AWAKEN),
	othellAdventurer(Race.HUMAN, Fighter, ClassLevel.AWAKEN),
	othellWindRider(Race.ELF, Fighter, ClassLevel.AWAKEN),
	othellGhostHunter(Race.DARK_ELF, Fighter, ClassLevel.AWAKEN),
	othellFortuneSeeker(Race.DWARF, Fighter, ClassLevel.AWAKEN),
	yulSagittarius(Race.HUMAN, Fighter, ClassLevel.AWAKEN),
	yulMoonlightSentinel(Race.ELF, Fighter, ClassLevel.AWAKEN),
	yulGhostSentinel(Race.DARK_ELF, Fighter, ClassLevel.AWAKEN),
	yulTrickster(Race.KAMAEL, Fighter, ClassLevel.AWAKEN),
	feohArchmage(Race.HUMAN, Mystic, ClassLevel.AWAKEN),
	feohSoultaker(Race.HUMAN, Mystic, ClassLevel.AWAKEN),
	feohMysticMuse(Race.ELF, Mystic, ClassLevel.AWAKEN),
	feoStormScreamer(Race.DARK_ELF, Mystic, ClassLevel.AWAKEN),
	feohSoulHound(Race.KAMAEL, Mystic, ClassLevel.AWAKEN), // fix me
	issHierophant(Race.HUMAN, Priest, ClassLevel.AWAKEN),
	issSwordMuse(Race.ELF, Fighter, ClassLevel.AWAKEN),
	issSpectralDancer(Race.DARK_ELF, Fighter, ClassLevel.AWAKEN),
	issDominator(Race.ORC, Priest, ClassLevel.AWAKEN),
	issDoomcryer(Race.ORC, Priest, ClassLevel.AWAKEN),
	wynnArcanaLord(Race.HUMAN, Mystic, ClassLevel.AWAKEN),
	wynnElementalMaster(Race.ELF, Mystic, ClassLevel.AWAKEN),
	wynnSpectralMaster(Race.DARK_ELF, Mystic, ClassLevel.AWAKEN),
	aeoreCardinal(Race.HUMAN, Priest, ClassLevel.AWAKEN),
	aeoreEvaSaint(Race.ELF, Priest, ClassLevel.AWAKEN),
	aeoreShillienSaint(Race.DARK_ELF, Priest, ClassLevel.AWAKEN),
	
	ertheiaFighter(Race.ERTHEIA, Fighter, ClassLevel.FIRST),
	ertheiaWizzard(Race.ERTHEIA, Mystic, ClassLevel.FIRST),
	
	marauder(Race.ERTHEIA, Fighter, ClassLevel.THIRD),
	cloudBreaker(Race.ERTHEIA, Mystic, ClassLevel.THIRD),
	
	ripper(Race.ERTHEIA, Fighter, ClassLevel.FOURTH),
	Stratomancer(Race.ERTHEIA, Mystic, ClassLevel.FOURTH),
	
	eviscerator(Race.ERTHEIA, Fighter, ClassLevel.AWAKEN),
	sayhaSeer(Race.ERTHEIA, Mystic, ClassLevel.AWAKEN);
	
	private Race _race;
	private ClassLevel _level;
	private ClassType _type;
	
	private PlayerClass(Race race, ClassType pType, ClassLevel pLevel)
	{
		_race = race;
		_level = pLevel;
		_type = pType;
	}
	
	public static final EnumSet getSet(Race race, ClassLevel level)
	{
		EnumSet allOf = EnumSet.noneOf(PlayerClass.class);
		
		for (PlayerClass playerClass : EnumSet.allOf(PlayerClass.class))
		{
			if ((race == null) || playerClass.isOfRace(race))
			{
				if ((level == null) || playerClass.isOfLevel(level))
				{
					allOf.add(playerClass);
				}
			}
		}
		return allOf;
	}
	
	public final boolean isOfRace(Race pRace)
	{
		return _race == pRace;
	}
	
	public final boolean isOfType(ClassType pType)
	{
		return _type == pType;
	}
	
	public final boolean isOfLevel(ClassLevel pLevel)
	{
		return _level == pLevel;
	}
	
	public final ClassLevel getLevel()
	{
		return _level;
	}
}