/**
 * 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.hcatalog.data.schema;

import java.io.Serializable;

import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.hcatalog.common.HCatException;

public class HCatFieldSchema implements Serializable {

    public enum Type {
        INT,
        TINYINT,
        SMALLINT,
        BIGINT,
        BOOLEAN,
        FLOAT,
        DOUBLE,
        STRING,
        ARRAY,
        MAP,
        STRUCT,
        BINARY,
    }

    public enum Category {
        PRIMITIVE,
        ARRAY,
        MAP,
        STRUCT;

        public static Category fromType(Type type) {
            if (Type.ARRAY == type){
                return ARRAY;
            }else if(Type.STRUCT == type){
                return STRUCT;
            }else if (Type.MAP == type){
                return MAP;
            }else{
                return PRIMITIVE;
            }
        }
    };

    public boolean isComplex(){
      return (category == Category.PRIMITIVE) ? false : true;
    }

    /**
     *
     */
    private static final long serialVersionUID = 1L;

    String fieldName = null;
    String comment = null;
    Type type = null;
    Category category = null;

    // Populated if column is struct, array or map types.
    // If struct type, contains schema of the struct.
    // If array type, contains schema of one of the elements.
    // If map type, contains schema of the value element.
    HCatSchema subSchema = null;

    // populated if column is Map type
    Type mapKeyType = null;

    private String typeString = null;

    @SuppressWarnings("unused")
    private HCatFieldSchema(){
        // preventing empty ctor from being callable
    }

    /**
     * Returns type of the field
     * @return type of the field
     */
    public Type getType(){
        return type;
    }

    /**
     * Returns category of the field
     * @return category of the field
     */
    public Category getCategory(){
        return category;
    }

    /**
     * Returns name of the field
     * @return name of the field
     */
    public String getName(){
        return fieldName;
    }

    public String getComment(){
        return comment;
    }

    /**
     * Constructor constructing a primitive datatype HCatFieldSchema
     * @param fieldName Name of the primitive field
     * @param type Type of the primitive field
     * @throws HCatException if call made on non-primitive types
     */
    public HCatFieldSchema(String fieldName, Type type, String comment) throws HCatException {
        assertTypeInCategory(type,Category.PRIMITIVE,fieldName);
        this.fieldName = fieldName;
        this.type = type;
        this.category = Category.PRIMITIVE;
        this.comment = comment;
    }

    /**
     * Constructor for constructing a ARRAY type or STRUCT type HCatFieldSchema, passing type and subschema
     * @param fieldName Name of the array or struct field
     * @param type Type of the field - either Type.ARRAY or Type.STRUCT
     * @param subSchema - subschema of the struct, or element schema of the elements in the array
     * @throws HCatException if call made on Primitive or Map types
     */
    public HCatFieldSchema(String fieldName, Type type, HCatSchema subSchema,String comment) throws HCatException{
        assertTypeNotInCategory(type,Category.PRIMITIVE);
        assertTypeNotInCategory(type,Category.MAP);
        this.fieldName = fieldName;
        this.type = type;
        this.category = Category.fromType(type);
        this.subSchema = subSchema;
        if(type == Type.ARRAY){
         this.subSchema.get(0).setName(null);
        }
        this.comment = comment;
    }

    private void setName(String name) {
      this.fieldName = name;
    }

    /**
     * Constructor for constructing a MAP type HCatFieldSchema, passing type of key and value
     * @param fieldName Name of the array or struct field
     * @param type Type of the field - must be Type.MAP
     * @param mapKeyType - key type of the Map
     * @param mapValueSchema - subschema of the value of the Map
     * @throws HCatException if call made on non-Map types
     */
    public HCatFieldSchema(String fieldName, Type type, Type mapKeyType, HCatSchema mapValueSchema, String comment) throws HCatException{
        assertTypeInCategory(type,Category.MAP, fieldName);
        assertTypeInCategory(mapKeyType,Category.PRIMITIVE, fieldName);
        this.fieldName = fieldName;
        this.type = Type.MAP;
        this.category = Category.MAP;
        this.mapKeyType = mapKeyType;
        this.subSchema = mapValueSchema;
        this.subSchema.get(0).setName(null);
        this.comment = comment;
    }

    public HCatSchema getStructSubSchema() throws HCatException {
        assertTypeInCategory(this.type,Category.STRUCT, this.fieldName);
        return subSchema;
    }

    public HCatSchema getArrayElementSchema() throws HCatException {
        assertTypeInCategory(this.type,Category.ARRAY, this.fieldName);
        return subSchema;
    }

    public Type getMapKeyType() throws HCatException {
        assertTypeInCategory(this.type,Category.MAP, this.fieldName);
        return mapKeyType;
    }

    public HCatSchema getMapValueSchema() throws HCatException {
        assertTypeInCategory(this.type,Category.MAP, this.fieldName);
        return subSchema;
    }

    private static void assertTypeInCategory(Type type, Category category, String fieldName) throws HCatException {
        Category typeCategory = Category.fromType(type);
        if (typeCategory != category){
            throw new HCatException("Type category mismatch. Expected "+category+" but type "+type+" in category "+typeCategory+ " (field "+fieldName+")");
        }
    }

    private static void assertTypeNotInCategory(Type type, Category category) throws HCatException {
        Category typeCategory = Category.fromType(type);
        if (typeCategory == category){
            throw new HCatException("Type category mismatch. Expected type "+type+" not in category "+category+" but was so.");
        }
    }

    @Override
    public String toString() {
      return new ToStringBuilder(this)
          .append("fieldName", fieldName)
          .append("comment", comment)
          .append("type", getTypeString())
          .append("category", category)
          .toString();
    }

    public String getTypeString(){
        if (typeString != null){
            return typeString;
        }

        StringBuilder sb = new StringBuilder();
        if (Category.PRIMITIVE == category){
            sb.append(type);
        }else if (Category.STRUCT == category){
            sb.append("struct<");
            sb.append(subSchema.getSchemaAsTypeString());
            sb.append(">");
        }else if (Category.ARRAY == category){
            sb.append("array<");
            sb.append(subSchema.getSchemaAsTypeString());
            sb.append(">");
        }else if (Category.MAP == category){
            sb.append("map<");
            sb.append(mapKeyType);
            sb.append(",");
            sb.append(subSchema.getSchemaAsTypeString());
            sb.append(">");
        }
        return (typeString = sb.toString().toLowerCase());
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (!(obj instanceof HCatFieldSchema)) {
            return false;
        }
        HCatFieldSchema other = (HCatFieldSchema) obj;
        if (category != other.category) {
            return false;
        }
        if (fieldName == null) {
            if (other.fieldName != null) {
                return false;
            }
        } else if (!fieldName.equals(other.fieldName)) {
            return false;
        }
        if (this.getTypeString() == null) {
            if (other.getTypeString() != null) {
                return false;
            }
        } else if (!this.getTypeString().equals(other.getTypeString())) {
            return false;
        }
        return true;
    }

}
