// 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.reviewdb.client;

import com.google.gerrit.extensions.client.InheritableBoolean;
import com.google.gerrit.extensions.client.ProjectState;
import com.google.gerrit.extensions.client.SubmitType;
import com.google.gwtorm.client.Column;
import com.google.gwtorm.client.StringKey;

/** Projects match a source code repository managed by Gerrit */
public final class Project {
  /** Project name key */
  public static class NameKey extends StringKey<com.google.gwtorm.client.Key<?>> {
    private static final long serialVersionUID = 1L;

    @Column(id = 1)
    protected String name;

    protected NameKey() {}

    public NameKey(String n) {
      name = n;
    }

    @Override
    public String get() {
      return name;
    }

    @Override
    protected void set(String newValue) {
      name = newValue;
    }

    @Override
    public int hashCode() {
      return get().hashCode();
    }

    @Override
    public boolean equals(Object b) {
      if (b instanceof NameKey) {
        return get().equals(((NameKey) b).get());
      }
      return false;
    }

    /** Parse a Project.NameKey out of a string representation. */
    public static NameKey parse(String str) {
      final NameKey r = new NameKey();
      r.fromString(str);
      return r;
    }

    public static String asStringOrNull(NameKey key) {
      return key == null ? null : key.get();
    }
  }

  protected NameKey name;

  protected String description;

  protected InheritableBoolean useContributorAgreements;

  protected InheritableBoolean useSignedOffBy;

  protected SubmitType submitType;

  protected ProjectState state;

  protected NameKey parent;

  protected InheritableBoolean requireChangeID;

  protected String maxObjectSizeLimit;

  protected InheritableBoolean useContentMerge;

  protected String defaultDashboardId;

  protected String localDefaultDashboardId;

  protected String themeName;

  protected InheritableBoolean createNewChangeForAllNotInTarget;

  protected InheritableBoolean enableSignedPush;
  protected InheritableBoolean requireSignedPush;

  protected InheritableBoolean rejectImplicitMerges;
  protected InheritableBoolean privateByDefault;
  protected InheritableBoolean workInProgressByDefault;

  protected InheritableBoolean enableReviewerByEmail;

  protected InheritableBoolean matchAuthorToCommitterDate;

  protected Project() {}

  public Project(Project.NameKey nameKey) {
    name = nameKey;
    submitType = SubmitType.MERGE_IF_NECESSARY;
    state = ProjectState.ACTIVE;
    useContributorAgreements = InheritableBoolean.INHERIT;
    useSignedOffBy = InheritableBoolean.INHERIT;
    requireChangeID = InheritableBoolean.INHERIT;
    useContentMerge = InheritableBoolean.INHERIT;
    createNewChangeForAllNotInTarget = InheritableBoolean.INHERIT;
    enableSignedPush = InheritableBoolean.INHERIT;
    requireSignedPush = InheritableBoolean.INHERIT;
    privateByDefault = InheritableBoolean.INHERIT;
    workInProgressByDefault = InheritableBoolean.INHERIT;
    enableReviewerByEmail = InheritableBoolean.INHERIT;
    matchAuthorToCommitterDate = InheritableBoolean.INHERIT;
  }

  public Project.NameKey getNameKey() {
    return name;
  }

  public String getName() {
    return name != null ? name.get() : null;
  }

  public String getDescription() {
    return description;
  }

  public void setDescription(String d) {
    description = d;
  }

  public InheritableBoolean getUseContributorAgreements() {
    return useContributorAgreements;
  }

  public InheritableBoolean getUseSignedOffBy() {
    return useSignedOffBy;
  }

  public InheritableBoolean getUseContentMerge() {
    return useContentMerge;
  }

  public InheritableBoolean getRequireChangeID() {
    return requireChangeID;
  }

  public String getMaxObjectSizeLimit() {
    return maxObjectSizeLimit;
  }

  public InheritableBoolean getRejectImplicitMerges() {
    return rejectImplicitMerges;
  }

  public InheritableBoolean getPrivateByDefault() {
    return privateByDefault;
  }

  public void setPrivateByDefault(InheritableBoolean privateByDefault) {
    this.privateByDefault = privateByDefault;
  }

  public InheritableBoolean getWorkInProgressByDefault() {
    return workInProgressByDefault;
  }

