package data;

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;

import javafx.collections.ObservableList;

enum TaxonomyEnum {
	TOTAL("Total", "Total"),

	// GOS
	DISKURZ("gos.T", "gos.T - diskurz"),
	DISKURZ_JAVNI("gos.T.J", "  gos.T.J - diskurz-javni"),
	DISKURZ_INFORMATIVNO_IZOBRAZEVALNI("gos.T.J.I", "    gos.T.J.I - diskurz-javni-informativno-izobraževalni"),
	DISKURZ_RAZVEDRILNI("gos.T.J.R", "    gos.T.J.R - diskurz-javni-razvedrilni"),
	DISKURZ_NEJAVNI("gos.T.N", "  gos.T.N - diskurz-nejavni"),
	DISKURZ_NEZASEBNI("gos.T.N.N", "    gos.T.N.N - diskurz-nejavni-nezasebni"),
	DISKURZ_ZASEBNI("gos.T.N.Z", "    gos.T.N.Z - diskurz-nejavni-zasebni"),
	SITUACIJA("gos.S", "gos.S - situacija"),
	SITUACIJA_RADIO("gos.S.R", "  gos.S.R - situacija-radio"),
	SITUACIJA_TELEVIZIJA("gos.S.T", "  gos.S.T - situacija-televizija"),
	KANAL("gos.K", "gos.K - kanal"),
	KANAL_OSEBNI_STIK("gos.K.O", "  gos.K.O - kanal-osebni stik"),
	KANAL_TELEFON("gos.K.P", "  gos.K.P - kanal-telefon"),
	KANAL_RADIO("gos.K.R", "  gos.K.R - kanal-radio"),
	KANAL_TELEVIZIJA("gos.K.T", "  gos.K.T - kanal-televizija"),



	// Gigafida
	SSJ_TISK("SSJ.T", "SSJ.T - tisk"),
	SSJ_KNJIZNO("SSJ.T.K", "  SSJ.T.K - tisk-knjižno"),
	SSJ_LEPOSLOVNO("SSJ.T.K.L", "    SSJ.T.K.L - tisk-knjižno-leposlovno"),
	SSJ_STROKOVNO("SSJ.T.K.S", "    SSJ.T.K.S - tisk-knjižno-strokovno"),
	SSJ_PERIODICNO("SSJ.T.P", "  SSJ.T.P - tisk-periodično"),
	SSJ_CASOPIS("SSJ.T.P.C", "    SSJ.T.P.C - tisk-periodično-časopis"),
	SSJ_REVIJA("SSJ.T.P.R", "    SSJ.T.P.R - tisk-periodično-revija"),
	SSJ_DRUGO("SSJ.T.D", "  SSJ.T.D - tisk-drugo"),
	SSJ_INTERNET("SSJ.I", "SSJ.I - internet"),

