/*
 * Copyright 2004-2015 the Seasar Foundation and the Others.
 *
 * 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.seasar.extension.jdbc.gen.meta;

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

import org.seasar.extension.jdbc.gen.internal.util.TableUtil;

/**
 * データベースのテーブルメタデータです。
 * 
 * @author taedium
 */
public class DbTableMeta {

    /** カタログ名 */
    protected String catalogName;

    /** スキーマ名 */
    protected String schemaName;

    /** 名前 */
    protected String name;

    /** コメント */
    protected String comment;

    /** カラムメタデータのリスト */
    protected List<DbColumnMeta> columnMetaList = new ArrayList<DbColumnMeta>();

    /** 主キーのカラムメタデータのリスト */
    protected List<DbColumnMeta> primaryKeyColumnMetaList = new ArrayList<DbColumnMeta>();

    /** 外部キーメタデータのリスト */
    protected List<DbForeignKeyMeta> foreignKeyMetaList = new ArrayList<DbForeignKeyMeta>();

    /** 一意キーメタデータのリスト */
    protected List<DbUniqueKeyMeta> uniqueKeyMetaList = new ArrayList<DbUniqueKeyMeta>();

    /**
     * カタログ名を返します。
     * 
     * @return カタログ名
     */
    public String getCatalogName() {
        return catalogName;
    }

    /**
     * カタログ名を設定します。
     * 
     * @param catalogName
     *            カタログ名
     */
    public void setCatalogName(String catalogName) {
        this.catalogName = catalogName;
    }

    /**
     * スキーマ名を返します
     * 
     * @return スキーマ名
     */
    public String getSchemaName() {
        return schemaName;
    }

    /**
     * スキーマ名を設定します。
     * 
     * @param schemaName
     *            スキーマ名
     */
    public void setSchemaName(String schemaName) {
        this.schemaName = schemaName;
    }

    /**
     * 名前を返します。
     * 
     * @return 名前
     */
    public String getName() {
        return name;
    }

    /**
     * 名前を設定します。
     * 
     * @param name
     *            名前
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * コメントを返します。
     * 
     * @return コメント
     */
    public String getComment() {
        return comment;
    }

    /**
     * コメントを設定します。
     * 
     * @param comment
     *            コメント
     */
    public void setComment(String comment) {
        this.comment = comment;
    }

    /**
     * カラムのメタデータのリストを返します。
     * 
     * @return カラムのメタデータのリスト
     */
    public List<DbColumnMeta> getColumnMetaList() {
        return Collections.unmodifiableList(columnMetaList);
    }

    /**
     * カラムのメタデータを追加します。
     * 
     * @param columnDesc
     *            カラム記述
     */
    public void addColumnMeta(DbColumnMeta columnDesc) {
        columnMetaList.add(columnDesc);
        if (columnDesc.isPrimaryKey()) {
            primaryKeyColumnMetaList.add(columnDesc);
        }
    }

    /**
     * 主キーのカラムメタデータのリストを返します。
     * 
     * @return 主キーのカラムメタデータのリスト
     */
    public List<DbColumnMeta> getPrimaryKeyColumnMetaList() {
        return Collections.unmodifiableList(primaryKeyColumnMetaList);
    }

    /**
     * 外部キーメタデータのリストを返します。
     * 
     * @return 外部キーメタデータのリスト
     */
    public List<DbForeignKeyMeta> getForeignKeyMetaList() {
        return Collections.unmodifiableList(foreignKeyMetaList);
    }

    /**
     * 外部キーメタデータを追加します。
     * 
     * @param foreignKeyMeta
     *            外部キーメタデータ
     */
    public void addForeignKeyMeta(DbForeignKeyMeta foreignKeyMeta) {
        foreignKeyMetaList.add(foreignKeyMeta);
    }

    /**
     * 一意キーメタデータのリスト
     * 
     * @return 一意キーメタデータのリスト
     */
    public List<DbUniqueKeyMeta> getUniqueKeyMetaList() {
        return Collections.unmodifiableList(uniqueKeyMetaList);
    }

    /**
     * 一意キーメタデータを追加します。
     * 
     * @param uniqueKeyMeta
     *            一意キーメタデータ
     */
    public void addUniqueKeyMeta(DbUniqueKeyMeta uniqueKeyMeta) {
        uniqueKeyMetaList.add(uniqueKeyMeta);
    }

    /**
     * 完全なテーブル名を返します。
     * 
     * @return 完全なテーブル名
     */
    public String getFullTableName() {
        return TableUtil.buildFullTableName(catalogName, schemaName, name);
    }

    /**
     * 複合主キーを持つ場合{@code true}を返します。
     * 
     * @return 複合主キーを持つ場合{@code true}、そうでない場合{@code false}
     */
    public boolean hasCompositePrimaryKey() {
        return primaryKeyColumnMetaList.size() > 1;
    }
}
