// Copyright (C) 2008 The Android Open Source Project
//
// 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.gerrit.client.rpc;

import com.google.gerrit.client.Gerrit;
import com.google.gerrit.client.data.AccountCache;
import com.google.gerrit.client.data.GerritConfig;
import com.google.gerrit.client.data.GroupCache;
import com.google.gerrit.client.data.ProjectCache;
import com.google.gerrit.client.reviewdb.Account;
import com.google.gerrit.client.reviewdb.ReviewDb;
import com.google.gwt.core.client.GWT;
import com.google.gwtorm.client.SchemaFactory;

public class Common {
  public static final RpcConstants C;
  private static GerritConfig config;
  private static SchemaFactory<ReviewDb> schema;
  private static AccountCache accountCache;
  private static GroupCache groupCache;
  private static ProjectCache projectCache;
  private static CurrentAccountImpl caImpl;

  static {
    if (GWT.isClient()) {
      C = GWT.create(RpcConstants.class);
      caImpl = new CurrentAccountImpl() {
        public Account.Id getAccountId() {
          final Account a = Gerrit.getUserAccount();
          return a != null ? a.getId() : null;
        }
      };
    } else {
      C = null;
    }
  }

  /** Get the public configuration data used by this Gerrit instance. */
  public static GerritConfig getGerritConfig() {
    return config;
  }

  public static void setGerritConfig(final GerritConfig imp) {
    config = imp;
  }

  /**
   * Get the active AccountCache instance.
   * <p>
   * <b>Note: this is likely only available on the server side.</b>
   */
  public static AccountCache getAccountCache() {
    return accountCache;
  }

  public static void setAccountCache(final AccountCache imp) {
    accountCache = imp;
  }

  /**
   * Get the active GroupCache instance.
   * <p>
   * <b>Note: this is likely only available on the server side.</b>
   */
  public static GroupCache getGroupCache() {
    return groupCache;
  }

  public static void setGroupCache(final GroupCache imp) {
    groupCache = imp;
  }

  /**
   * Get the active ProjectCache instance.
   * <p>
   * <b>Note: this is likely only available on the server side.</b>
   */
  public static ProjectCache getProjectCache() {
    return projectCache;
  }

  public static void setProjectCache(final ProjectCache imp) {
    projectCache = imp;
  }

  /**
   * Get the schema factory for this instance.
   * <p>
   * <b>Note: this is likely only available on the server side.</b>
   */
  public static SchemaFactory<ReviewDb> getSchemaFactory() {
    return schema;
  }

  public static void setSchemaFactory(final SchemaFactory<ReviewDb> imp) {
    schema = imp;
  }

  /** Get the unique id for this account; null if there is no account. */
  public static Account.Id getAccountId() {
    return caImpl.getAccountId();
  }

  public static void setCurrentAccountImpl(final CurrentAccountImpl i) {
    caImpl = i;
  }

  public interface CurrentAccountImpl {
    /** Get the unique id for this account; null if there is no account. */
    public Account.Id getAccountId();
  }
}
