/*******************************************************************************
 * Copyright (c) 2010, 2020 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.html.core.internal.contentmodel;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;

import org.eclipse.wst.html.core.internal.provisional.HTML50Namespace;
import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;

/**
 * Factory for element declarations.
 */
class HTML5ElementCollection extends ElementCollection implements org.eclipse.wst.html.core.internal.provisional.HTML50Namespace.ElementName {


	// Element IDs
	private static class Ids50 extends Ids {
		// <<D205513
		
		public static final int ID_ARTICLE =106;
		public static final int ID_ASIDE =107;
		public static final int ID_AUDIO =108;
		public static final int ID_CANVAS =109;
		public static final int ID_COMMAND =110;
		public static final int ID_DATALIST =111;
		public static final int ID_DETAILS = 112;
		public static final int ID_FIGURE =113;
		public static final int ID_FIGCAPTION = 114;
		public static final int ID_FOOTER =115;
		public static final int ID_HEADER = 116;
		public static final int ID_HGROUP =117;
		public static final int ID_KEYGEN =118;
		public static final int ID_MARK =119;
		public static final int ID_MATH =120;
		public static final int ID_METER =121;
		public static final int ID_NAV =122;
		public static final int ID_OUTPUT =123;
		public static final int ID_PROGRESS =124;
		public static final int ID_RP = 125;
		public static final int ID_RT = 126;
		public static final int ID_RUBY =127;
		public static final int ID_SECTION =128;
		public static final int ID_SOURCE = 129;
		public static final int ID_SUMMARY = 130;
		public static final int ID_SVG =131;
		public static final int ID_TIME =132;
		public static final int ID_VIDEO =133;
		public static final int ID_MAIN =134;
		public static final int ID_TEMPLATE =135;
		public static final int ID_SLOT =136;

		// D205513

		public static int getNumOfIds() {
			if (numofids != -1)
				return numofids;

			// NOTE: If the reflection is too slow, this method should
			// just return the literal value, like 105.
			// -- 5/25/2001
			Class<Ids50> clazz = Ids50.class;
			Field[] fields = clazz.getFields();
			numofids = 0;
			for (int i = 0; i < fields.length; i++) {
				String name = fields[i].getName();
				if (name.startsWith("ID_"))//$NON-NLS-1$
					numofids++;
			}
			return numofids;
		}

		// chache the result of the reflection.
		private static int numofids = -1;
	}

	/** %fontstyle;. TT | I | B | U | S | STRIKE | BIG | SMALL | BLINK */
	private static final String[] FONTSTYLE = {TT, I, B, U, S, STRIKE, BIG, SMALL, BLINK};
	/** %formctl;. INPUT | SELECT | TEXTAREA | LABEL | BUTTON */
	private static final String[] FORMCTL = {INPUT, SELECT, TEXTAREA, LABEL, BUTTON, DATALIST};
	/** %phrase;.
	 * EM | STRONG | DFN | CODE | SAMP | KBD | VAR | CITE | ABBR | ACRONYM | MARK
	 */	private static final String[] PHRASE = {KEYGEN, EM, STRONG, DFN, CODE, SAMP, KBD, VAR, CITE, ABBR, ACRONYM, MARK};
	/** %special;.
	 * A | IMG | APPLET | OBJECT | FONT | BASEFONT | BR | SCRIPT |
	 * MAP | Q | SUB | SUP | SPAN | BDO | IFRAME | EMBED | MARQUEE |
	 * D2W | SUBMIT
	 * WBR | NOBR | BGSOUND
	 */
	private static final String[] SPECIAL = {A, IMG, APPLET, OBJECT, FONT, BASEFONT, BR, WBR, // D205513
				SCRIPT, MAP, Q, SUB, SUP, SPAN, BDO, IFRAME, EMBED, BGSOUND, // D205513
				MARQUEE, NOBR, // D205513
				OUTPUT, TIME, METER, PROGRESS,
				COMMAND
	};
	/** %heading;. H[1-6] */
	private static final String[] HEADING = {H1, H2, H3, H4, H5, H6};
	/** %list;. UL | OL | DIR | MENU */
	private static final String[] LIST = {UL, OL, DIR, MENU};
	/** %preformatted;. PRE */
	private static final String[] PREFORMATTED = {PRE};
	/** %sectioning;. ARTICLE | ASIDE | NAV | SECTION */
	private static final String[] SECTIONING = { ARTICLE, ASIDE, NAV, SECTION, MAIN };