	FT_P_PRENOSNIK("Ft.P", "Ft.P - prenosnik"),
	FT_P_GOVORNI("Ft.P.G", "  Ft.P.G - prenosnik-govorni"),
	FT_P_ELEKTRONSKI("Ft.P.E", "  Ft.P.E - prenosnik-elektronski"),
	FT_P_PISNI("Ft.P.P", "  Ft.P.P - prenosnik-pisni"),
	FT_P_OBJAVLJENO("Ft.P.P.O", "    Ft.P.P.O - prenosnik-pisni-objavljeno"),
	FT_P_KNJIZNO("Ft.P.P.O.K", "      Ft.P.P.O.K - prenosnik-pisni-objavljeno-knjižno"),
	FT_P_PERIODICNO("Ft.P.P.O.P", "      Ft.P.P.O.P - prenosnik-pisni-objavljeno-periodično"),
	FT_P_CASOPISNO("Ft.P.P.O.P.C", "        Ft.P.P.O.P.C - prenosnik-pisni-objavljeno-periodično-časopisno"),
	FT_P_DNEVNO("Ft.P.P.O.P.C.D", "          Ft.P.P.O.P.C.D - prenosnik-pisni-objavljeno-periodično-časopisno-dnevno"),
	FT_P_VECKRAT_TEDENSKO("Ft.P.P.O.P.C.V", "          Ft.P.P.O.P.C.V - prenosnik-pisni-objavljeno-periodično-časopisno-večkrat tedensko"),
	FT_P_CASOPISNO_TEDENSKO("Ft.P.P.O.P.C.T", "          Ft.P.P.O.P.C.T - prenosnik-pisni-objavljeno-periodično-časopisno-tedensko"),
	FT_P_REVIALNO("Ft.P.P.O.P.R", "        Ft.P.P.O.P.R - prenosnik-pisni-objavljeno-periodično-revialno"),
	FT_P_TEDENSKO("Ft.P.P.O.P.R.T", "          Ft.P.P.O.P.R.T - prenosnik-pisni-objavljeno-periodično-revialno-tedensko"),
	FT_P_STIRINAJSTDNEVNO("Ft.P.P.O.P.R.S", "          Ft.P.P.O.P.R.S - prenosnik-pisni-objavljeno-periodično-revialno-štirinajstdnevno"),
	FT_P_MESECNO("Ft.P.P.O.P.R.M", "          Ft.P.P.O.P.R.M - prenosnik-pisni-objavljeno-periodično-revialno-mesečno"),
	FT_P_REDKEJE_KOT_MESECNO("Ft.P.P.O.P.R.D", "          Ft.P.P.O.P.R.D - prenosnik-pisni-objavljeno-periodično-revialno-redkeje kot na mesec"),
	FT_P_OBCASNO("Ft.P.P.O.P.R.O", "          Ft.P.P.O.P.R.O - prenosnik-pisni-objavljeno-periodično-revialno-občasno"),
	FT_P_NEOBJAVLJENO("Ft.P.P.N", "    Ft.P.P.N - prenosnik-pisni-neobjavljeno"),
	FT_P_JAVNO("Ft.P.P.N.J", "      Ft.P.P.N.J - prenosnik-pisni-neobjavljeno-javno"),
	FT_P_INTERNO("Ft.P.P.N.I", "      Ft.P.P.N.I - prenosnik-pisni-neobjavljeno-interno"),
	FT_P_ZASEBNO("Ft.P.P.N.Z", "      Ft.P.P.N.Z - prenosnik-pisni-neobjavljeno-zasebno"),
	FT_ZVRST("Ft.Z", "Ft.Z - zvrst"),
	FT_UMETNOSTNA("Ft.Z.U", "  Ft.Z.U - zvrst-umetnostna"),
	FT_PESNISKA("Ft.Z.U.P", "    Ft.Z.U.P - zvrst-umetnostna-pesniška"),
	FT_PROZNA("Ft.Z.U.R", "    Ft.Z.U.R - zvrst-umetnostna-prozna"),
	FT_DRAMSKA("Ft.Z.U.D", "    Ft.Z.U.D - zvrst-umetnostna-dramska"),
	FT_NEUMETNOSTNA("Ft.Z.N", "  Ft.Z.N - zvrst-neumetnostna"),
	FT_STROKOVNA("Ft.Z.N.S", "    Ft.Z.N.S - zvrst-neumetnostna-strokovna"),
	FT_HID("Ft.Z.N.S.H", "      Ft.Z.N.S.H - zvrst-neumetnostna-strokovna-humanistična in družboslovna"),
	FT_NIT("Ft.Z.N.S.N", "      Ft.Z.N.S.N - zvrst-neumetnostna-strokovna-naravoslovna in tehnična"),
	FT_NESTROKOVNA("Ft.Z.N.N", "    Ft.Z.N.N - zvrst-neumetnostna-nestrokovna"),
	FT_PRAVNA("Ft.Z.N.P", "    Ft.Z.N.P - zvrst-neumetnostna-pravna"),
	FT_LEKTORIRANO("Ft.L", "Ft.L - zvrst-lektorirano"),
	FT_DA("Ft.L.D", "  Ft.L.D - zvrst-lektorirano-da"),
	FT_NE("Ft.L.N", "  Ft.L.N - zvrst-lektorirano-ne");

	private final String name;
	private final String longName;

	TaxonomyEnum(String name, String longName) {
		this.name = name;
		this.longName = longName;
	}

	public String toString() {
		return this.name;
	}

	public String toLongNameString() {
		return this.longName;
	}

