/*!
 * ${copyright}
 */

// Provides default renderer for control sap.ui.commons.Panel
sap.ui.define(['sap/base/security/encodeXML', 'sap/ui/core/library', 'sap/ui/core/Configuration'],
	function(encodeXML, coreLibrary, Configuration) {
	"use strict";


	// shortcut for sap.ui.core.TitleLevel
	var TitleLevel = coreLibrary.TitleLevel;


	/**
	 * @namespace
	 */
	var PanelRenderer = function() {
	};


	/**
	 * Renders the HTML for the Panel, using the provided {@link sap.ui.core.RenderManager}.
	 *
	 * @param {sap.ui.core.RenderManager} rm The RenderManager that can be used for writing to the render output buffer.
	 * @param {sap.ui.core.Control} oControl An object representation of the control that should be rendered
	 */
	PanelRenderer.render = function(rm, oControl) {
		var id = oControl.getId();
		var accessibility = Configuration.getAccessibility();

		//var hasToolbar = false; // TODO: this can be used in the future; rendering should already be quite ok, but minor adjustments are expected

		var heightSet = isSizeSet(oControl.getHeight());
		var widthSet = isSizeSet(oControl.getWidth());

		oControl.getScrollTop();  // update the scroll position properties
		oControl.getScrollLeft();


		// root element and classes
		rm.write("<section");
		rm.writeControlData(oControl);
		rm.addClass("sapUiPanel");
		rm.addStyle("width", oControl.getWidth());

		if (!oControl.getCollapsed()) {
			rm.addStyle("height", oControl.getHeight());
		} else {
			rm.addClass("sapUiPanelColl");
			rm.addStyle("height", "auto");
		}
		if (heightSet) {
			rm.addClass("sapUiPanelHeightSet");
		}
		if (widthSet) {
			rm.addClass("sapUiPanelWidthSet");
		}
		if (oControl.getApplyContentPadding()) {
			rm.addClass("sapUiPanelWithPadding");
		}
		if (!oControl.getEnabled()) {
			rm.addClass("sapUiPanelDis");
		}
		if (oControl.getShowCollapseIcon()) {
			rm.addClass("sapUiPanelWithCollapseIcon");
		}
		rm.addClass("sapUiPanelBorderDesign" + oControl.getBorderDesign());
		rm.addClass("sapUiPanelAreaDesign" + oControl.getAreaDesign());
		rm.writeClasses();
		rm.writeStyles();

		if (accessibility) {
			rm.writeAttribute("aria-labelledby", id + "-title ");
			rm.writeAttribute("aria-describedby", id + "-acc");
			rm.writeAttribute("role", "region");
			if (oControl.getCollapsed()) {
				rm.writeAttribute("aria-expanded", "false");
			} else {
				rm.writeAttribute("aria-expanded", "true");
			}
			rm.writeAttribute("tabindex", "0");
		}

		// tooltip of Panel
		var sTooltip = oControl.getTooltip_AsString();
		if (sTooltip) {
			rm.writeAttributeEscaped("title", sTooltip);
		}


		// header
		rm.write("><header id='" + id + "-hdr'");
		rm.addClass("sapUiPanelHdr");

		// tooltip of Title, might be set in addition
		var oTitle = oControl.getTitle();
		var sTitleTooltip;
		var sLevel = TitleLevel.H5; // to be compatible of size
		var bEmphasized = true;
		if (oTitle) {
			sTitleTooltip = oTitle.getTooltip_AsString();
			if (sTitleTooltip) {
				rm.writeAttributeEscaped("title", sTitleTooltip);
			}

			if (oTitle.getLevel() != TitleLevel.Auto) {
				// if title level is set use emphasized of title, otherwise use default one to be compatible
				sLevel = oTitle.getLevel();
				bEmphasized = oTitle.getEmphasized();
			}
		}
		if (bEmphasized) {
			rm.addClass("sapUiPanelHdrEmph");
		}

		rm.writeClasses();
		rm.write(">");

		if (oControl.getShowCollapseIcon() && accessibility) {
			rm.write("<span id=\"" + id + "-acc\" style=\"display:none;\">");
			rm.writeEscaped(oControl._rb.getText("PANEL_HEAD_ACC"));
			rm.write("</span>");
		}

		var sCollapseTooltip = oControl._rb.getText(oControl.getCollapsed() ? "PANEL_EXPAND" : "PANEL_COLLAPSE");
		if (oControl.getShowCollapseIcon()) { /* TODO: remove this one and rearrange the other in CSS */
			rm.write("<a id='" + id + "-collArrow' class='sapUiPanelHdrItem sapUiPanelCollArrow' href='#' tabindex='0' title='" + sCollapseTooltip + "'");
			if (accessibility) {
				//rm.writeAttribute("aria-labelledby", id + "-title");
				rm.writeAttribute("role", "button");
			}
			rm.write(">&nbsp;</a>");
		}


		// IMPORTANT: title h1 is always rendered to simplify calculations and because having no title should be a rare use-case
		// if (oTitle) {
		if (oTitle && oTitle.getIcon()) {
			// header icon, if available
			var sIcon = oTitle.getIcon();
			var aClasses = [];
			var mAttributes = {};

			mAttributes["id"] = id + "-ico";
			mAttributes["title"] = null; // prevent icon tooltip
			aClasses.push("sapUiPanelIco");
			aClasses.push("sapUiPanelHdrItem");
			aClasses.push("sapUiTv" + sLevel); // use same font-size like header level (if icon font is used (for image it dosn't matters)

			rm.writeIcon(sIcon, aClasses, mAttributes);
		}

		// header title text
		var text = encodeXML(oControl.getText());
		if (!text) {
			text = "&nbsp;";
		}
		// just reuse TextView class because there font size & co. is already defined
		rm.write("<" + sLevel + " ");
		rm.addClass("sapUiTv" + sLevel);
	//	rm.write("<h1 id='" + id + "-title' class='sapUiPanelHdrItem sapUiPanelTitle'");
		rm.write(" id='" + id + "-title' ");
		rm.addClass("sapUiPanelHdrItem");
		rm.addClass("sapUiPanelTitle");
		rm.writeClasses();
		if (accessibility) {
			rm.writeAttribute("role", "heading");
		}
		rm.write(">");
		rm.write(text); // already escaped!
	//	rm.write("</h1>");
		rm.write("</" + sLevel + ">");


	  // toolbar + buttons
	  var aButtons = oControl.getButtons();
	  if (aButtons && (aButtons.length > 0)) {
		rm.write("<div id='" + id + "-tb' class='sapUiPanelHdrItem sapUiPanelTb sapUiTbDesignFlat'>");

		for (var i = 0; i < aButtons.length; i++) {
			rm.renderControl(aButtons[i]);
		}

			rm.write("</div>");
	  }


	  // any other right-aligned buttons go like this:
	  // <a id="firstIcoRight" class="sapUiPanelHdrRightItem sapUiPanel*">O</a>
	  // the positioning among these items needs to be solved then, either by fixed CSS classes if there are few items (like Right1 Right2)
	  // or maybe they need to be put into a nowrap div

	  // collapse icon
	  if (oControl.getShowCollapseIcon()) {
			rm.write("<a id='" + id + "-collIco' class='sapUiPanelHdrRightItem sapUiPanelCollIco' href='#' tabindex='0' title='" + sCollapseTooltip + "'");
			if (accessibility) {
				//rm.writeAttribute("aria-labelledby", id + "-title");
				rm.writeAttribute("role", "button");
			}
			rm.write(">&nbsp;</a>");
		}

	  rm.write("</header>");



		// content area

		// everything below the header is only rendered initially if not collapsed - saves performance and Panel just re-renders later on expand
		if (!oControl.getCollapsed()) {
			rm.write("<div class='sapUiPanelCont' id='", id, "-cont'>");

			// Content (child controls)
			var oControls = oControl.getContent(),
					iLength = oControls.length;
			for (var i = 0; i < iLength; i++) {
				rm.renderControl(oControls[i]);
			}

			rm.write("</div>");
		} else {
			oControl.getContent().forEach(function(oChild) {
				rm.cleanupControlWithoutRendering(oChild);
			});
		}

		rm.write("</section>");
	};

	function isSizeSet(sCssSize) {
		return sCssSize && sCssSize !== "auto" && sCssSize !== "inherit";
	}

	return PanelRenderer;

}, /* bExport= */ true);