	/** %embedded;. AUDIO|CANVAS|EMBED|IFRAME|IMG|MATH|OBJECT|SVG|VIDEO */
	private static final String[] EMBEDDED = { AUDIO, CANVAS, EMBED, IFRAME, IMG, MATH, OBJECT, SVG, VIDEO};

    private static String[] fNames = null;

	/**
	 */
	public HTML5ElementCollection(AttributeCollection collection) {
		super(getNames(), collection);
		attributeCollection = collection;
	}

	/**
	 * Actually creates HTMLElementDeclaration instance.
	 * @return HTMLElementDeclaration
	 */
	protected CMNode create(String elementName) {
		CMNode edec = null;

		if (elementName.equalsIgnoreCase(ACRONYM)) {
			edec = new HedPhrase(ACRONYM, this);
			((HTMLElemDeclImpl) edec).obsolete(true);
		}
		else if (elementName.equalsIgnoreCase(APPLET)) {
			edec = new HedAPPLET(this);
			((HTMLElemDeclImpl) edec).obsolete(true);
		}
		else if (elementName.equalsIgnoreCase(ARTICLE)) {
			edec = new HedSectioning(ARTICLE, this);

		}
		else if (elementName.equalsIgnoreCase(ASIDE)) {
			edec = new HedSectioning(ASIDE, this);

		}
		else if (elementName.equalsIgnoreCase(AUDIO)) {
			edec = new HedMediaElement(AUDIO, this);

		}
		else if (elementName.equalsIgnoreCase(BASEFONT)) {
			edec = new HedBASEFONT(this);
			((HTMLElemDeclImpl) edec).obsolete(true);
		}
		else if (elementName.equalsIgnoreCase(BIG)) {
			edec = new HedFontStyle(BIG, this);
			((HTMLElemDeclImpl) edec).obsolete(true);
		}
		else if (elementName.equalsIgnoreCase(CANVAS)) {
			edec = new HedCANVAS(this);

		}
		else if (elementName.equalsIgnoreCase(CENTER)) {
			edec = new HedCENTER(this);
			((HTMLElemDeclImpl) edec).obsolete(true);
		}
		else if (elementName.equalsIgnoreCase(COMMAND)) {
			edec = new HedCOMMAND(this);

		}
		else if (elementName.equalsIgnoreCase(DATALIST)) {
			edec = new HedDATALIST(this);

		}
		else if (elementName.equalsIgnoreCase(DETAILS)) {
			edec = new HedDETAILS(this);

		}
		else if (elementName.equalsIgnoreCase(DIR)) {
			edec = new HedMENU(DIR, this);
			((HTMLElemDeclImpl) edec).obsolete(true);
		}
		else if (elementName.equalsIgnoreCase(FIGCAPTION)) {
			edec = new HedFIGCAPTION(this);

		}
		else if (elementName.equalsIgnoreCase(FIGURE)) {
			edec = new HedFIGURE(this);

		}
		else if (elementName.equalsIgnoreCase(FOOTER)) {
			edec = new HedHEADER(HTML50Namespace.ElementName.FOOTER ,this);

		}
		else if (elementName.equalsIgnoreCase(FRAME)) {
			edec = new HedFRAME(this);
			((HTMLElemDeclImpl) edec).obsolete(true);
		}
		else if (elementName.equalsIgnoreCase(FRAMESET)) {
			edec = new HedFRAMESET(this);
			((HTMLElemDeclImpl) edec).obsolete(true);
		}
		else if (elementName.equalsIgnoreCase(HEADER)) {
			edec = new HedHEADER(HTML50Namespace.ElementName.HEADER ,this);
		}
		else if (elementName.equalsIgnoreCase(HGROUP)) {
			edec = new HedHGROUP(this);

		}
		else if (elementName.equalsIgnoreCase(ISINDEX)) {
			edec = new HedISINDEX(this);
			((HTMLElemDeclImpl) edec).obsolete(true);
		}
		else if (elementName.equalsIgnoreCase(KEYGEN)) {
			edec = new HedKEYGEN(this);

		}
		else if (elementName.equalsIgnoreCase(MAIN)) {
			edec = new HedSectioning(HTML50Namespace.ElementName.MAIN,this);
		}
		else if (elementName.equalsIgnoreCase(MARK)) {
			edec = new HedPhrase(HTML50Namespace.ElementName.MARK,this);

		}
		else if (elementName.equalsIgnoreCase(MATH)) {
			edec = new HedMath(this);

		}
		else if (elementName.equalsIgnoreCase(METER)) {
			edec = new HedMETER(this);
		}
		else if (elementName.equalsIgnoreCase(NAV)) {
			edec = new HedSectioning(NAV, this);
		}
		else if (elementName.equalsIgnoreCase(NOFRAMES)) {
			edec = new HedNOFRAMES(this);
			((HTMLElemDeclImpl) edec).obsolete(true);
		}
		else if (elementName.equalsIgnoreCase(OUTPUT)) {
			edec = new HedOUTPUT(this);

		}
		else if (elementName.equalsIgnoreCase(PROGRESS)) {
			edec = new HedPROGRESS(this);

		}
		else if (elementName.equalsIgnoreCase(RP)) {
			edec = new HedRP(this);

		}
		else if (elementName.equalsIgnoreCase(RT)) {
			edec = new HedRT(this);

		}
		else if (elementName.equalsIgnoreCase(RUBY)) {
			edec = new HedRUBY(this);

		}
		else if (elementName.equalsIgnoreCase(S)) {
			edec = new HedFontStyle(S, this);
			((HTMLElemDeclImpl) edec).obsolete(true);
		}
		else if (elementName.equalsIgnoreCase(SECTION)) {
			edec = new HedSectioning(SECTION, this);

		}
		else if (elementName.equalsIgnoreCase(SLOT)) {
			edec = new HedSLOT(this);
		}
		else if (elementName.equalsIgnoreCase(SOURCE)) {
			edec = new HedSOURCE(this);
		}
		else if (elementName.equalsIgnoreCase(STRIKE)) {
			edec = new HedFontStyle(STRIKE, this);
			((HTMLElemDeclImpl) edec).obsolete(true);
		}
		else if (elementName.equalsIgnoreCase(SUMMARY)) {
			edec = new HedSUMMARY(this);
		}
		else if (elementName.equalsIgnoreCase(SVG)) {
			edec = new HedSVG(this);
		}
		else if (elementName.equalsIgnoreCase(TIME)) {
			edec = new HedTIME(this);
		}
		else if (elementName.equalsIgnoreCase(TEMPLATE)) {
			edec = new HedTEMPLATE(this);
		}
		else if (elementName.equalsIgnoreCase(TT)) {
			edec = new HedFontStyle(TT, this);
			((HTMLElemDeclImpl) edec).obsolete(true);
		}
		else if (elementName.equalsIgnoreCase(U)) {
			edec = new HedFontStyle(U, this);
			((HTMLElemDeclImpl) edec).obsolete(true);
		}
		else if (elementName.equalsIgnoreCase(VIDEO)) {
			edec = new HedVIDEO(this);

		}
		// unknown
		else {
			// NOTE: We don't define the UNKNOWN element declaration.
			// <code>null</code> for a declaration is a sign of
			// the target element is unknown.
			// -- 3/9/2001
			edec = super.create(elementName);
		}
		return edec;
	}