	public static TaxonomyEnum factory(String tax) {
		if (tax != null) {
			// GOS
			if (DISKURZ.toString().equals(tax)) {
				return DISKURZ;
			}
			if (DISKURZ_JAVNI.toString().equals(tax)) {
				return DISKURZ_JAVNI;
			}
			if (DISKURZ_INFORMATIVNO_IZOBRAZEVALNI.toString().equals(tax)) {
				return DISKURZ_INFORMATIVNO_IZOBRAZEVALNI;
			}
			if (DISKURZ_RAZVEDRILNI.toString().equals(tax)) {
				return DISKURZ_RAZVEDRILNI;
			}
			if (DISKURZ_NEJAVNI.toString().equals(tax)) {
				return DISKURZ_NEJAVNI;
			}
			if (DISKURZ_NEZASEBNI.toString().equals(tax)) {
				return DISKURZ_NEZASEBNI;
			}
			if (DISKURZ_ZASEBNI.toString().equals(tax)) {
				return DISKURZ_ZASEBNI;
			}
			if (SITUACIJA.toString().equals(tax)) {
				return SITUACIJA;
			}
			if (SITUACIJA_RADIO.toString().equals(tax)) {
				return SITUACIJA_RADIO;
			}
			if (SITUACIJA_TELEVIZIJA.toString().equals(tax)) {
				return SITUACIJA_TELEVIZIJA;
			}
			if (KANAL.toString().equals(tax)) {
				return KANAL;
			}
			if (KANAL_OSEBNI_STIK.toString().equals(tax)) {
				return KANAL_OSEBNI_STIK;
			}
			if (KANAL_TELEFON.toString().equals(tax)) {
				return KANAL_TELEFON;
			}
			if (KANAL_RADIO.toString().equals(tax)) {
				return KANAL_RADIO;
			}
			if (KANAL_TELEVIZIJA.toString().equals(tax)) {
				return KANAL_TELEVIZIJA;
			}

			// Gigafida
			if (SSJ_TISK.toString().equals(tax)) {
				return SSJ_TISK;
			}
			if (SSJ_KNJIZNO.toString().equals(tax)) {
				return SSJ_KNJIZNO;
			}
			if (SSJ_LEPOSLOVNO.toString().equals(tax)) {
				return SSJ_LEPOSLOVNO;
			}
			if (SSJ_STROKOVNO.toString().equals(tax)) {
				return SSJ_STROKOVNO;
			}
			if (SSJ_PERIODICNO.toString().equals(tax)) {
				return SSJ_PERIODICNO;
			}
			if (SSJ_CASOPIS.toString().equals(tax)) {
				return SSJ_CASOPIS;
			}
			if (SSJ_REVIJA.toString().equals(tax)) {
				return SSJ_REVIJA;
			}
			if (SSJ_DRUGO.toString().equals(tax)) {
				return SSJ_DRUGO;
			}
			if (SSJ_INTERNET.toString().equals(tax)) {
				return SSJ_INTERNET;
			}

			if (FT_P_PRENOSNIK.toString().equals(tax)) {
				return FT_P_PRENOSNIK;
			}
			if (FT_P_GOVORNI.toString().equals(tax)) {
				return FT_P_GOVORNI;
			}
			if (FT_P_ELEKTRONSKI.toString().equals(tax)) {
				return FT_P_ELEKTRONSKI;
			}
			if (FT_P_PISNI.toString().equals(tax)) {
				return FT_P_PISNI;
			}
			if (FT_P_OBJAVLJENO.toString().equals(tax)) {
				return FT_P_OBJAVLJENO;
			}
			if (FT_P_KNJIZNO.toString().equals(tax)) {
				return FT_P_KNJIZNO;
			}
			if (FT_P_PERIODICNO.toString().equals(tax)) {
				return FT_P_PERIODICNO;
			}
			if (FT_P_CASOPISNO.toString().equals(tax)) {
				return FT_P_CASOPISNO;
			}
			if (FT_P_DNEVNO.toString().equals(tax)) {
				return FT_P_DNEVNO;
			}
			if (FT_P_VECKRAT_TEDENSKO.toString().equals(tax)) {
				return FT_P_VECKRAT_TEDENSKO;
			}
			if (FT_P_CASOPISNO_TEDENSKO.toString().equals(tax)) {
				return FT_P_CASOPISNO_TEDENSKO;
			}
			if (FT_P_REVIALNO.toString().equals(tax)) {
				return FT_P_REVIALNO;
			}
			if (FT_P_TEDENSKO.toString().equals(tax)) {
				return FT_P_TEDENSKO;
			}
			if (FT_P_STIRINAJSTDNEVNO.toString().equals(tax)) {
				return FT_P_STIRINAJSTDNEVNO;
			}
			if (FT_P_MESECNO.toString().equals(tax)) {
				return FT_P_MESECNO;
			}
			if (FT_P_REDKEJE_KOT_MESECNO.toString().equals(tax)) {
				return FT_P_REDKEJE_KOT_MESECNO;
			}
			if (FT_P_OBCASNO.toString().equals(tax)) {
				return FT_P_OBCASNO;
			}
			if (FT_P_NEOBJAVLJENO.toString().equals(tax)) {
				return FT_P_NEOBJAVLJENO;
			}
			if (FT_P_JAVNO.toString().equals(tax)) {
				return FT_P_JAVNO;
			}
			if (FT_P_INTERNO.toString().equals(tax)) {
				return FT_P_INTERNO;
			}
			if (FT_P_ZASEBNO.toString().equals(tax)) {
				return FT_P_ZASEBNO;
			}
			if (FT_ZVRST.toString().equals(tax)) {
				return FT_ZVRST;
			}
			if (FT_UMETNOSTNA.toString().equals(tax)) {
				return FT_UMETNOSTNA;
			}
			if (FT_PESNISKA.toString().equals(tax)) {
				return FT_PESNISKA;
			}
			if (FT_PROZNA.toString().equals(tax)) {
				return FT_PROZNA;
			}
			if (FT_DRAMSKA.toString().equals(tax)) {
				return FT_DRAMSKA;
			}
			if (FT_NEUMETNOSTNA.toString().equals(tax)) {
				return FT_NEUMETNOSTNA;
			}
			if (FT_STROKOVNA.toString().equals(tax)) {
				return FT_STROKOVNA;
			}
			if (FT_NIT.toString().equals(tax)) {
				return FT_NIT;
			}
			if (FT_HID.toString().equals(tax)) {
				return FT_HID;
			}
			if (FT_NESTROKOVNA.toString().equals(tax)) {
				return FT_NESTROKOVNA;
			}
			if (FT_PRAVNA.toString().equals(tax)) {
				return FT_PRAVNA;
			}
			if (FT_LEKTORIRANO.toString().equals(tax)) {
				return FT_LEKTORIRANO;
			}
			if (FT_DA.toString().equals(tax)) {
				return FT_DA;
			}
			if (FT_NE.toString().equals(tax)) {
				return FT_NE;
			}

		}
		return null;
	}

