package gregtech.api.enums;

import gregtech.api.util.GT_Utility;

import java.util.ArrayList;

/**
 * This is some kind of Periodic Table, which I use to determine Properties of the Materials.
 */
public enum Element {
	_NULL	(   0,   0,   0,          -1, null		, ""				, false),
	H		(   1,   0,   0,          -1, null		, "Hydrogen"		, false),
	D		(   1,   1,   0,          -1, "H"		, "Deuterium"		, true),
	T		(   1,   2,   0,          -1, "D"		, "Tritium"			, true),
	He		(   2,   2,   0,          -1, null		, "Helium"			, false),
	He_3	(   2,   1,   0,          -1, "H&D"		, "Helium-3"		, true),
	Li		(   3,   4,   0,          -1, null		, "Lithium"			, false),
	Be		(   4,   5,   0,          -1, null		, "Beryllium"		, false),
	B		(   5,   5,   0,          -1, null		, "Boron"			, false),
	C		(   6,   6,   0,          -1, null		, "Carbon"			, false),
	N		(   7,   7,   0,          -1, null		, "Nitrogen"		, false),
	O		(   8,   8,   0,          -1, null		, "Oxygen"			, false),
	F		(   9,   9,   0,          -1, null		, "Fluorine"		, false),
	Ne		(  10,  10,   0,          -1, null		, "Neon"			, false),
	Na		(  11,  11,   0,          -1, null		, "Sodium"			, false),
	Mg		(  12,  12,   0,          -1, null		, "Magnesium"		, false),
	Al		(  13,  13,   0,          -1, null		, "Aluminium"		, false),
	Si		(  14,  14,   0,          -1, null		, "Silicon"			, false),
	P		(  15,  15,   0,          -1, null		, "Phosphorus"		, false),
	S		(  16,  16,   0,          -1, null		, "Sulfur"			, false),
	Cl		(  17,  18,   0,          -1, null		, "Chlorine"		, false),
	Ar		(  18,  22,   0,          -1, null		, "Argon"			, false),
	K		(  19,  20,   0,          -1, null		, "Potassium"		, false),
	Ca		(  20,  20,   0,          -1, null		, "Calcium"			, false),
	Sc		(  21,  24,   0,          -1, null		, "Scandium"		, false),
	Ti		(  22,  26,   0,          -1, null		, "Titanium"		, false),
	V		(  23,  28,   0,          -1, null		, "Vanadium"		, false),
	Cr		(  24,  28,   0,          -1, null		, "Chrome"			, false),
	Mn		(  25,  30,   0,          -1, null		, "Manganese"		, false),
	Fe		(  26,  30,   0,          -1, null		, "Iron"			, false),
	Co		(  27,  32,   0,          -1, null		, "Cobalt"			, false),
	Ni		(  28,  30,   0,          -1, null		, "Nickel"			, false),
	Cu		(  29,  34,   0,          -1, null		, "Copper"			, false),
	Zn		(  30,  35,   0,          -1, null		, "Zinc"			, false),
	Ga		(  31,  39,   0,          -1, null		, "Gallium"			, false),
	Ge		(  32,  40,   0,          -1, null		, "Germanium"		, false),
	As		(  33,  42,   0,          -1, null		, "Arsenic"			, false),
	Se		(  34,  45,   0,          -1, null		, "Selenium"		, false),
	Br		(  35,  45,   0,          -1, null		, "Bromine"			, false),
	Kr		(  36,  48,   0,          -1, null		, "Krypton"			, false),
	Rb		(  37,  48,   0,          -1, null		, "Rubidium"		, false),
	Sr		(  38,  49,   0,          -1, null		, "Strontium"		, false),
	Y		(  39,  50,   0,          -1, null		, "Yttrium"			, false),
	Zr		(  40,  51,   0,          -1, null		, "Zirconium"		, false),
	Nb		(  41,  53,   0,          -1, null		, "Niobium"			, false),
	Mo		(  42,  53,   0,          -1, null		, "Molybdenum"		, false),
	Tc		(  43,  55,   0,          -1, null		, "Technetium"		, false),
	Ru		(  44,  57,   0,          -1, null		, "Ruthenium"		, false),
	Rh		(  45,  58,   0,          -1, null		, "Rhodium"			, false),
	Pd		(  46,  60,   0,          -1, null		, "Palladium"		, false),
	Ag		(  47,  60,   0,          -1, null		, "Silver"			, false),
	Cd		(  48,  64,   0,          -1, null		, "Cadmium"			, false),
	In		(  49,  65,   0,          -1, null		, "Indium"			, false),
	Sn		(  50,  68,   0,          -1, null		, "Tin"				, false),
	Sb		(  51,  70,   0,          -1, null		, "Antimony"		, false),
	Te		(  52,  75,   0,          -1, null		, "Tellurium"		, false),
	I		(  53,  74,   0,          -1, null		, "Iodine"			, false),
	Xe		(  54,  77,   0,          -1, null		, "Xenon"			, false),
	Cs		(  55,  77,   0,          -1, null		, "Caesium"			, false),
	Ba		(  56,  81,   0,          -1, null		, "Barium"			, false),
	La		(  57,  81,   0,          -1, null		, "Lantanium"		, false),
	Ce		(  58,  82,   0,          -1, null		, "Cerium"			, false),
	Pr		(  59,  81,   0,          -1, null		, "Praseodymium"	, false),
	Nd		(  60,  84,   0,          -1, null		, "Neodymium"		, false),
	Pm		(  61,  83,   0,          -1, null		, "Promethium"		, false),
	Sm		(  62,  88,   0,          -1, null		, "Samarium"		, false),
	Eu		(  63,  88,   0,          -1, null		, "Europium"		, false),
	Gd		(  64,  93,   0,          -1, null		, "Gadolinium"		, false),
	Tb		(  65,  93,   0,          -1, null		, "Terbium"			, false),
	Dy		(  66,  96,   0,          -1, null		, "Dysprosium"		, false),
	Ho		(  67,  97,   0,          -1, null		, "Holmium"			, false),
	Er		(  68,  99,   0,          -1, null		, "Erbium"			, false),
	Tm		(  69,  99,   0,          -1, null		, "Thulium"			, false),
	Yb		(  70, 103,   0,          -1, null		, "Ytterbium"		, false),
	Lu		(  71, 103,   0,          -1, null		, "Lutetium"		, false),
	Hf		(  72, 106,   0,          -1, null		, "Hafnium"			, false),
	Ta		(  73, 107,   0,          -1, null		, "Tantalum"		, false),
	W		(  74, 109,   0,          -1, null		, "Wolframium"		, false),
	Re		(  75, 111,   0,          -1, null		, "Rhenium"			, false),
	Os		(  76, 114,   0,          -1, null		, "Osmium"			, false),
	Ir		(  77, 115,   0,          -1, null		, "Iridium"			, false),
	Pt		(  78, 117,   0,          -1, null		, "Platinum"		, false),
	Au		(  79, 117,   0,          -1, null		, "Gold"			, false),
	Hg		(  80, 120,   0,          -1, null		, "Mercury"			, false),
	Tl		(  81, 123,   0,          -1, null		, "Thallium"		, false),
	Pb		(  82, 125,   0,          -1, null		, "Lead"			, false),
	Bi		(  83, 125,   0,          -1, null		, "Bismuth"			, false),
	Po		(  84, 124,   0,          -1, null		, "Polonium"		, false),
	At		(  85, 124,   0,          -1, null		, "Astatine"		, false),
	Rn		(  86, 134,   0,          -1, null		, "Radon"			, false),
	Fr		(  87, 134,   0,          -1, null		, "Francium"		, false),
	Ra		(  88, 136,   0,          -1, null		, "Radium"			, false),
	Ac		(  89, 136,   0,          -1, null		, "Actinium"		, false),
	Th		(  90, 140,   0,          -1, null		, "Thorium"			, false),
	Pa		(  91, 138,   0,          -1, null		, "Protactinium"	, false),
	U		(  92, 146,   0,          -1, null		, "Uranium"			, false),
	U_235	(  92, 143,   0,          -1, null		, "Uranium-235"		, true),
	Np		(  93, 144,   0,          -1, null		, "Neptunium"		, false),
	Pu		(  94, 152,   0,          -1, null		, "Plutonium"		, false),
	Pu_241	(  94, 149,   0,          -1, null		, "Plutonium-241"	, true),
	Am		(  95, 150,   0,          -1, null		, "Americium"		, false),
	Cm		(  96, 153,   0,          -1, null		, "Curium"			, false),
	Bk		(  97, 152,   0,          -1, null		, "Berkelium"		, false),
	Cf		(  98, 153,   0,          -1, null		, "Californium"		, false),
	Es		(  99, 153,   0,          -1, null		, "Einsteinium"		, false),
	Fm		( 100, 157,   0,          -1, null		, "Fermium"			, false),
	Md		( 101, 157,   0,          -1, null		, "Mendelevium"		, false),
	No		( 102, 157,   0,          -1, null		, "Nobelium"		, false),
	Lr		( 103, 159,   0,          -1, null		, "Lawrencium"		, false),
	Rf		( 104, 161,   0,          -1, null		, "Rutherfordium"	, false),
	Db		( 105, 163,   0,          -1, null		, "Dubnium"			, false),
	Sg		( 106, 165,   0,          -1, null		, "Seaborgium"		, false),
	Bh		( 107, 163,   0,          -1, null		, "Bohrium"			, false),
	Hs		( 108, 169,   0,          -1, null		, "Hassium"			, false),
	Mt		( 109, 167,   0,          -1, null		, "Meitnerium"		, false),
	Ds		( 110, 171,   0,          -1, null		, "Darmstadtium"	, false),
	Rg		( 111, 169,   0,          -1, null		, "Roentgenium"		, false),
	Cn		( 112, 173,   0,          -1, null		, "Copernicium"		, false),
	Uut		( 113, 171,   0,          -1, null		, "Ununtrium"		, false),
	Fl		( 114, 175,   0,          -1, null		, "Flerovium"		, false),
	Uup		( 115, 173,   0,          -1, null		, "Ununpentium"		, false),
	Lv		( 116, 177,   0,          -1, null		, "Livermorium"		, false),
	Fa		( 117, 177,   0,          -1, null		, "Farnsium"		, false), // Uus, Ununseptium
	Uuo		( 118, 176,   0,          -1, null		, "Ununoctium"		, false),
	
