// ***************************************************************************************************************************
// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
// * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *
// * with the License.  You may obtain a copy of the License at                                                              *
// *                                                                                                                         *
// *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *
// *                                                                                                                         *
// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *
// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
// * specific language governing permissions and limitations under the License.                                              *
// ***************************************************************************************************************************
package org.apache.juneau.dto.html5;

import static org.apache.juneau.xml.annotation.XmlFormat.*;
import static org.apache.juneau.html.annotation.HtmlFormat.*;

import java.net.*;
import java.net.URI;
import java.util.*;
import java.util.Map.*;

import org.apache.juneau.*;
import org.apache.juneau.annotation.*;
import org.apache.juneau.html.*;
import org.apache.juneau.internal.*;
import org.apache.juneau.xml.annotation.*;

/**
 * Superclass for all HTML elements.
 *
 * <p>
 * These are beans that when serialized using {@link HtmlSerializer} generate valid HTML5 elements.
 *
 * <ul class='seealso'>
 * 	<li class='link'>{@doc juneau-dto.HTML5}
 * </ul>
 */
@org.apache.juneau.html.annotation.Html(format=XML)
public abstract class HtmlElement {

	private LinkedHashMap<String,Object> attrs;

	/**
	 * The attributes of this element.
	 *
	 * @return The attributes of this element.
	 */
	@Xml(format=ATTRS)
	@Beanp("a")
	public LinkedHashMap<String,Object> getAttrs() {
		return attrs;
	}

	/**
	 * Sets the attributes for this element.
	 *
	 * @param attrs The new attributes for this element.
	 * @return This object (for method chaining).
	 */
	@Beanp("a")
	public HtmlElement setAttrs(LinkedHashMap<String,Object> attrs) {
		for (Entry<String,Object> e : attrs.entrySet()) {
			String key = e.getKey();
			if ("url".equals(key) || "href".equals(key) || key.endsWith("action"))
				e.setValue(StringUtils.toURI(e.getValue()));
		}
		this.attrs = attrs;
		return this;
	}

	/**
	 * Adds an arbitrary attribute to this element.
	 *
	 * @param key The attribute name.
	 * @param val The attribute value.
	 * @return This object (for method chaining).
	 */
	public HtmlElement attr(String key, Object val) {
		if (this.attrs == null)
			this.attrs = new LinkedHashMap<>();
		if (val == null)
			this.attrs.remove(key);
		else {
			if ("url".equals(key) || "href".equals(key) || key.endsWith("action"))
				val = StringUtils.toURI(val);
			this.attrs.put(key, val);
		}
		return this;
	}

	/**
	 * Adds an arbitrary URI attribute to this element.
	 *
	 * <p>
	 * Same as {@link #attr(String, Object)}, except if the value is a string that appears to be a URI
	 * (e.g. <js>"servlet:/xxx"</js>).
	 *
	 * <p>
	 * The value can be of any of the following types: {@link URI}, {@link URL}, {@link String}.
	 * Strings must be valid URIs.
	 *
	 * <p>
	 * URIs defined by {@link UriResolver} can be used for values.
	 *
	 * @param key The attribute name.
	 * @param val The attribute value.
	 * @return This object (for method chaining).
	 */
	public HtmlElement attrUri(String key, Object val) {
		if (this.attrs == null)
			this.attrs = new LinkedHashMap<>();
		this.attrs.put(key, StringUtils.toURI(val));
		return this;
	}

	/**
	 * Returns the attribute with the specified name.
	 *
	 * @param key The attribute name.
	 * @return The attribute value, or <jk>null</jk> if the named attribute does not exist.
	 */
	public String getAttr(String key) {
		return getAttr(String.class, key);
	}

	/**
	 * Returns the attribute with the specified name converted to the specified class type.
	 *
	 * @param type
	 * 	The class type to convert this class to.
	 * 	See {@link ObjectUtils} for a list of supported conversion types.
	 * @param key The attribute name.
	 * @return The attribute value, or <jk>null</jk> if the named attribute does not exist.
	 */
	public <T> T getAttr(Class<T> type, String key) {
		return attrs == null ? null : ObjectUtils.toType(attrs.get(key), type);
	}