	public static TaxonomyEnum factoryLongName(String tax) {
		if (tax != null) {
			// GOS
			if (DISKURZ.toLongNameString().equals(tax)) {
				return DISKURZ;
			}
			if (DISKURZ_JAVNI.toLongNameString().equals(tax)) {
				return DISKURZ_JAVNI;
			}
			if (DISKURZ_INFORMATIVNO_IZOBRAZEVALNI.toLongNameString().equals(tax)) {
				return DISKURZ_INFORMATIVNO_IZOBRAZEVALNI;
			}
			if (DISKURZ_RAZVEDRILNI.toLongNameString().equals(tax)) {
				return DISKURZ_RAZVEDRILNI;
			}
			if (DISKURZ_NEJAVNI.toLongNameString().equals(tax)) {
				return DISKURZ_NEJAVNI;
			}
			if (DISKURZ_NEZASEBNI.toLongNameString().equals(tax)) {
				return DISKURZ_NEZASEBNI;
			}
			if (DISKURZ_ZASEBNI.toLongNameString().equals(tax)) {
				return DISKURZ_ZASEBNI;
			}
			if (SITUACIJA.toLongNameString().equals(tax)) {
				return SITUACIJA;
			}
			if (SITUACIJA_RADIO.toLongNameString().equals(tax)) {
				return SITUACIJA_RADIO;
			}
			if (SITUACIJA_TELEVIZIJA.toLongNameString().equals(tax)) {
				return SITUACIJA_TELEVIZIJA;
			}
			if (KANAL.toLongNameString().equals(tax)) {
				return KANAL;
			}
			if (KANAL_OSEBNI_STIK.toLongNameString().equals(tax)) {
				return KANAL_OSEBNI_STIK;
			}
			if (KANAL_TELEFON.toLongNameString().equals(tax)) {
				return KANAL_TELEFON;
			}
			if (KANAL_RADIO.toLongNameString().equals(tax)) {
				return KANAL_RADIO;
			}
			if (KANAL_TELEVIZIJA.toLongNameString().equals(tax)) {
				return KANAL_TELEVIZIJA;
			}

			// Gigafida
			if (SSJ_TISK.toLongNameString().equals(tax)) {
				return SSJ_TISK;
			}
			if (SSJ_KNJIZNO.toLongNameString().equals(tax)) {
				return SSJ_KNJIZNO;
			}
			if (SSJ_LEPOSLOVNO.toLongNameString().equals(tax)) {
				return SSJ_LEPOSLOVNO;
			}
			if (SSJ_STROKOVNO.toLongNameString().equals(tax)) {
				return SSJ_STROKOVNO;
			}
			if (SSJ_PERIODICNO.toLongNameString().equals(tax)) {
				return SSJ_PERIODICNO;
			}
			if (SSJ_CASOPIS.toLongNameString().equals(tax)) {
				return SSJ_CASOPIS;
			}
			if (SSJ_REVIJA.toLongNameString().equals(tax)) {
				return SSJ_REVIJA;
			}
			if (SSJ_DRUGO.toLongNameString().equals(tax)) {
				return SSJ_DRUGO;
			}
			if (SSJ_INTERNET.toLongNameString().equals(tax)) {
				return SSJ_INTERNET;
			}

			if (FT_P_PRENOSNIK.toLongNameString().equals(tax)) {
				return FT_P_PRENOSNIK;
			}
			if (FT_P_GOVORNI.toLongNameString().equals(tax)) {
				return FT_P_GOVORNI;
			}
			if (FT_P_ELEKTRONSKI.toLongNameString().equals(tax)) {
				return FT_P_ELEKTRONSKI;
			}
			if (FT_P_PISNI.toLongNameString().equals(tax)) {
				return FT_P_PISNI;
			}
			if (FT_P_OBJAVLJENO.toLongNameString().equals(tax)) {
				return FT_P_OBJAVLJENO;
			}
			if (FT_P_KNJIZNO.toLongNameString().equals(tax)) {
				return FT_P_KNJIZNO;
			}
			if (FT_P_PERIODICNO.toLongNameString().equals(tax)) {
				return FT_P_PERIODICNO;
			}
			if (FT_P_CASOPISNO.toLongNameString().equals(tax)) {
				return FT_P_CASOPISNO;
			}
			if (FT_P_DNEVNO.toLongNameString().equals(tax)) {
				return FT_P_DNEVNO;
			}
			if (FT_P_VECKRAT_TEDENSKO.toLongNameString().equals(tax)) {
				return FT_P_VECKRAT_TEDENSKO;
			}
			if (FT_P_CASOPISNO_TEDENSKO.toLongNameString().equals(tax)) {
				return FT_P_CASOPISNO_TEDENSKO;
			}
			if (FT_P_REVIALNO.toLongNameString().equals(tax)) {
				return FT_P_REVIALNO;
			}
			if (FT_P_TEDENSKO.toLongNameString().equals(tax)) {
				return FT_P_TEDENSKO;
			}
			if (FT_P_STIRINAJSTDNEVNO.toLongNameString().equals(tax)) {
				return FT_P_STIRINAJSTDNEVNO;
			}
			if (FT_P_MESECNO.toLongNameString().equals(tax)) {
				return FT_P_MESECNO;
			}
			if (FT_P_REDKEJE_KOT_MESECNO.toLongNameString().equals(tax)) {
				return FT_P_REDKEJE_KOT_MESECNO;
			}
			if (FT_P_OBCASNO.toLongNameString().equals(tax)) {
				return FT_P_OBCASNO;
			}
			if (FT_P_NEOBJAVLJENO.toLongNameString().equals(tax)) {
				return FT_P_NEOBJAVLJENO;
			}
			if (FT_P_JAVNO.toLongNameString().equals(tax)) {
				return FT_P_JAVNO;
			}
			if (FT_P_INTERNO.toLongNameString().equals(tax)) {
				return FT_P_INTERNO;
			}
			if (FT_P_ZASEBNO.toLongNameString().equals(tax)) {
				return FT_P_ZASEBNO;
			}
			if (FT_ZVRST.toLongNameString().equals(tax)) {
				return FT_ZVRST;
			}
			if (FT_UMETNOSTNA.toLongNameString().equals(tax)) {
				return FT_UMETNOSTNA;
			}
			if (FT_PESNISKA.toLongNameString().equals(tax)) {
				return FT_PESNISKA;
			}
			if (FT_PROZNA.toLongNameString().equals(tax)) {
				return FT_PROZNA;
			}
			if (FT_DRAMSKA.toLongNameString().equals(tax)) {
				return FT_DRAMSKA;
			}
			if (FT_NEUMETNOSTNA.toLongNameString().equals(tax)) {
				return FT_NEUMETNOSTNA;
			}
			if (FT_STROKOVNA.toLongNameString().equals(tax)) {
				return FT_STROKOVNA;
			}
			if (FT_NIT.toLongNameString().equals(tax)) {
				return FT_NIT;
			}
			if (FT_HID.toLongNameString().equals(tax)) {
				return FT_HID;
			}
			if (FT_NESTROKOVNA.toLongNameString().equals(tax)) {
				return FT_NESTROKOVNA;
			}
			if (FT_PRAVNA.toLongNameString().equals(tax)) {
				return FT_PRAVNA;
			}
			if (FT_LEKTORIRANO.toLongNameString().equals(tax)) {
				return FT_LEKTORIRANO;
			}
			if (FT_DA.toLongNameString().equals(tax)) {
				return FT_DA;
			}
			if (FT_NE.toLongNameString().equals(tax)) {
				return FT_NE;
			}

		}
		return null;
	}