	Ma		(   0,   0, 100,          -1, null		, "Magic"			, false),
	Nt		( 0,100000,   0,          -1, null		, "Neutronium"		, false),
	
	$H		(-  1,-  0,   0,          -1, null		, "Anti-Hydrogen"		, false),
	$D		(-  1,-  1,   0,          -1, "H"		, "Anti-Deuterium"		, true),
	$T		(-  1,-  2,   0,          -1, "D"		, "Anti-Tritium"		, true),
	$He		(-  2,-  2,   0,          -1, null		, "Anti-Helium"			, false),
	$He_3	(-  2,-  1,   0,          -1, "H&D"		, "Anti-Helium-3"		, true),
	$Li		(-  3,-  4,   0,          -1, null		, "Anti-Lithium"		, false),
	$Be		(-  4,-  5,   0,          -1, null		, "Anti-Beryllium"		, false),
	$B		(-  5,-  5,   0,          -1, null		, "Anti-Boron"			, false),
	$C		(-  6,-  6,   0,          -1, null		, "Anti-Carbon"			, false),
	$N		(-  7,-  7,   0,          -1, null		, "Anti-Nitrogen"		, false),
	$O		(-  8,-  8,   0,          -1, null		, "Anti-Oxygen"			, false),
	$F		(-  9,-  9,   0,          -1, null		, "Anti-Fluorine"		, false),
	$Ne		(- 10,- 10,   0,          -1, null		, "Anti-Neon"			, false),
	$Na		(- 11,- 11,   0,          -1, null		, "Anti-Sodium"			, false),
	$Mg		(- 12,- 12,   0,          -1, null		, "Anti-Magnesium"		, false),
	$Al		(- 13,- 13,   0,          -1, null		, "Anti-Aluminium"		, false),
	$Si		(- 14,- 14,   0,          -1, null		, "Anti-Silicon"		, false),
	$P		(- 15,- 15,   0,          -1, null		, "Anti-Phosphorus"		, false),
	$S		(- 16,- 16,   0,          -1, null		, "Anti-Sulfur"			, false),
	$Cl		(- 17,- 18,   0,          -1, null		, "Anti-Chlorine"		, false),
	$Ar		(- 18,- 22,   0,          -1, null		, "Anti-Argon"			, false),
	$K		(- 19,- 20,   0,          -1, null		, "Anti-Potassium"		, false),
	$Ca		(- 20,- 20,   0,          -1, null		, "Anti-Calcium"		, false),
	$Sc		(- 21,- 24,   0,          -1, null		, "Anti-Scandium"		, false),
	$Ti		(- 22,- 26,   0,          -1, null		, "Anti-Titanium"		, false),
	$V		(- 23,- 28,   0,          -1, null		, "Anti-Vanadium"		, false),
	$Cr		(- 24,- 28,   0,          -1, null		, "Anti-Chrome"			, false),
	$Mn		(- 25,- 30,   0,          -1, null		, "Anti-Manganese"		, false),
	$Fe		(- 26,- 30,   0,          -1, null		, "Anti-Iron"			, false),
	$Co		(- 27,- 32,   0,          -1, null		, "Anti-Cobalt"			, false),
	$Ni		(- 28,- 30,   0,          -1, null		, "Anti-Nickel"			, false),
	$Cu		(- 29,- 34,   0,          -1, null		, "Anti-Copper"			, false),
	$Zn		(- 30,- 35,   0,          -1, null		, "Anti-Zinc"			, false),
	$Ga		(- 31,- 39,   0,          -1, null		, "Anti-Gallium"		, false),
	$Ge		(- 32,- 40,   0,          -1, null		, "Anti-Germanium"		, false),
	$As		(- 33,- 42,   0,          -1, null		, "Anti-Arsenic"		, false),
	$Se		(- 34,- 45,   0,          -1, null		, "Anti-Selenium"		, false),
	$Br		(- 35,- 45,   0,          -1, null		, "Anti-Bromine"		, false),
	$Kr		(- 36,- 48,   0,          -1, null		, "Anti-Krypton"		, false),
	$Rb		(- 37,- 48,   0,          -1, null		, "Anti-Rubidium"		, false),
	$Sr		(- 38,- 49,   0,          -1, null		, "Anti-Strontium"		, false),
	$Y		(- 39,- 50,   0,          -1, null		, "Anti-Yttrium"		, false),
	$Zr		(- 40,- 51,   0,          -1, null		, "Anti-Zirconium"		, false),
	$Nb		(- 41,- 53,   0,          -1, null		, "Anti-Niobium"		, false),
	$Mo		(- 42,- 53,   0,          -1, null		, "Anti-Molybdenum"		, false),
	$Tc		(- 43,- 55,   0,          -1, null		, "Anti-Technetium"		, false),
	$Ru		(- 44,- 57,   0,          -1, null		, "Anti-Ruthenium"		, false),
	$Rh		(- 45,- 58,   0,          -1, null		, "Anti-Rhodium"		, false),
	$Pd		(- 46,- 60,   0,          -1, null		, "Anti-Palladium"		, false),
	$Ag		(- 47,- 60,   0,          -1, null		, "Anti-Silver"			, false),
	$Cd		(- 48,- 64,   0,          -1, null		, "Anti-Cadmium"		, false),
	$In		(- 49,- 65,   0,          -1, null		, "Anti-Indium"			, false),
	$Sn		(- 50,- 68,   0,          -1, null		, "Anti-Tin"			, false),
	$Sb		(- 51,- 70,   0,          -1, null		, "Anti-Antimony"		, false),
	$Te		(- 52,- 75,   0,          -1, null		, "Anti-Tellurium"		, false),
	$I		(- 53,- 74,   0,          -1, null		, "Anti-Iodine"			, false),
	$Xe		(- 54,- 77,   0,          -1, null		, "Anti-Xenon"			, false),
	$Cs		(- 55,- 77,   0,          -1, null		, "Anti-Caesium"		, false),
	$Ba		(- 56,- 81,   0,          -1, null		, "Anti-Barium"			, false),
	$La		(- 57,- 81,   0,          -1, null		, "Anti-Lantanium"		, false),
	$Ce		(- 58,- 82,   0,          -1, null		, "Anti-Cerium"			, false),
	$Pr		(- 59,- 81,   0,          -1, null		, "Anti-Praseodymium"	, false),
	$Nd		(- 60,- 84,   0,          -1, null		, "Anti-Neidymium"		, false),
	$Pm		(- 61,- 83,   0,          -1, null		, "Anti-Promethium"		, false),
	$Sm		(- 62,- 88,   0,          -1, null		, "Anti-Samarium"		, false),
	$Eu		(- 63,- 88,   0,          -1, null		, "Anti-Europium"		, false),
	$Gd		(- 64,- 93,   0,          -1, null		, "Anti-Gadolinium"		, false),
	$Tb		(- 65,- 93,   0,          -1, null		, "Anti-Terbium"		, false),
	$Dy		(- 66,- 96,   0,          -1, null		, "Anti-Dysprosium"		, false),
	$Ho		(- 67,- 97,   0,          -1, null		, "Anti-Holmium"		, false),
	$Er		(- 68,- 99,   0,          -1, null		, "Anti-Erbium"			, false),
	$Tm		(- 69,- 99,   0,          -1, null		, "Anti-Thulium"		, false),
	$Yb		(- 70,-103,   0,          -1, null		, "Anti-Ytterbium"		, false),
	$Lu		(- 71,-103,   0,          -1, null		, "Anti-Lutetium"		, false),
	$Hf		(- 72,-106,   0,          -1, null		, "Anti-Hafnium"		, false),
	$Ta		(- 73,-107,   0,          -1, null		, "Anti-Tantalum"		, false),
	$W		(- 74,-109,   0,          -1, null		, "Anti-Wolframium"		, false),
	$Re		(- 75,-111,   0,          -1, null		, "Anti-Rhenium"		, false),
	$Os		(- 76,-114,   0,          -1, null		, "Anti-Osmium"			, false),
	$Ir		(- 77,-115,   0,          -1, null		, "Anti-Iridium"		, false),
	$Pt		(- 78,-117,   0,          -1, null		, "Anti-Platinum"		, false),
	$Au		(- 79,-117,   0,          -1, null		, "Anti-Gold"			, false),
	$Hg		(- 80,-120,   0,          -1, null		, "Anti-Mercury"		, false),
	$Tl		(- 81,-123,   0,          -1, null		, "Anti-Thallium"		, false),
	$Pb		(- 82,-125,   0,          -1, null		, "Anti-Lead"			, false),
	$Bi		(- 83,-125,   0,          -1, null		, "Anti-Bismuth"		, false),
	$Po		(- 84,-124,   0,          -1, null		, "Anti-Polonium"		, false),
	$At		(- 85,-124,   0,          -1, null		, "Anti-Astatine"		, false),
	$Rn		(- 86,-134,   0,          -1, null		, "Anti-Radon"			, false),
	$Fr		(- 87,-134,   0,          -1, null		, "Anti-Francium"		, false),
	$Ra		(- 88,-136,   0,          -1, null		, "Anti-Radium"			, false),
	$Ac		(- 89,-136,   0,          -1, null		, "Anti-Actinium"		, false),
	$Th		(- 90,-140,   0,          -1, null		, "Anti-Thorium"		, false),
	$Pa		(- 91,-138,   0,          -1, null		, "Anti-Protactinium"	, false),
	$U		(- 92,-146,   0,          -1, null		, "Anti-Uranium"		, false),
	$U_235	(- 92,-143,   0,          -1, null		, "Anti-Uranium-235"	, true),
	$Np		(- 93,-144,   0,          -1, null		, "Anti-Neptunium"		, false),
	$Pu		(- 94,-152,   0,          -1, null		, "Anti-Plutonium"		, false),
	$Pu_241	(- 94,-149,   0,          -1, null		, "Anti-Plutonium-241"	, true),
	$Am		(- 95,-150,   0,          -1, null		, "Anti-Americum"		, false),
	$Cm		(- 96,-153,   0,          -1, null		, "Anti-Curium"			, false),
	$Bk		(- 97,-152,   0,          -1, null		, "Anti-Berkelium"		, false),
	$Cf		(- 98,-153,   0,          -1, null		, "Anti-Californium"	, false),
	$Es		(- 99,-153,   0,          -1, null		, "Anti-Einsteinium"	, false),
	$Fm		(-100,-157,   0,          -1, null		, "Anti-Fermium"		, false),
	$Md		(-101,-157,   0,          -1, null		, "Anti-Mendelevium"	, false),
	$No		(-102,-157,   0,          -1, null		, "Anti-Nobelium"		, false),
	$Lr		(-103,-159,   0,          -1, null		, "Anti-Lawrencium"		, false),
	$Rf		(-104,-161,   0,          -1, null		, "Anti-Rutherfordium"	, false),
	$Db		(-105,-163,   0,          -1, null		, "Anti-Dubnium"		, false),
	$Sg		(-106,-165,   0,          -1, null		, "Anti-Seaborgium"		, false),
	$Bh		(-107,-163,   0,          -1, null		, "Anti-Bohrium"		, false),
	$Hs		(-108,-169,   0,          -1, null		, "Anti-Hassium"		, false),
	$Mt		(-109,-167,   0,          -1, null		, "Anti-Meitnerium"		, false),
	$Ds		(-110,-171,   0,          -1, null		, "Anti-Darmstadtium"	, false),
	$Rg		(-111,-169,   0,          -1, null		, "Anti-Roentgenium"	, false),
	$Cn		(-112,-173,   0,          -1, null		, "Anti-Copernicium"	, false),
	$Uut	(-113,-171,   0,          -1, null		, "Anti-Ununtrium"		, false),
	$Fl		(-114,-175,   0,          -1, null		, "Anti-Flerovium"		, false),
	$Uup	(-115,-173,   0,          -1, null		, "Anti-Ununpentium"	, false),
	$Lv		(-116,-177,   0,          -1, null		, "Anti-Livermorium"	, false),
	$Uus	(-117,-177,   0,          -1, null		, "Anti-Ununseptium"	, false),
	$Uuo	(-118,-176,   0,          -1, null		, "Anti-Ununoctium"		, false),
	