	public AttributeCollection getAttributeCollection() {
		return attributeCollection;
	}

	public final Collection<String> getNamesOfBlock() {
		// P, DL, DIV, CENTER, NOSCRIPT, NOFRAMES, BLOCKQUOTE, FORM, ISINDEX, HR,
		// TABLE, FIELDSET, ADDRESS, RUBY, FIGURE
		String[] blockMisc = {HEADER, FOOTER, HGROUP, P, DL, DIV, CENTER, NOSCRIPT, NOFRAMES, BLOCKQUOTE, FORM, ISINDEX, HR, TABLE, FIELDSET, ADDRESS, RUBY, FIGURE};
		List<String> names = new ArrayList<>(Arrays.asList(blockMisc));
		// %heading;
		names.addAll(Arrays.asList(HEADING));
		// %list;
		names.addAll(Arrays.asList(LIST));
		// %preformatted;
		names.addAll(Arrays.asList(PREFORMATTED));
		
		return names;
	}

	
	public final void getSectioning(CMGroupImpl group) {
		if (group == null)
			return;
		getDeclarations(group, Arrays.asList(SECTIONING).iterator());
	}
	
	public void getEmbedded(CMGroupImpl group) {
		if (group == null)
			return;
		getDeclarations(group, Arrays.asList(EMBEDDED).iterator());
	}