	public static ArrayList<TaxonomyEnum> taxonomySelected(TaxonomyEnum disjointTaxonomy) {
		ArrayList<TaxonomyEnum> r = new ArrayList<>();

		if(disjointTaxonomy.equals(DISKURZ)){
			r.add(DISKURZ_JAVNI);
			r.add(DISKURZ_INFORMATIVNO_IZOBRAZEVALNI);
			r.add(DISKURZ_RAZVEDRILNI);
			r.add(DISKURZ_NEJAVNI);
			r.add(DISKURZ_NEZASEBNI);
			r.add(DISKURZ_ZASEBNI);
		} else if(disjointTaxonomy.equals(DISKURZ_JAVNI)){
			r.add(DISKURZ_INFORMATIVNO_IZOBRAZEVALNI);
			r.add(DISKURZ_RAZVEDRILNI);
		} else if(disjointTaxonomy.equals(DISKURZ_NEJAVNI)){
			r.add(DISKURZ_NEZASEBNI);
			r.add(DISKURZ_ZASEBNI);
		} else if(disjointTaxonomy.equals(SITUACIJA)){
			r.add(SITUACIJA_RADIO);
			r.add(SITUACIJA_TELEVIZIJA);
		} else if(disjointTaxonomy.equals(KANAL)){
			r.add(KANAL_OSEBNI_STIK);
			r.add(KANAL_TELEFON);
			r.add(KANAL_RADIO);
			r.add(KANAL_TELEVIZIJA);
		} else if(disjointTaxonomy.equals(SSJ_TISK)){
			r.add(SSJ_KNJIZNO);
			r.add(SSJ_LEPOSLOVNO);
			r.add(SSJ_STROKOVNO);
			r.add(SSJ_PERIODICNO);
			r.add(SSJ_CASOPIS);
			r.add(SSJ_REVIJA);
			r.add(SSJ_DRUGO);
		} else if(disjointTaxonomy.equals(SSJ_KNJIZNO)){
			r.add(SSJ_LEPOSLOVNO);
			r.add(SSJ_STROKOVNO);
		} else if(disjointTaxonomy.equals(SSJ_PERIODICNO)){
			r.add(SSJ_CASOPIS);
			r.add(SSJ_REVIJA);
		} else if(disjointTaxonomy.equals(FT_P_PRENOSNIK)){
			r.add(FT_P_GOVORNI);
			r.add(FT_P_ELEKTRONSKI);
			r.add(FT_P_PISNI);
			r.add(FT_P_OBJAVLJENO);
			r.add(FT_P_KNJIZNO);
			r.add(FT_P_PERIODICNO);
			r.add(FT_P_CASOPISNO);
			r.add(FT_P_DNEVNO);
			r.add(FT_P_VECKRAT_TEDENSKO);
			r.add(FT_P_CASOPISNO_TEDENSKO);
			r.add(FT_P_REVIALNO);
			r.add(FT_P_TEDENSKO);
			r.add(FT_P_STIRINAJSTDNEVNO);
			r.add(FT_P_MESECNO);
			r.add(FT_P_REDKEJE_KOT_MESECNO);
			r.add(FT_P_OBCASNO);
			r.add(FT_P_NEOBJAVLJENO);
			r.add(FT_P_JAVNO);
			r.add(FT_P_INTERNO);
			r.add(FT_P_ZASEBNO);
		} else if(disjointTaxonomy.equals(FT_P_PISNI)){
			r.add(FT_P_OBJAVLJENO);
			r.add(FT_P_KNJIZNO);
			r.add(FT_P_PERIODICNO);
			r.add(FT_P_CASOPISNO);
			r.add(FT_P_DNEVNO);
			r.add(FT_P_VECKRAT_TEDENSKO);
			r.add(FT_P_CASOPISNO_TEDENSKO);
			r.add(FT_P_REVIALNO);
			r.add(FT_P_TEDENSKO);
			r.add(FT_P_STIRINAJSTDNEVNO);
			r.add(FT_P_MESECNO);
			r.add(FT_P_REDKEJE_KOT_MESECNO);
			r.add(FT_P_OBCASNO);
			r.add(FT_P_NEOBJAVLJENO);
			r.add(FT_P_JAVNO);
			r.add(FT_P_INTERNO);
			r.add(FT_P_ZASEBNO);
		} else if(disjointTaxonomy.equals(FT_P_OBJAVLJENO)){
			r.add(FT_P_KNJIZNO);
			r.add(FT_P_PERIODICNO);
			r.add(FT_P_CASOPISNO);
			r.add(FT_P_DNEVNO);
			r.add(FT_P_VECKRAT_TEDENSKO);
			r.add(FT_P_CASOPISNO_TEDENSKO);
			r.add(FT_P_REVIALNO);
			r.add(FT_P_TEDENSKO);
			r.add(FT_P_STIRINAJSTDNEVNO);
			r.add(FT_P_MESECNO);
			r.add(FT_P_REDKEJE_KOT_MESECNO);
			r.add(FT_P_OBCASNO);
		} else if(disjointTaxonomy.equals(FT_P_PERIODICNO)){
			r.add(FT_P_CASOPISNO);
			r.add(FT_P_DNEVNO);
			r.add(FT_P_VECKRAT_TEDENSKO);
			r.add(FT_P_CASOPISNO_TEDENSKO);
			r.add(FT_P_REVIALNO);
			r.add(FT_P_TEDENSKO);
			r.add(FT_P_STIRINAJSTDNEVNO);
			r.add(FT_P_MESECNO);
			r.add(FT_P_REDKEJE_KOT_MESECNO);
			r.add(FT_P_OBCASNO);
		} else if(disjointTaxonomy.equals(FT_P_CASOPISNO)){
			r.add(FT_P_DNEVNO);
			r.add(FT_P_VECKRAT_TEDENSKO);
			r.add(FT_P_CASOPISNO_TEDENSKO);
		} else if(disjointTaxonomy.equals(FT_P_REVIALNO)) {
			r.add(FT_P_TEDENSKO);
			r.add(FT_P_STIRINAJSTDNEVNO);
			r.add(FT_P_MESECNO);
			r.add(FT_P_REDKEJE_KOT_MESECNO);
			r.add(FT_P_OBCASNO);
		} else if(disjointTaxonomy.equals(FT_P_NEOBJAVLJENO)){
			r.add(FT_P_JAVNO);
			r.add(FT_P_INTERNO);
			r.add(FT_P_ZASEBNO);
		} else if(disjointTaxonomy.equals(FT_ZVRST)){
			r.add(FT_UMETNOSTNA);
			r.add(FT_PESNISKA);
			r.add(FT_PROZNA);
			r.add(FT_DRAMSKA);
			r.add(FT_NEUMETNOSTNA);
			r.add(FT_STROKOVNA);
			r.add(FT_HID);
			r.add(FT_NIT);
			r.add(FT_NESTROKOVNA);
			r.add(FT_PRAVNA);
		} else if(disjointTaxonomy.equals(FT_UMETNOSTNA)){
			r.add(FT_PESNISKA);
			r.add(FT_PROZNA);
			r.add(FT_DRAMSKA);
		} else if(disjointTaxonomy.equals(FT_NEUMETNOSTNA)){
			r.add(FT_STROKOVNA);
			r.add(FT_HID);
			r.add(FT_NIT);
			r.add(FT_NESTROKOVNA);
			r.add(FT_PRAVNA);
		} else if(disjointTaxonomy.equals(FT_STROKOVNA)){
			r.add(FT_HID);
			r.add(FT_NIT);
		} else if(disjointTaxonomy.equals(FT_LEKTORIRANO)){
			r.add(FT_DA);
			r.add(FT_NE);
		}

		return r;
	}