	/**
	 * {@doc HTML5.editing#the-accesskey-attribute accesskey}
	 * attribute.
	 *
	 * @param accesskey The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement accesskey(String accesskey) {
		attr("accesskey", accesskey);
		return this;
	}

	/**
	 * {@doc HTML5.dom#classes class} attribute.
	 *
	 * @param _class The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement _class(String _class) {
		attr("class", _class);
		return this;
	}

	/**
	 * {@doc HTML5.editing#attr-contenteditable contenteditable}
	 * attribute.
	 *
	 * @param contenteditable The new value for this attribute.
	 * Typically a {@link Boolean} or {@link String}.
	 * @return This object (for method chaining).
	 */
	public HtmlElement contenteditable(Object contenteditable) {
		attr("contenteditable", contenteditable);
		return this;
	}

	/**
	 * {@doc HTML5.dom#the-dir-attribute dir} attribute.
	 *
	 * @param dir The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement dir(String dir) {
		attr("dir", dir);
		return this;
	}

	/**
	 * {@doc HTML5.editing#the-hidden-attribute hidden} attribute.
	 *
	 * @param hidden
	 * 	The new value for this attribute.
	 * 	Typically a {@link Boolean} or {@link String}.
	 * @return This object (for method chaining).
	 */
	public HtmlElement hidden(Object hidden) {
		attr("hidden", deminimize(hidden, "hidden"));
		return this;
	}

