/*******************************************************************************
 * 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.ofbiz.entity.model;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.ofbiz.base.lang.ThreadSafe;
import org.ofbiz.base.util.UtilValidate;
import org.ofbiz.base.util.UtilXml;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

/**
 * An object that models the <code>&lt;index&gt;</code> element.
 *
 */
@ThreadSafe
@SuppressWarnings("serial")
public final class ModelIndex extends ModelChild {

    /**
     * Returns a new <code>ModelIndex</code> instance, initialized with the specified values.
     * 
     * @param modelEntity The <code>ModelEntity</code> this index is a member of.
     * @param description The index description.
     * @param name The index name.
     * @param fields The fields that are included in this index.
     * @param unique <code>true</code> if this index returns unique values.
     */
    public static ModelIndex create(ModelEntity modelEntity, String description, String name, List<Field> fields, boolean unique) {
        if (description == null) {
            description = "";
        }
        if (name == null) {
            name = "";
        }
        if (fields == null) {
            fields = Collections.emptyList();
        } else {
            fields = Collections.unmodifiableList(fields);
        }
        return new ModelIndex(modelEntity, description, name, fields, unique);
    }

    /**
     * Returns a new <code>ModelIndex</code> instance, initialized with the specified values.
     * 
     * @param modelEntity The <code>ModelEntity</code> this index is a member of.
     * @param indexElement The <code>&lt;index&gt;</code> element containing the values for this index.
     */
    public static ModelIndex create(ModelEntity modelEntity, Element indexElement) {
        String name = indexElement.getAttribute("name").intern();
        boolean unique = "true".equals(indexElement.getAttribute("unique"));
        String description = UtilXml.childElementValue(indexElement, "description");
        List<Field>fields = Collections.emptyList();
        List<? extends Element> elementList = UtilXml.childElementList(indexElement, "index-field");
        if (!elementList.isEmpty()) {
            fields = new ArrayList<Field>(elementList.size());
            for (Element indexFieldElement : elementList) {
                String fieldName = indexFieldElement.getAttribute("name").intern();
                String function = indexFieldElement.getAttribute("function").intern();
                fields.add(new Field(fieldName, UtilValidate.isNotEmpty(function) ? Function.valueOf(function.toUpperCase()) : null));
            }
            fields = Collections.unmodifiableList(fields);
        }
        return new ModelIndex(modelEntity, description, name, fields, unique);
    }

    /*
     * Developers - this is an immutable class. Once constructed, the object should not change state.
     * Therefore, 'setter' methods are not allowed. If client code needs to modify the object's
     * state, then it can create a new copy with the changed values.
     */

    /** the index name, used for the database index name */
    private final String name;

    /** specifies whether or not this index should include the unique constraint */
    private final boolean unique;

    /** list of the field names included in this index */
    private final List<Field> fields;

    private ModelIndex(ModelEntity mainEntity, String description, String name, List<Field> fields, boolean unique) {
        super(mainEntity, description);
        this.name = name;
        this.fields = fields;
        this.unique = unique;
    }

    /** Returns the index name. */
    public String getName() {
        return this.name;
    }

    /** Returns <code>true</code> if this index returns unique values. */
    public boolean getUnique() {
        return this.unique;
    }

    /** Returns the fields included in this index. */
    public List<Field> getFields() {
        return this.fields;
    }

    // TODO: Externalize this.
    public Element toXmlElement(Document document) {
        Element root = document.createElement("index");
        root.setAttribute("name", this.getName());
        if (this.getUnique()) {
            root.setAttribute("unique", "true");
        }

        for (Field field: this.fields) {
            Element fn = document.createElement("index-field");
            fn.setAttribute("name", field.getFieldName());
            if (field.getFunction() != null) {
                fn.setAttribute("function", field.getFunction().toString());
            }
            root.appendChild(fn);
        }

        return root;
    }

    public static final class Field {
        private final String fieldName;
        private final Function function;

        public Field(String fieldName, Function function) {
            this.fieldName = fieldName;
            this.function = function;
        }

        public String getFieldName() {
            return this.fieldName;
        }

        public Function getFunction() {
            return function;
        }

        @Override
        public String toString() {
            if (function == null) {
                return fieldName;
            } else {
                return function.toString() + '(' + fieldName + ')';
            }
        }
    }

    public enum Function { LOWER, UPPER }
}