	public static ArrayList<TaxonomyEnum> taxonomyDeselected(TaxonomyEnum disjointTaxonomy){
		ArrayList<TaxonomyEnum> r = new ArrayList<>();
		Map<TaxonomyEnum, TaxonomyEnum> connections = new ConcurrentHashMap<>();
		connections.put(DISKURZ_JAVNI, DISKURZ);
		connections.put(DISKURZ_INFORMATIVNO_IZOBRAZEVALNI, DISKURZ_JAVNI);
		connections.put(DISKURZ_RAZVEDRILNI, DISKURZ_JAVNI);
		connections.put(DISKURZ_NEJAVNI, DISKURZ);
		connections.put(DISKURZ_NEZASEBNI, DISKURZ_NEJAVNI);
		connections.put(DISKURZ_ZASEBNI, DISKURZ_NEJAVNI);
		connections.put(SITUACIJA_RADIO, SITUACIJA);
		connections.put(SITUACIJA_TELEVIZIJA, SITUACIJA);
		connections.put(KANAL_OSEBNI_STIK, KANAL);
		connections.put(KANAL_TELEFON, KANAL);
		connections.put(KANAL_RADIO, KANAL);
		connections.put(KANAL_TELEVIZIJA, KANAL);

		connections.put(SSJ_KNJIZNO, SSJ_TISK);
		connections.put(SSJ_LEPOSLOVNO, SSJ_KNJIZNO);
		connections.put(SSJ_STROKOVNO, SSJ_KNJIZNO);
		connections.put(SSJ_PERIODICNO, SSJ_TISK);
		connections.put(SSJ_CASOPIS, SSJ_PERIODICNO);
		connections.put(SSJ_REVIJA, SSJ_PERIODICNO);
		connections.put(SSJ_DRUGO, SSJ_TISK);

		connections.put(FT_P_GOVORNI, FT_P_PRENOSNIK);
		connections.put(FT_P_ELEKTRONSKI, FT_P_PRENOSNIK);
		connections.put(FT_P_PISNI, FT_P_PRENOSNIK);
		connections.put(FT_P_OBJAVLJENO, FT_P_PISNI);
		connections.put(FT_P_KNJIZNO, FT_P_OBJAVLJENO);
		connections.put(FT_P_PERIODICNO, FT_P_OBJAVLJENO);
		connections.put(FT_P_CASOPISNO, FT_P_OBJAVLJENO);
		connections.put(FT_P_DNEVNO, FT_P_CASOPISNO);
		connections.put(FT_P_VECKRAT_TEDENSKO, FT_P_CASOPISNO);
		connections.put(FT_P_CASOPISNO_TEDENSKO, FT_P_CASOPISNO);
		connections.put(FT_P_REVIALNO, FT_P_PERIODICNO);
		connections.put(FT_P_TEDENSKO, FT_P_REVIALNO);
		connections.put(FT_P_STIRINAJSTDNEVNO, FT_P_REVIALNO);
		connections.put(FT_P_MESECNO, FT_P_REVIALNO);
		connections.put(FT_P_REDKEJE_KOT_MESECNO, FT_P_REVIALNO);
		connections.put(FT_P_OBCASNO, FT_P_REVIALNO);
		connections.put(FT_P_NEOBJAVLJENO, FT_P_PISNI);
		connections.put(FT_P_JAVNO, FT_P_NEOBJAVLJENO);
		connections.put(FT_P_INTERNO, FT_P_NEOBJAVLJENO);
		connections.put(FT_P_ZASEBNO, FT_P_NEOBJAVLJENO);
		connections.put(FT_UMETNOSTNA, FT_ZVRST);
		connections.put(FT_PESNISKA, FT_UMETNOSTNA);
		connections.put(FT_PROZNA, FT_UMETNOSTNA);
		connections.put(FT_DRAMSKA, FT_UMETNOSTNA);
		connections.put(FT_NEUMETNOSTNA, FT_ZVRST);
		connections.put(FT_STROKOVNA, FT_NEUMETNOSTNA);
		connections.put(FT_HID, FT_STROKOVNA);
		connections.put(FT_NIT, FT_STROKOVNA);
		connections.put(FT_NESTROKOVNA, FT_NEUMETNOSTNA);
		connections.put(FT_PRAVNA, FT_NEUMETNOSTNA);
		connections.put(FT_DA, FT_LEKTORIRANO);
		connections.put(FT_NE, FT_LEKTORIRANO);

		TaxonomyEnum currentTaxonomy = disjointTaxonomy;
		r.add(currentTaxonomy);
		while(connections.containsKey(currentTaxonomy)){
			currentTaxonomy = connections.get(currentTaxonomy);
			r.add(currentTaxonomy);
		}
		Collections.reverse(r);
		return r;
	}