	/**
	 * {@doc HTML5.dom#the-id-attribute id} attribute.
	 *
	 * @param id The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement id(String id) {
		attr("id", id);
		return this;
	}

	/**
	 * {@doc HTML5.dom#attr-lang lang} attribute.
	 *
	 * @param lang The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement lang(String lang) {
		attr("lang", lang);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-onabort onabort} attribute.
	 *
	 * @param onabort The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement onabort(String onabort) {
		attr("onabort", onabort);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-onblur onblur} attribute.
	 *
	 * @param onblur The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement onblur(String onblur) {
		attr("onblur", onblur);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-oncancel oncancel} attribute.
	 *
	 * @param oncancel The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement oncancel(String oncancel) {
		attr("oncancel", oncancel);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-oncanplay oncanplay} attribute.
	 *
	 * @param oncanplay The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement oncanplay(String oncanplay) {
		attr("oncanplay", oncanplay);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-oncanplaythrough oncanplaythrough}
	 * attribute.
	 *
	 * @param oncanplaythrough The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement oncanplaythrough(String oncanplaythrough) {
		attr("oncanplaythrough", oncanplaythrough);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-onchange onchange} attribute.
	 *
	 * @param onchange The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement onchange(String onchange) {
		attr("onchange", onchange);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-onclick onclick} attribute.
	 *
	 * @param onclick The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement onclick(String onclick) {
		attr("onclick", onclick);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-oncuechange oncuechange}
	 * attribute.
	 *
	 * @param oncuechange The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement oncuechange(String oncuechange) {
		attr("oncuechange", oncuechange);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-ondblclick ondblclick} attribute.
	 *
	 * @param ondblclick The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement ondblclick(String ondblclick) {
		attr("ondblclick", ondblclick);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-ondurationchange ondurationchange}
	 * attribute.
	 *
	 * @param ondurationchange The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement ondurationchange(String ondurationchange) {
		attr("ondurationchange", ondurationchange);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-onemptied onemptied} attribute.
	 *
	 * @param onemptied The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement onemptied(String onemptied) {
		attr("onemptied", onemptied);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-onended onended} attribute.
	 *
	 * @param onended The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement onended(String onended) {
		attr("onended", onended);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-onerror onerror} attribute.
	 *
	 * @param onerror The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement onerror(String onerror) {
		attr("onerror", onerror);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-onfocus onfocus} attribute.
	 *
	 * @param onfocus The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement onfocus(String onfocus) {
		attr("onfocus", onfocus);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-oninput oninput} attribute.
	 *
	 * @param oninput The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement oninput(String oninput) {
		attr("oninput", oninput);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-oninvalid oninvalid} attribute.
	 *
	 * @param oninvalid The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement oninvalid(String oninvalid) {
		attr("oninvalid", oninvalid);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-onkeydown onkeydown} attribute.
	 *
	 * @param onkeydown The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement onkeydown(String onkeydown) {
		attr("onkeydown", onkeydown);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-onkeypress onkeypress} attribute.
	 *
	 * @param onkeypress The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement onkeypress(String onkeypress) {
		attr("onkeypress", onkeypress);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-onkeyup onkeyup} attribute.
	 *
	 * @param onkeyup The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement onkeyup(String onkeyup) {
		attr("onkeyup", onkeyup);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-onload onload} attribute.
	 *
	 * @param onload The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement onload(String onload) {
		attr("onload", onload);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-onloadeddata onloadeddata}
	 * attribute.
	 *
	 * @param onloadeddata The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement onloadeddata(String onloadeddata) {
		attr("onloadeddata", onloadeddata);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-onloadedmetadata onloadedmetadata}
	 * attribute.
	 *
	 * @param onloadedmetadata The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement onloadedmetadata(String onloadedmetadata) {
		attr("onloadedmetadata", onloadedmetadata);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-onloadstart onloadstart}
	 * attribute.
	 *
	 * @param onloadstart The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement onloadstart(String onloadstart) {
		attr("onloadstart", onloadstart);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-onmousedown onmousedown}
	 * attribute.
	 *
	 * @param onmousedown The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement onmousedown(String onmousedown) {
		attr("onmousedown", onmousedown);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-onmouseenter onmouseenter} attribute.
	 *
	 * @param onmouseenter The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement onmouseenter(String onmouseenter) {
		attr("onmouseenter", onmouseenter);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-onmouseleave onmouseleave}
	 * attribute.
	 *
	 * @param onmouseleave The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement onmouseleave(String onmouseleave) {
		attr("onmouseleave", onmouseleave);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-onmousemove onmousemove}
	 * attribute.
	 *
	 * @param onmousemove The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement onmousemove(String onmousemove) {
		attr("onmousemove", onmousemove);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-onmouseout onmouseout} attribute.
	 *
	 * @param onmouseout The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement onmouseout(String onmouseout) {
		attr("onmouseout", onmouseout);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-onmouseover onmouseover}
	 * attribute.
	 *
	 * @param onmouseover The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement onmouseover(String onmouseover) {
		attr("onmouseover", onmouseover);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-onmouseup onmouseup} attribute.
	 *
	 * @param onmouseup The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement onmouseup(String onmouseup) {
		attr("onmouseup", onmouseup);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-onmousewheel onmousewheel}
	 * attribute.
	 *
	 * @param onmousewheel The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement onmousewheel(String onmousewheel) {
		attr("onmousewheel", onmousewheel);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-onpause onpause} attribute.
	 *
	 * @param onpause The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement onpause(String onpause) {
		attr("onpause", onpause);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-onplay onplay} attribute.
	 *
	 * @param onplay The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement onplay(String onplay) {
		attr("onplay", onplay);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-onplaying onplaying} attribute.
	 *
	 * @param onplaying The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement onplaying(String onplaying) {
		attr("onplaying", onplaying);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-onprogress onprogress} attribute.
	 *
	 * @param onprogress The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement onprogress(String onprogress) {
		attr("onprogress", onprogress);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-onratechange onratechange}
	 * attribute.
	 *
	 * @param onratechange The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement onratechange(String onratechange) {
		attr("onratechange", onratechange);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-onreset onreset} attribute.
	 *
	 * @param onreset The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement onreset(String onreset) {
		attr("onreset", onreset);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-onresize onresize} attribute.
	 *
	 * @param onresize The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement onresize(String onresize) {
		attr("onresize", onresize);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-onscroll onscroll} attribute.
	 *
	 * @param onscroll The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement onscroll(String onscroll) {
		attr("onscroll", onscroll);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-onseeked onseeked} attribute.
	 *
	 * @param onseeked The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement onseeked(String onseeked) {
		attr("onseeked", onseeked);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-onseeking onseeking} attribute.
	 *
	 * @param onseeking The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement onseeking(String onseeking) {
		attr("onseeking", onseeking);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-onselect onselect} attribute.
	 *
	 * @param onselect The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement onselect(String onselect) {
		attr("onselect", onselect);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-onshow onshow} attribute.
	 *
	 * @param onshow The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement onshow(String onshow) {
		attr("onshow", onshow);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-onstalled onstalled} attribute.
	 *
	 * @param onstalled The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement onstalled(String onstalled) {
		attr("onstalled", onstalled);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-onsubmit onsubmit} attribute.
	 *
	 * @param onsubmit The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement onsubmit(String onsubmit) {
		attr("onsubmit", onsubmit);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-onsuspend onsuspend} attribute.
	 *
	 * @param onsuspend The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement onsuspend(String onsuspend) {
		attr("onsuspend", onsuspend);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-ontimeupdate ontimeupdate}
	 * attribute.
	 *
	 * @param ontimeupdate The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement ontimeupdate(String ontimeupdate) {
		attr("ontimeupdate", ontimeupdate);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-ontoggle ontoggle} attribute.
	 *
	 * @param ontoggle The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement ontoggle(String ontoggle) {
		attr("ontoggle", ontoggle);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-onvolumechange onvolumechange}
	 * attribute.
	 *
	 * @param onvolumechange The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement onvolumechange(String onvolumechange) {
		attr("onvolumechange", onvolumechange);
		return this;
	}

	/**
	 * {@doc HTML5.webappapis#handler-onwaiting onwaiting} attribute.
	 *
	 * @param onwaiting The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement onwaiting(String onwaiting) {
		attr("onwaiting", onwaiting);
		return this;
	}

	/**
	 * {@doc HTML5.editing#attr-spellcheck spellcheck} attribute.
	 *
	 * @param spellcheck
	 * 	The new value for this attribute.
	 * 	Typically a {@link Boolean} or {@link String}.
	 * @return This object (for method chaining).
	 */
	public HtmlElement spellcheck(Object spellcheck) {
		attr("spellcheck", spellcheck);
		return this;
	}

