// 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.ui;

import com.google.gerrit.client.Gerrit;
import com.google.gerrit.client.changes.Util;
import com.google.gerrit.client.projects.BranchInfo;
import com.google.gerrit.client.projects.ProjectApi;
import com.google.gerrit.client.rpc.GerritCallback;
import com.google.gerrit.client.rpc.Natives;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gwt.core.client.JsArray;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.FocusWidget;
import com.google.gwt.user.client.ui.SuggestBox;
import com.google.gwt.user.client.ui.SuggestOracle.Suggestion;
import com.google.gwtexpui.globalkey.client.GlobalKey;
import com.google.gwtexpui.safehtml.client.HighlightSuggestOracle;

import java.util.LinkedList;
import java.util.List;

public abstract class CherryPickDialog extends ActionDialog {
  private SuggestBox newBranch;
  private List<BranchInfo> branches;

  public CherryPickDialog(final FocusWidget enableOnFailure, Project.NameKey project) {
    super(enableOnFailure, true, Util.C.cherryPickTitle(), Util.C
        .cherryPickCommitMessage());
    ProjectApi.getBranches(project,
        new GerritCallback<JsArray<BranchInfo>>() {
          @Override
          public void onSuccess(JsArray<BranchInfo> result) {
            branches = Natives.asList(result);
          }
        });

    newBranch = new SuggestBox(new HighlightSuggestOracle() {
      @Override
      protected void onRequestSuggestions(Request request, Callback done) {
        LinkedList<BranchSuggestion> suggestions = new LinkedList<>();
        for (final BranchInfo b : branches) {
          if (b.ref().contains(request.getQuery())) {
            suggestions.add(new BranchSuggestion(b));
          }
        }
        done.onSuggestionsReady(request, new Response(suggestions));
      }
    });

    newBranch.setWidth("100%");
    newBranch.getElement().getStyle().setProperty("boxSizing", "border-box");
    message.setCharacterWidth(70);

    final FlowPanel mwrap = new FlowPanel();
    mwrap.setStyleName(Gerrit.RESOURCES.css().commentedActionMessage());
    mwrap.add(newBranch);

    panel.insert(mwrap, 0);
    panel.insert(new SmallHeading(Util.C.headingCherryPickBranch()), 0);
  }

  @Override
  public void center() {
    super.center();
    GlobalKey.dialog(this);
    newBranch.setFocus(true);
  }

  public String getDestinationBranch() {
    return newBranch.getText();
  }

  class BranchSuggestion implements Suggestion {
    private BranchInfo branch;

    public BranchSuggestion(BranchInfo branch) {
      this.branch = branch;
    }

    @Override
    public String getDisplayString() {
      final String refsHeads = "refs/heads/";
      if (branch.ref().startsWith(refsHeads)) {
        return branch.ref().substring(refsHeads.length());
      }
      return branch.ref();
    }

    @Override
    public String getReplacementString() {
      return branch.getShortName();
    }
  }
}
