// 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 StringBuilder r = new StringBuilder();

    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() + "]";
  }
}