	/**
	 * {@doc HTML5.dom#the-style-attribute style} attribute.
	 *
	 * @param style The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement style(String style) {
		attr("style", style);
		return this;
	}

	/**
	 * {@doc HTML5.editing#attr-tabindex tabindex} attribute.
	 *
	 * @param tabindex
	 * 	The new value for this attribute.
	 * 	Typically a {@link Number} or {@link String}.
	 * @return This object (for method chaining).
	 */
	public HtmlElement tabindex(Object tabindex) {
		attr("tabindex", tabindex);
		return this;
	}

	/**
	 * {@doc HTML5.dom#attr-title title} attribute.
	 *
	 * @param title The new value for this attribute.
	 * @return This object (for method chaining).
	 */
	public HtmlElement title(String title) {
		attr("title", title);
		return this;
	}

	/**
	 * {@doc HTML5.dom#attr-translate translate} attribute.
	 *
	 * @param translate
	 * 	The new value for this attribute.
	 * 	Typically a {@link Number} or {@link String}.
	 * @return This object (for method chaining).
	 */
	public HtmlElement translate(Object translate) {
		attr("translate", translate);
		return this;
	}

	/**
	 * If the specified attribute is a boolean, it gets converted to the attribute name if <jk>true</jk> or <jk>null</jk> if <jk>false</jk>.
	 *
	 * @param value The attribute value.
	 * @param attr The attribute name.
	 * @return The deminimized value, or the same value if the value wasn't a boolean.
	 */
	protected Object deminimize(Object value, String attr) {
		if (value instanceof Boolean) {
			if ((Boolean)value)
				return attr;
			return null;
		}
		return value;
	}

	@Override /* Object */
	public String toString() {
		return HtmlSerializer.DEFAULT_SQ.toString(this);
	}
}
