// Copyright 2008 Google Inc.
//
// 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 com.google.gwtorm.schema;

import com.google.gwtorm.schema.sql.SqlDialect;
import com.google.gwtorm.server.OrmException;

import java.util.Collection;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

public abstract class SchemaModel {
  protected final Set<String> allNames;
  protected final Map<String, RelationModel> relations;
  protected final Map<String, SequenceModel> sequences;

  protected SchemaModel() {
    allNames = new HashSet<>();
    relations = new TreeMap<>();
    sequences = new TreeMap<>();
  }

  protected void add(final RelationModel r) throws OrmException {
    final String n = r.getRelationName();
    checkNotUsed(n);
    if (relations.put(n, r) != null) {
      throw new OrmException("Duplicate relations " + n);
    }
    allNames.add(n);
  }

  protected void add(final SequenceModel s) throws OrmException {
    final String n = s.getSequenceName();
    checkNotUsed(n);
    if (sequences.put(n, s) != null) {
      throw new OrmException("Duplicate sequences " + n);
    }
    allNames.add(n);
  }

  private void checkNotUsed(final String n) throws OrmException {
    if (allNames.contains(n)) {
      throw new OrmException("Name " + n + " already used");
    }
  }

  public Collection<RelationModel> getRelations() {
    return relations.values();
  }

  public Collection<SequenceModel> getSequences() {
    return sequences.values();
  }

  public String getCreateDatabaseSql(final SqlDialect dialect) {
    final StringBuffer r = new StringBuffer();

    for (final SequenceModel seq : getSequences()) {
      r.append(seq.getCreateSequenceSql(dialect));
      r.append(";\n");
    }
    if (!getSequences().isEmpty()) {
      r.append("\n");
    }

    for (final RelationModel rel : getRelations()) {
      r.append(rel.getCreateTableSql(dialect));
      r.append(";\n\n");
    }

    return r.toString();
  }

  public abstract String getSchemaClassName();

  @Override
  public String toString() {
    return "Schema[" + getSchemaClassName() + "]";
  }
}