	public static ArrayList<TaxonomyEnum> convertStringListToTaxonomyList(List<String> stringList, Corpus corpus){
		ArrayList<TaxonomyEnum> taxonomyList = new ArrayList<>();

		for (String e : stringList) {
			for (Taxonomy t : corpus.getTaxonomy()){
				if (t.toLongNameString().equals(e)) {
					taxonomyList.add(t.getTaxonomyEnum());
				}
			}
		}
		return taxonomyList;
	}

	public static void modifyingTaxonomy(ArrayList<TaxonomyEnum> taxonomy, ArrayList<TaxonomyEnum> checkedItemsTaxonomy, Corpus corpus){
		// get taxonomies that were selected/deselected by user
		Set<TaxonomyEnum> disjointTaxonomies = new HashSet<>(checkedItemsTaxonomy);
		if (taxonomy != null) {
			disjointTaxonomies.addAll(taxonomy);
			for (TaxonomyEnum s : checkedItemsTaxonomy) {
				if (taxonomy.contains(s)) {
					disjointTaxonomies.remove(s);
				}
			}
		}

		// remove previously selected items plus remove taxonomies that are not presented in current setup
		ArrayList<TaxonomyEnum> disArr = new ArrayList<>(disjointTaxonomies);
		int i = 0;
		while(i < disArr.size()){
			TaxonomyEnum s = disArr.get(i);
			if(!TaxonomyEnum.convertStringListToTaxonomyList(corpus.getObservableListTaxonomy(), corpus).contains(s)){
				disjointTaxonomies.remove(s);
				disArr.remove(s);
				i--;
			}
			i++;
		}


		if (disjointTaxonomies.size() > 0) {
			TaxonomyEnum disjointTaxonomy = disjointTaxonomies.iterator().next();

			// taxonomy was selected
			if (checkedItemsTaxonomy.contains(disjointTaxonomy)) {
				ArrayList<TaxonomyEnum> addTaxonomies = TaxonomyEnum.taxonomySelected(disjointTaxonomy);
				checkedItemsTaxonomy.addAll(addTaxonomies);
			} else if (taxonomy.contains(disjointTaxonomy)) {
				ArrayList<TaxonomyEnum> removeTaxonomies = TaxonomyEnum.taxonomyDeselected(disjointTaxonomy);
				checkedItemsTaxonomy.removeAll(removeTaxonomies);
			}
		}
	}


}