	public void getFlow(CMGroupImpl group) {
		if (group == null)
			return;
		super.getFlow(group);
		getSectioning(group);
		CMNode node = getNamedItem(DETAILS);
		if (node != null) {
			group.appendChild(node);
		}
		node = getNamedItem(TEMPLATE);
		if (node != null) {
			group.appendChild(node);
		}
		node = getNamedItem(SLOT);
		if (node != null) {
			group.appendChild(node);
		}
	}

	public void getInline(CMGroupImpl group) {
		if (group == null)
			return;
		super.getInline(group);
		getEmbedded(group);
	}

	/**
	 * Create element declarations and store them into a <code>CMGroupImpl</code>
	 * instance.<br>
	 * @param group CMGroupImpl Return values.
	 */
	public final void getFontstyle(CMGroupImpl group) {
		if (group == null)
			return;
		getDeclarations(group, Arrays.asList(FONTSTYLE).iterator());
	}

	/**
	 * Create element declarations and store them into a <code>CMGroupImpl</code>
	 * instance.<br>
	 * @param group CMGroupImpl Return values.
	 */
	public final void getFormctrl(CMGroupImpl group) {
		if (group == null)
			return;
		getDeclarations(group, Arrays.asList(FORMCTL).iterator());
	}

	/**
	 * %heading;.
	 * @param group CMGroupImpl Return values.
	 */
	public final void getHeading(CMGroupImpl group) {
		if (group == null)
			return;

		getDeclarations(group, Arrays.asList(HEADING).iterator());
	}

	

	/**
	 * %list;.
	 * @param group CMGroupImpl Return values.
	 */
	public final void getList(CMGroupImpl group) {
		if (group == null)
			return;

		getDeclarations(group, Arrays.asList(LIST).iterator());
	}

	/**
	 * Create element declarations and store them into a <code>CMGroupImpl</code>
	 * instance.<br>
	 * @param group CMGroupImpl Return values.
	 */
	public final void getPhrase(CMGroupImpl group) {
		if (group == null)
			return;
		getDeclarations(group, Arrays.asList(PHRASE).iterator());
	}

	/**
	 * %preformatted;
	 * @param group CMGroupImpl Return values.
	 */
	public final void getPreformatted(CMGroupImpl group) {
		if (group == null)
			return;

		getDeclarations(group, Arrays.asList(PREFORMATTED).iterator());
	}

	/**
	 * Create element declarations and store them into a <code>CMGroupImpl</code>
	 * instance.<br>
	 * @param group CMGroupImpl Return values.
	 */
	public final void getSpecial(CMGroupImpl group) {
		if (group == null)
			return;
		getDeclarations(group, Arrays.asList(SPECIAL).iterator());
	}