	$Ma		(   0,   0,-100,          -1, null		, "Anti-Magic"			, false),
	$Nt		(0, -10000,   0,          -1, null		, "Anti-Neutronium"		, false);
	
	public static Element get(String aMaterialName) {
		Object tObject = GT_Utility.getFieldContent(Element.class, aMaterialName, false, false);
		if (tObject != null && tObject instanceof Element) return (Element)tObject;
		return _NULL;
	}
	
	public final long mProtons, mNeutrons, mAdditionalMass, mHalfLifeSeconds;
	public final String mName, mDecayTo;
	public final boolean mIsIsotope;
	
	/**
	 * Links to every pure Material containing just this Element.
	 */
	public ArrayList<Materials> mLinkedMaterials = new ArrayList<Materials>();
	
	/**
	 * @param aProtons Amount of Protons. Antiprotons if negative.
	 * @param aNeutrons Amount of Neutrons. Antineutrons if negative. (I could have made mistakes with the Neutron amount calculation, please tell me if I did something wrong)
	 * @param aHalfLifeSeconds Amount of Half Life this Material has in Seconds. -1 for stable Materials.
	 * @param aDecayTo String representing the Elements it decays to. Separated by an '&' Character.
	 * @param aName Name of the Element
	 */
	private Element(long aProtons, long aNeutrons, long aAdditionalMass, long aHalfLifeSeconds, String aDecayTo, String aName, boolean aIsIsotope) {
		mProtons = aProtons;
		mNeutrons = aNeutrons;
		mAdditionalMass = aAdditionalMass;
		mHalfLifeSeconds = aHalfLifeSeconds;
		mDecayTo = aDecayTo;
		mName = aName;
		mIsIsotope = aIsIsotope;
	}
	
	public long getProtons() {
		return mProtons;
	}
	
	public long getNeutrons() {
		return mNeutrons;
	}
	
	public long getMass() {
		return mProtons + mNeutrons + mAdditionalMass;
	}
	
	public static volatile int VERSION = 508;
}