public class Taxonomy {
	private String name;
	private String longName;
	private TaxonomyEnum taxonomyEnum;

	public Taxonomy(String tax, boolean longName) {
		if (!longName) {
			this.taxonomyEnum = TaxonomyEnum.factory(tax);
		} else {
			this.taxonomyEnum = TaxonomyEnum.factoryLongName(tax);
		}
		if (taxonomyEnum != null){
			this.name = this.taxonomyEnum.toString();
			this.longName = this.taxonomyEnum.toLongNameString();
		} else {
			this.name = tax;
			this.longName = tax;
		}
	}

	public Taxonomy(TaxonomyEnum taxonomyEnum) {
		this.taxonomyEnum = taxonomyEnum;
		this.name = this.taxonomyEnum.toString();
		this.longName = this.taxonomyEnum.toLongNameString();

	}

	public static String[] format_KOST_taxonomy(String value, String parameter) {
		Map<String, String> filterMap = new HashMap<>();
		filterMap.put("FirstLang", "Prvi Jezik tvorca");
		filterMap.put("TaskSetting", "Okoliščine nastanka");
		filterMap.put("ProficSlv", "Nivo");
		filterMap.put("ProgramType", "Program");
		filterMap.put("InputType", "Napisano");

		String[] split_value = new String[] {};
		if (parameter.equals("FirstLang")) {
			if (value.contains(", ")) {
				split_value = value.split(", ");
			} else if (value.contains(" ")) {
				for (String v : value.split(" ")) {
					if (v.equals("španščina") || v.equals("angleščina")) {
						split_value = new String[] {v};
					}
				}
			} else {
				split_value = new String[] {value};
			}
		} else if (parameter.equals("ProficSlv")) {
			if (value.equals("Izpopolnjevalec")) {
				split_value = new String[] {"izpopolnjevalec"};
			} else {
				split_value = new String[] {value};
			}
		} else {
			split_value = new String[] {value};
		}

        return Arrays.stream(split_value)
				.map(val -> filterMap.get(parameter) + " - " + val)
				.toArray(String[]::new);
	}

	public String toString() {
		return this.name;
	}

	public String toLongNameString() {
		return this.longName;
	}

	public TaxonomyEnum getTaxonomyEnum() {
		return this.taxonomyEnum;
	}

	public static Taxonomy factory(String tax, Corpus corpus) {
		for (Taxonomy t : corpus.getTaxonomy()){
			if(tax.equals(t.toString()))
				return t;
		}
		return null;
	}

	public static Taxonomy factoryLongName(String tax, Corpus corpus) {
		for (Taxonomy t : corpus.getTaxonomy()){
			if(tax.equals(t.toLongNameString()))
				return t;
		}
		return null;
	}

	public static ArrayList<Taxonomy> convertStringListToTaxonomyList(List<String> stringList, Corpus corpus){
		ArrayList<Taxonomy> taxonomyList = new ArrayList<>();

		for (String e : stringList) {
			for (Taxonomy t : corpus.getTaxonomy()){
				if (t.toLongNameString().equals(e)) {
					taxonomyList.add(t);
				}
			}
		}
		return taxonomyList;
	}

	public static ArrayList<TaxonomyEnum> taxonomyToTaxonomyEnum(ArrayList<Taxonomy> taxonomy){
	    if (taxonomy == null) {
	    	return null;
		}
		ArrayList<TaxonomyEnum> r = new ArrayList<>();
		for (Taxonomy t : taxonomy){
			if (t.taxonomyEnum == null){
				return null;
			}
			r.add(t.taxonomyEnum);
		}
		return r;
	}

	public static ArrayList<Taxonomy> taxonomyEnumToTaxonomy(ArrayList<TaxonomyEnum> taxonomy, Corpus corpus){
		ArrayList<Taxonomy> r = new ArrayList<>();
		for (TaxonomyEnum te : taxonomy){
			for (Taxonomy t : corpus.getTaxonomy()){
				if (t.taxonomyEnum.equals(te)) {
					r.add(t);
					break;
				}
			}

		}
		return r;
	}

	public static ArrayList<Taxonomy> modifyingTaxonomy(ArrayList<Taxonomy> taxonomy, List<String> checkedItems, Corpus corpus){
		ArrayList<TaxonomyEnum> checkedItemsTaxonomy = TaxonomyEnum.convertStringListToTaxonomyList(checkedItems, corpus);
		if (checkedItemsTaxonomy != null && corpus.getCorpusType() != CorpusType.VERT && corpus.getCorpusType() != CorpusType.KOST && corpus.getCorpusType() != CorpusType.SSJ500K && corpus.getCorpusType() != CorpusType.GIGAFIDA2) {
			TaxonomyEnum.modifyingTaxonomy(Taxonomy.taxonomyToTaxonomyEnum(taxonomy), checkedItemsTaxonomy, corpus);
			return taxonomyEnumToTaxonomy(checkedItemsTaxonomy, corpus);
		} else {
			return convertStringListToTaxonomyList(checkedItems, corpus);
		}
	}
}
