// Copyright (C) 2013 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.groups;

import com.google.gerrit.client.VoidResult;
import com.google.gerrit.client.account.AccountInfo;
import com.google.gerrit.client.rpc.NativeString;
import com.google.gerrit.client.rpc.Natives;
import com.google.gerrit.client.rpc.RestApi;
import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.JsArray;
import com.google.gwt.user.client.rpc.AsyncCallback;

import java.util.Set;

/**
 * A collection of static methods which work on the Gerrit REST API for specific
 * groups.
 */
public class GroupApi {
  /** Create a new group */
  public static void createGroup(String groupName, AsyncCallback<GroupInfo> cb) {
    JavaScriptObject in = JavaScriptObject.createObject();
    new RestApi("/groups/").id(groupName).ifNoneMatch().put(in, cb);
  }

  public static void getGroupDetail(String group, AsyncCallback<GroupInfo> cb) {
    group(group).view("detail").get(cb);
  }

  /** Get the name of a group */
  public static void getGroupName(AccountGroup.UUID group,
      AsyncCallback<NativeString> cb) {
    group(group).view("name").get(cb);
  }

  /** Check if the current user is owner of a group */
  public static void isGroupOwner(String groupName, final AsyncCallback<Boolean> cb) {
    GroupMap.myOwned(groupName, new AsyncCallback<GroupMap>() {
      @Override
      public void onSuccess(GroupMap result) {
        cb.onSuccess(!result.isEmpty());
      }
      @Override
      public void onFailure(Throwable caught) {
        cb.onFailure(caught);
      }
    });
  }

  /** Rename a group */
  public static void renameGroup(AccountGroup.UUID group,
      String newName, AsyncCallback<VoidResult> cb) {
    GroupInput in = GroupInput.create();
    in.name(newName);
    group(group).view("name").put(in, cb);
  }

  /** Set description for a group */
  public static void setGroupDescription(AccountGroup.UUID group,
      String description, AsyncCallback<VoidResult> cb) {
    RestApi call = group(group).view("description");
    if (description != null && !description.isEmpty()) {
      GroupInput in = GroupInput.create();
      in.description(description);
      call.put(in, cb);
    } else {
      call.delete(cb);
    }
  }

  /** Set owner for a group */
  public static void setGroupOwner(AccountGroup.UUID group,
      String owner, AsyncCallback<GroupInfo> cb) {
    GroupInput in = GroupInput.create();
    in.owner(owner);
    group(group).view("owner").put(in, cb);
  }

  /** Set the options for a group */
  public static void setGroupOptions(AccountGroup.UUID group,
      boolean isVisibleToAll, AsyncCallback<VoidResult> cb) {
    GroupOptionsInput in = GroupOptionsInput.create();
    in.visibleToAll(isVisibleToAll);
    group(group).view("options").put(in, cb);
  }

  /** Add member to a group. */
  public static void addMember(AccountGroup.UUID group, String member,
      AsyncCallback<AccountInfo> cb) {
    members(group).id(member).put(cb);
  }

  /** Add members to a group. */
  public static void addMembers(AccountGroup.UUID group,
      Set<String> members,
      final AsyncCallback<JsArray<AccountInfo>> cb) {
    if (members.size() == 1) {
      addMember(group,
          members.iterator().next(),
          new AsyncCallback<AccountInfo>() {
            @Override
            public void onSuccess(AccountInfo result) {
              cb.onSuccess(Natives.arrayOf(result));
            }

            @Override
            public void onFailure(Throwable caught) {
              cb.onFailure(caught);
            }
          });
    } else {
      MemberInput input = MemberInput.create();
      for (String member : members) {
        input.add_member(member);
      }
      members(group).post(input, cb);
    }
  }

  /** Remove members from a group. */
  public static void removeMembers(AccountGroup.UUID group,
      Set<Integer> ids, final AsyncCallback<VoidResult> cb) {
    if (ids.size() == 1) {
      members(group).id(ids.iterator().next().toString()).delete(cb);
    } else {
      MemberInput in = MemberInput.create();
      for (Integer id : ids) {
        in.add_member(id.toString());
      }
      group(group).view("members.delete").post(in, cb);
    }
  }

  /** Include a group into a group. */
  public static void addIncludedGroup(AccountGroup.UUID group, String include,
      AsyncCallback<GroupInfo> cb) {
    groups(group).id(include).put(cb);
  }

  /** Include groups into a group. */
  public static void addIncludedGroups(AccountGroup.UUID group,
      Set<String> includedGroups,
      final AsyncCallback<JsArray<GroupInfo>> cb) {
    if (includedGroups.size() == 1) {
      addIncludedGroup(group,
          includedGroups.iterator().next(),
          new AsyncCallback<GroupInfo>() {
            @Override
            public void onSuccess(GroupInfo result) {
              cb.onSuccess(Natives.arrayOf(result));
            }

            @Override
            public void onFailure(Throwable caught) {
              cb.onFailure(caught);
            }
          });
    } else {
      IncludedGroupInput input = IncludedGroupInput.create();
      for (String includedGroup : includedGroups) {
        input.add_group(includedGroup);
      }
      groups(group).post(input, cb);
    }
  }

  /** Remove included groups from a group. */
  public static void removeIncludedGroups(AccountGroup.UUID group,
      Set<AccountGroup.UUID> ids, final AsyncCallback<VoidResult> cb) {
    if (ids.size() == 1) {
      AccountGroup.UUID g = ids.iterator().next();
      groups(group).id(g.get()).delete(cb);
    } else {
      IncludedGroupInput in = IncludedGroupInput.create();
      for (AccountGroup.UUID g : ids) {
        in.add_group(g.get());
      }
      group(group).view("groups.delete").post(in, cb);
    }
  }

  private static RestApi members(AccountGroup.UUID group) {
    return group(group).view("members");
  }

  private static RestApi groups(AccountGroup.UUID group) {
    return group(group).view("groups");
  }

  private static RestApi group(AccountGroup.UUID group) {
    return group(group.get());
  }

  private static RestApi group(String group) {
    return new RestApi("/groups/").id(group);
  }

  private static class GroupInput extends JavaScriptObject {
    final native void description(String d) /*-{ if(d)this.description=d; }-*/;
    final native void name(String n) /*-{ if(n)this.name=n; }-*/;
    final native void owner(String o) /*-{ if(o)this.owner=o; }-*/;

    static GroupInput create() {
      return (GroupInput) createObject();
    }

    protected GroupInput() {
    }
  }

  private static class GroupOptionsInput extends JavaScriptObject {
    final native void visibleToAll(boolean v) /*-{ if(v)this.visible_to_all=v; }-*/;

    static GroupOptionsInput create() {
      return (GroupOptionsInput) createObject();
    }

    protected GroupOptionsInput() {
    }
  }

  private static class MemberInput extends JavaScriptObject {
    final native void init() /*-{ this.members = []; }-*/;
    final native void add_member(String n) /*-{ this.members.push(n); }-*/;

    static MemberInput create() {
      MemberInput m = (MemberInput) createObject();
      m.init();
      return m;
    }

    protected MemberInput() {
    }
  }

  private static class IncludedGroupInput extends JavaScriptObject {
    final native void init() /*-{ this.groups = []; }-*/;
    final native void add_group(String n) /*-{ this.groups.push(n); }-*/;

    static IncludedGroupInput create() {
      IncludedGroupInput g = (IncludedGroupInput) createObject();
      g.init();
      return g;
    }

    protected IncludedGroupInput() {
    }
  }
}