	private static String[] getNames() {
		if (fNames == null) {
			fNames = new String[Ids50.getNumOfIds()];
			fNames[Ids.ID_A] = A;
			fNames[Ids.ID_ABBR] = ABBR;
			fNames[Ids.ID_ACRONYM] = ACRONYM;
			fNames[Ids.ID_ADDRESS] = ADDRESS;
			fNames[Ids.ID_APPLET] = APPLET;
			fNames[Ids.ID_AREA] = AREA;
			fNames[Ids50.ID_ARTICLE] = ARTICLE;
			fNames[Ids50.ID_ASIDE] = ASIDE;
			fNames[Ids50.ID_AUDIO] = AUDIO;
			fNames[Ids.ID_B] = B;
			fNames[Ids.ID_BASE] = BASE;
			fNames[Ids.ID_BASEFONT] = BASEFONT;
			fNames[Ids.ID_BDO] = BDO;
			fNames[Ids.ID_BIG] = BIG;
			fNames[Ids.ID_BLINK] = BLINK;
			fNames[Ids.ID_BLOCKQUOTE] = BLOCKQUOTE;
			fNames[Ids.ID_BODY] = BODY;
			fNames[Ids.ID_BR] = BR;
			fNames[Ids.ID_BUTTON] = BUTTON;
			fNames[Ids.ID_CAPTION] = CAPTION;
			fNames[Ids50.ID_CANVAS] = CANVAS;
			fNames[Ids.ID_CENTER] = CENTER;
			fNames[Ids.ID_CITE] = CITE;
			fNames[Ids.ID_CODE] = CODE;
			fNames[Ids.ID_COL] = COL;
			fNames[Ids.ID_COLGROUP] = COLGROUP;
			fNames[Ids50.ID_COMMAND] = COMMAND;
			fNames[Ids50.ID_DATALIST] = DATALIST;
			fNames[Ids50.ID_DETAILS] = DETAILS;
			fNames[Ids.ID_DD] = DD;
			fNames[Ids.ID_DEL] = DEL;
			fNames[Ids.ID_DFN] = DFN;
			fNames[Ids.ID_DIR] = DIR;
			fNames[Ids.ID_DIV] = DIV;
			fNames[Ids.ID_DL] = DL;
			fNames[Ids.ID_DT] = DT;
			fNames[Ids.ID_EM] = EM;
			fNames[Ids.ID_EMBED] = EMBED;
			fNames[Ids.ID_FIELDSET] = FIELDSET;
			fNames[Ids50.ID_FIGURE] = FIGURE;
			fNames[Ids50.ID_FIGCAPTION] = FIGCAPTION;
			fNames[Ids.ID_FONT] = FONT;
			fNames[Ids.ID_FORM] = FORM;
			fNames[Ids50.ID_FOOTER] = FOOTER;
			fNames[Ids.ID_FRAME] = FRAME;
			fNames[Ids.ID_FRAMESET] = FRAMESET;
			fNames[Ids.ID_H1] = H1;
			fNames[Ids.ID_H2] = H2;
			fNames[Ids.ID_H3] = H3;
			fNames[Ids.ID_H4] = H4;
			fNames[Ids.ID_H5] = H5;
			fNames[Ids.ID_H6] = H6;
			fNames[Ids.ID_HEAD] = HEAD;
			fNames[Ids50.ID_HEADER] = HEADER;
			fNames[Ids50.ID_HGROUP] = HGROUP;
			fNames[Ids.ID_HR] = HR;
			fNames[Ids.ID_HTML] = HTML;
			fNames[Ids.ID_I] = I;
			fNames[Ids.ID_IFRAME] = IFRAME;
			fNames[Ids.ID_IMG] = IMG;
			fNames[Ids.ID_INPUT] = INPUT;
			fNames[Ids.ID_INS] = INS;
			fNames[Ids.ID_ISINDEX] = ISINDEX;
			fNames[Ids.ID_KBD] = KBD;
			fNames[Ids50.ID_KEYGEN] = KEYGEN;
			fNames[Ids.ID_LABEL] = LABEL;
			fNames[Ids.ID_LEGEND] = LEGEND;
			fNames[Ids.ID_LI] = LI;
			fNames[Ids.ID_LINK] = LINK;
			fNames[Ids.ID_MAP] = MAP;
			fNames[Ids50.ID_MAIN] = MAIN;
			fNames[Ids50.ID_MARK] = MARK;
			fNames[Ids.ID_MARQUEE] = MARQUEE;
			fNames[Ids50.ID_MATH] = MATH;
			fNames[Ids.ID_MENU] = MENU;
			fNames[Ids.ID_META] = META;
			fNames[Ids50.ID_METER] = METER;
			fNames[Ids50.ID_NAV] = NAV;
			fNames[Ids.ID_NOEMBED] = NOEMBED;
			fNames[Ids.ID_NOFRAMES] = NOFRAMES;
			fNames[Ids.ID_NOSCRIPT] = NOSCRIPT;
			fNames[Ids.ID_OBJECT] = OBJECT;
			fNames[Ids.ID_OL] = OL;
			fNames[Ids.ID_OPTGROUP] = OPTGROUP;
			fNames[Ids.ID_OPTION] = OPTION;
			fNames[Ids50.ID_OUTPUT] = OUTPUT;
			fNames[Ids.ID_P] = P;
			fNames[Ids.ID_PARAM] = PARAM;
			fNames[Ids.ID_PRE] = PRE;
			fNames[Ids50.ID_PROGRESS] = PROGRESS;
			fNames[Ids.ID_Q] = Q;
			fNames[Ids50.ID_RP] = RP;
			fNames[Ids50.ID_RT] = RT;
			fNames[Ids50.ID_RUBY] = RUBY;
			fNames[Ids.ID_S] = S;
			fNames[Ids.ID_SAMP] = SAMP;
			fNames[Ids.ID_SCRIPT] = SCRIPT;
			fNames[Ids50.ID_SECTION] = SECTION;
			fNames[Ids.ID_SELECT] = SELECT;
			fNames[Ids.ID_SMALL] = SMALL;
			fNames[Ids50.ID_SLOT] = SLOT;
			fNames[Ids50.ID_SOURCE] = SOURCE;
			fNames[Ids.ID_SPAN] = SPAN;
			fNames[Ids.ID_STRIKE] = STRIKE;
			fNames[Ids.ID_STRONG] = STRONG;
			fNames[Ids.ID_STYLE] = STYLE;
			fNames[Ids50.ID_SUMMARY] = SUMMARY;
			fNames[Ids.ID_SUB] = SUB;
			fNames[Ids.ID_SUP] = SUP;
			fNames[Ids50.ID_SVG] = SVG;
			fNames[Ids.ID_TABLE] = TABLE;
			fNames[Ids.ID_TBODY] = TBODY;
			fNames[Ids.ID_TD] = TD;
			fNames[Ids50.ID_TEMPLATE] = TEMPLATE;
			fNames[Ids.ID_TEXTAREA] = TEXTAREA;
			fNames[Ids.ID_TFOOT] = TFOOT;
			fNames[Ids.ID_TH] = TH;
			fNames[Ids.ID_THEAD] = THEAD;
			fNames[Ids50.ID_TIME] = TIME;
			fNames[Ids.ID_TITLE] = TITLE;
			fNames[Ids.ID_TR] = TR;
			fNames[Ids.ID_TT] = TT;
			fNames[Ids.ID_U] = U;
			fNames[Ids.ID_UL] = UL;
			fNames[Ids.ID_VAR] = VAR;
			fNames[Ids50.ID_VIDEO] = VIDEO;
			fNames[Ids.ID_WBR] = WBR;
			fNames[Ids.ID_SSI_CONFIG] = SSI_CONFIG;
			fNames[Ids.ID_SSI_ECHO] = SSI_ECHO;
			fNames[Ids.ID_SSI_EXEC] = SSI_EXEC;
			fNames[Ids.ID_SSI_FSIZE] = SSI_FSIZE;
			fNames[Ids.ID_SSI_FLASTMOD] = SSI_FLASTMOD;
			fNames[Ids.ID_SSI_INCLUDE] = SSI_INCLUDE;
			fNames[Ids.ID_SSI_PRINTENV] = SSI_PRINTENV;
			fNames[Ids.ID_SSI_SET] = SSI_SET;
			fNames[Ids.ID_BGSOUND] = BGSOUND;
			fNames[Ids.ID_NOBR] = NOBR;
			fNames[Ids.ID_WBR] = WBR;
		}
		return fNames;
	}
}
