/*
 * Copyright 2013 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.gwt.dev.cfg;

import com.google.gwt.dev.javac.CompilationUnit;
import com.google.gwt.dev.jjs.PermutationResult;
import com.google.gwt.dev.resource.Resource;
import com.google.gwt.dev.util.PersistenceBackedObject;
import com.google.gwt.thirdparty.guava.common.collect.Multimap;

import java.util.Set;

/**
 * A builder which collects and writes the contents of a library.<br />
 *
 * It also provides access to a very small subset of properties for LibraryGroup access.
 */
public interface LibraryBuilder {

  /**
   * Adds a build resource. Build resources are any resources provided in source paths but which are
   * not themselves source code. For example *.gwt.xml and *.ui.xml files.
   */
  void addBuildResource(Resource buildResource);

  /**
   * Adds a previously compiled (but not yet unified) compilation unit.
   */
  void addCompilationUnit(CompilationUnit compilationUnit);

  /**
   * Registers a dependency on some other library.
   */
  void addDependencyLibraryName(String dependencyLibraryName);

  /**
   * Registers dependency on a set of other libraries.
   */
  void addDependencyLibraryNames(Set<String> dependencyLibraryNames);

  /**
   * Registers newly legal values on some binding property.
   */
  void addNewBindingPropertyValuesByName(String propertyName, Iterable<String> propertyValues);

  /**
   * Sets the newly current value(s) on some configuration property.
   */
  void addNewConfigurationPropertyValuesByName(
      String propertyName, Iterable<String> propertyValues);

  /**
   * Adds a public resource (such as a html, css, or png file).
   */
  void addPublicResource(Resource publicResource);

  /**
   * Marks a generator as having been executed for this library and all sub libraries.
   */
  void addRanGeneratorName(String generatorName);

  /**
   * Returns the map of binding property names to newly legal values.
   */
  Multimap<String, String> getNewBindingPropertyValuesByName();

  /**
   * Returns a map of configuration property names to newly set value(s).
   */
  Multimap<String, String> getNewConfigurationPropertyValuesByName();

  /**
   * Returns a handle to the permutation result object that was constructed as part of the
   * compilation for this library.
   */
  PersistenceBackedObject<PermutationResult> getPermutationResultHandle();

  /**
   * Returns the set of names of types which are the subject of GWT.create() calls in source code
   * for this library.
   */
  Set<String> getReboundTypeNames();

  /**
   * Records the library name.<br />
   *
   * Library names are the way that libraries reference one another as dependencies and should be
   * unique within the build tree.
   */
  void setLibraryName(String libraryName);

  /**
   * Records the set of names of types which are the subject of GWT.create() calls in source code
   * for this library.
   */
  void setReboundTypeNames(Set<String> reboundTypeNames);

  /**
   * Finishes writing all library contents and closes the library.
   */
  void write();
}
