/*
 * Copyright 2015 Open Networking Laboratory
 *
 * Licensed 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.onosproject.ovsdb.rfc.schema;

import static com.google.common.base.MoreObjects.toStringHelper;
import static com.google.common.base.Preconditions.checkNotNull;

import java.util.Map;
import java.util.Objects;
import java.util.Set;

import org.onosproject.ovsdb.rfc.schema.type.AtomicColumnType;
import org.onosproject.ovsdb.rfc.schema.type.UuidBaseType;

/**
 * A schema for the table represented by table-schema, which consists of a set
 * of columns.
 */
public final class TableSchema {

    private final String name;
    private final Map<String, ColumnSchema> columnSchemas;

    /**
     * Constructs a TableSchema object.
     * @param name the name of table
     * @param columnSchemas a map of ColumnSchema
     */
    public TableSchema(String name, Map<String, ColumnSchema> columnSchemas) {
        checkNotNull(name, "name cannot be null");
        checkNotNull(columnSchemas, "columnSchemas cannot be null");
        this.name = name;
        this.columnSchemas = columnSchemas;
    }

    /**
     * Returns the name of table.
     * @return the name of table
     */
    public String name() {
        return name;
    }

    /**
     * Returns a map of ColumnSchema.
     * @return a map of ColumnSchema
     */
    public Map<String, ColumnSchema> columnSchemas() {
        return this.columnSchemas;
    }

    /**
     * Returns a set of column name.
     * @return a set of column name
     */
    public Set<String> getColumnNames() {
        return this.columnSchemas.keySet();
    }

    /**
     * Determine whether contain the column.
     * @param columnName column name
     * @return boolean
     */
    public boolean hasColumn(String columnName) {
        return this.getColumnNames().contains(columnName);
    }

    /**
     * Returns the ColumnSchema whose name is the columnName.
     * @param columnName column name
     * @return ColumnSchema
     */
    public ColumnSchema getColumnSchema(String columnName) {
        return this.columnSchemas.get(columnName);
    }

    /**
     * Refer to RFC 7047 Section 3.2. generate initialization columns in each
     * table namely _uuid and _version.
     */
    public void generateInitializationColumns() {
        columnSchemas
                .put("_uuid",
                     new ColumnSchema("_uuid",
                                      new AtomicColumnType(new UuidBaseType())));
        columnSchemas
                .put("_version",
                     new ColumnSchema("_version",
                                      new AtomicColumnType(new UuidBaseType())));
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, columnSchemas);
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj instanceof TableSchema) {
            final TableSchema other = (TableSchema) obj;
            return Objects.equals(this.name, other.name)
                    && Objects.equals(this.columnSchemas, other.columnSchemas);
        }
        return false;
    }

    @Override
    public String toString() {
        return toStringHelper(this).add("name", name)
                .add("columnSchemas", columnSchemas).toString();
    }
}