  public void setWorkInProgressByDefault(InheritableBoolean workInProgressByDefault) {
    this.workInProgressByDefault = workInProgressByDefault;
  }

  public InheritableBoolean getEnableReviewerByEmail() {
    return enableReviewerByEmail;
  }

  public void setEnableReviewerByEmail(InheritableBoolean enable) {
    enableReviewerByEmail = enable;
  }

  public InheritableBoolean getMatchAuthorToCommitterDate() {
    return matchAuthorToCommitterDate;
  }

  public void setMatchAuthorToCommitterDate(InheritableBoolean match) {
    matchAuthorToCommitterDate = match;
  }

  public void setUseContributorAgreements(InheritableBoolean u) {
    useContributorAgreements = u;
  }

  public void setUseSignedOffBy(InheritableBoolean sbo) {
    useSignedOffBy = sbo;
  }

  public void setUseContentMerge(InheritableBoolean cm) {
    useContentMerge = cm;
  }

  public void setRequireChangeID(InheritableBoolean cid) {
    requireChangeID = cid;
  }

  public InheritableBoolean getCreateNewChangeForAllNotInTarget() {
    return createNewChangeForAllNotInTarget;
  }

  public void setCreateNewChangeForAllNotInTarget(InheritableBoolean useAllNotInTarget) {
    this.createNewChangeForAllNotInTarget = useAllNotInTarget;
  }

  public InheritableBoolean getEnableSignedPush() {
    return enableSignedPush;
  }

  public void setEnableSignedPush(InheritableBoolean enable) {
    enableSignedPush = enable;
  }

  public InheritableBoolean getRequireSignedPush() {
    return requireSignedPush;
  }

  public void setRequireSignedPush(InheritableBoolean require) {
    requireSignedPush = require;
  }

  public void setMaxObjectSizeLimit(String limit) {
    maxObjectSizeLimit = limit;
  }

  public void setRejectImplicitMerges(InheritableBoolean check) {
    rejectImplicitMerges = check;
  }

  public SubmitType getSubmitType() {
    return submitType;
  }

  public void setSubmitType(SubmitType type) {
    submitType = type;
  }

  public ProjectState getState() {
    return state;
  }

  public void setState(ProjectState newState) {
    state = newState;
  }

  public String getDefaultDashboard() {
    return defaultDashboardId;
  }

  public void setDefaultDashboard(String defaultDashboardId) {
    this.defaultDashboardId = defaultDashboardId;
  }

  public String getLocalDefaultDashboard() {
    return localDefaultDashboardId;
  }

  public void setLocalDefaultDashboard(String localDefaultDashboardId) {
    this.localDefaultDashboardId = localDefaultDashboardId;
  }

  public String getThemeName() {
    return themeName;
  }

  public void setThemeName(String themeName) {
    this.themeName = themeName;
  }

  public void copySettingsFrom(Project update) {
    description = update.description;
    useContributorAgreements = update.useContributorAgreements;
    useSignedOffBy = update.useSignedOffBy;
    useContentMerge = update.useContentMerge;
    requireChangeID = update.requireChangeID;
    submitType = update.submitType;
    state = update.state;
    maxObjectSizeLimit = update.maxObjectSizeLimit;
    createNewChangeForAllNotInTarget = update.createNewChangeForAllNotInTarget;
  }

  /**
   * Returns the name key of the parent project.
   *
   * @return name key of the parent project, {@code null} if this project is the wild project,
   *     {@code null} or the name key of the wild project if this project is a direct child of the
   *     wild project
   */
  public Project.NameKey getParent() {
    return parent;
  }

  /**
   * Returns the name key of the parent project.
   *
   * @param allProjectsName name key of the wild project
   * @return name key of the parent project, {@code null} if this project is the wild project
   */
  public Project.NameKey getParent(Project.NameKey allProjectsName) {
    if (parent != null) {
      return parent;
    }

    if (name.equals(allProjectsName)) {
      return null;
    }

    return allProjectsName;
  }

  public String getParentName() {
    return parent != null ? parent.get() : null;
  }

  public void setParentName(String n) {
    parent = n != null ? new NameKey(n) : null;
  }

  public void setParentName(NameKey n) {
    parent = n;
  }
}
