/*
 * 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.struts2.views.java;

import org.apache.commons.text.StringEscapeUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.struts2.views.TagAttribute;

import java.util.LinkedHashMap;

/**
 * Map of tag attributes, used for rendering the tags
 */
public class Attributes extends LinkedHashMap<String, String> {

    private static final long serialVersionUID = 4103241472140545630L; 

    public Attributes add(String key, String value) {
        return add(key, value, true);
    }

    public Attributes add(String key, String value, boolean encode) {
        put(key, (encode ? StringUtils.defaultString(StringEscapeUtils.escapeHtml4(value)) : value));
        return this;
    }

    /**
     * Add a key/value pair to the attributes only if the value is not null. Value
     * is html encoded
     * @param attrName attribute name
     * @param paramValue value of attribute
     * @return this
     */
    public Attributes addIfExists(String attrName, Object paramValue) {
        return addIfExists(attrName, paramValue, true);
    }

    /**
     * Add a key/value pair to the attributes only if the value is not null.
     * @param attrName attribute name
     * @param paramValue value of attribute
     * @param encode html encode the value
     * @return this
     */
    public Attributes addIfExists(String attrName, Object paramValue, boolean encode) {
        if (paramValue != null) {
            String val = paramValue.toString();
            if (paramValue instanceof TagAttribute) {
                val = ((TagAttribute) paramValue).getValue();
            }
            if (StringUtils.isNotBlank(val))
                put(attrName, (encode ? StringUtils.defaultString(StringEscapeUtils.escapeHtml4(val)) : val));
        }
        return this;
    }

    /**
     * Add a key/value pair to the attributes only if the value is not null and is a boolean with a
     * value of 'true'. Value is html encoded
     * @param attrName attribute name
     * @param paramValue value of attribute
     * @return this
     */
    public Attributes addIfTrue(String attrName, Object paramValue) {
        if (paramValue != null) {
            if ((paramValue instanceof Boolean && ((Boolean) paramValue).booleanValue()) ||
                    (Boolean.valueOf(paramValue.toString()).booleanValue())) {
                put(attrName, attrName);
            }
        }
        return this;
    }

    /**
     * Add a key/value pair to the attributes, if the value is null, it will be set as an empty string.
     * Value is html encoded.
     * @param attrName attribute name
     * @param paramValue value of attribute
     * @return this
     */
    public Attributes addDefaultToEmpty(String attrName, Object paramValue) {
        return addDefaultToEmpty(attrName, paramValue, true);
    }

    /**
     * Add a key/value pair to the attributes, if the value is null, it will be set as an empty string.
     * @param attrName attribute name
     * @param paramValue value of attribute
     * @param encode html encode the value
     * @return this
     */
    public Attributes addDefaultToEmpty(String attrName, Object paramValue, boolean encode) {
        if (paramValue != null) {
            String val = paramValue.toString();
            put(attrName, (encode ? StringUtils.defaultString(StringEscapeUtils.escapeHtml4(val)) : val));
        } else {
            put(attrName, "");
        }
        return this;
    }
}
