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

import com.google.gerrit.client.Gerrit;
import com.google.gerrit.client.auth.openid.OpenIdSignInDialog;
import com.google.gerrit.client.auth.openid.OpenIdUtil;
import com.google.gerrit.client.rpc.GerritCallback;
import com.google.gerrit.client.rpc.ScreenLoadCallback;
import com.google.gerrit.client.ui.FancyFlexTable;
import com.google.gerrit.common.auth.SignInMode;
import com.google.gerrit.common.auth.openid.OpenIdUrls;
import com.google.gerrit.reviewdb.AccountExternalId;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter;

import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class MyIdentitiesScreen extends SettingsScreen {
  private IdTable identites;
  private Button deleteIdentity;

  @Override
  protected void onInitUI() {
    super.onInitUI();

    identites = new IdTable();
    add(identites);

    deleteIdentity = new Button(Util.C.buttonDeleteIdentity());
    deleteIdentity.setEnabled(false);
    deleteIdentity.addClickHandler(new ClickHandler() {
      @Override
      public void onClick(final ClickEvent event) {
        identites.deleteChecked();
      }
    });
    add(deleteIdentity);

    switch (Gerrit.getConfig().getAuthType()) {
      case OPENID: {
        final Button linkIdentity = new Button(Util.C.buttonLinkIdentity());
        linkIdentity.addClickHandler(new ClickHandler() {
          @Override
          public void onClick(final ClickEvent event) {
            final String to = History.getToken();
            new OpenIdSignInDialog(SignInMode.LINK_IDENTIY, to, null).center();
          }
        });
        add(linkIdentity);
        break;
      }
    }
  }

  @Override
  protected void onLoad() {
    super.onLoad();
    Util.ACCOUNT_SEC
        .myExternalIds(new ScreenLoadCallback<List<AccountExternalId>>(this) {
          public void preDisplay(final List<AccountExternalId> result) {
            identites.display(result);
          }
        });
  }

  private class IdTable extends FancyFlexTable<AccountExternalId> {
    private ValueChangeHandler<Boolean> updateDeleteHandler;

    IdTable() {
      table.setWidth("");
      table.setText(0, 2, Util.C.webIdStatus());
      table.setText(0, 3, Util.C.webIdEmail());
      table.setText(0, 4, Util.C.webIdIdentity());

      final FlexCellFormatter fmt = table.getFlexCellFormatter();
      fmt.addStyleName(0, 1, Gerrit.RESOURCES.css().iconHeader());
      fmt.addStyleName(0, 2, Gerrit.RESOURCES.css().dataHeader());
      fmt.addStyleName(0, 3, Gerrit.RESOURCES.css().dataHeader());
      fmt.addStyleName(0, 4, Gerrit.RESOURCES.css().dataHeader());

      updateDeleteHandler = new ValueChangeHandler<Boolean>() {
        @Override
        public void onValueChange(ValueChangeEvent<Boolean> event) {
          updateDeleteButton();
        }
      };
    }

    void deleteChecked() {
      final HashSet<AccountExternalId.Key> keys =
          new HashSet<AccountExternalId.Key>();
      for (int row = 1; row < table.getRowCount(); row++) {
        final AccountExternalId k = getRowItem(row);
        if (k == null) {
          continue;
        }
        final CheckBox cb = (CheckBox) table.getWidget(row, 1);
        if (cb == null) {
          continue;
        }
        if (cb.getValue()) {
          keys.add(k.getKey());
        }
      }
      if (keys.isEmpty()) {
        updateDeleteButton();
      } else {
        deleteIdentity.setEnabled(false);
        Util.ACCOUNT_SEC.deleteExternalIds(keys,
            new GerritCallback<Set<AccountExternalId.Key>>() {
              public void onSuccess(final Set<AccountExternalId.Key> removed) {
                for (int row = 1; row < table.getRowCount();) {
                  final AccountExternalId k = getRowItem(row);
                  if (k != null && removed.contains(k.getKey())) {
                    table.removeRow(row);
                  } else {
                    row++;
                  }
                }
                updateDeleteButton();
              }

              @Override
              public void onFailure(Throwable caught) {
                updateDeleteButton();
                super.onFailure(caught);
              }
            });
      }
    }

    void updateDeleteButton() {
      int off = 0;
      boolean on = false;
      for (int row = 1; row < table.getRowCount(); row++) {
        if (table.getWidget(row, 1) == null) {
          off++;
        } else {
          CheckBox sel = (CheckBox) table.getWidget(row, 1);
          if (sel.getValue()) {
            on = true;
            break;
          }
        }
      }
      deleteIdentity.setVisible(off < table.getRowCount() - 1);
      deleteIdentity.setEnabled(on);
    }

    void display(final List<AccountExternalId> result) {
      Collections.sort(result, new Comparator<AccountExternalId>() {
        @Override
        public int compare(AccountExternalId a, AccountExternalId b) {
          return emailOf(a).compareTo(emailOf(b));
        }

        private String emailOf(final AccountExternalId a) {
          return a.getEmailAddress() != null ? a.getEmailAddress() : "";
        }
      });

      while (1 < table.getRowCount())
        table.removeRow(table.getRowCount() - 1);

      for (final AccountExternalId k : result) {
        addOneId(k);
      }
      updateDeleteButton();
    }

    void addOneId(final AccountExternalId k) {
      if (k.isScheme(AccountExternalId.SCHEME_USERNAME)) {
        // Don't display the username as an identity here.
        return;
      }

      final FlexCellFormatter fmt = table.getFlexCellFormatter();
      final int row = table.getRowCount();
      table.insertRow(row);
      applyDataRowStyle(row);

      if (k.canDelete()) {
        final CheckBox sel = new CheckBox();
        sel.addValueChangeHandler(updateDeleteHandler);
        table.setWidget(row, 1, sel);
      } else {
        table.setText(row, 1, "");
      }
      if (k.isTrusted()) {
        table.setText(row, 2, "");
      } else {
        table.setText(row, 2, Util.C.untrustedProvider());
        fmt.addStyleName(row, 2, Gerrit.RESOURCES.css()
            .identityUntrustedExternalId());
      }
      if (k.getEmailAddress() != null && k.getEmailAddress().length() > 0) {
        table.setText(row, 3, k.getEmailAddress());
      } else {
        table.setText(row, 3, "");
      }
      table.setText(row, 4, describe(k));

      fmt.addStyleName(row, 1, Gerrit.RESOURCES.css().iconCell());
      fmt.addStyleName(row, 2, Gerrit.RESOURCES.css().dataCell());
      fmt.addStyleName(row, 3, Gerrit.RESOURCES.css().dataCell());
      fmt.addStyleName(row, 4, Gerrit.RESOURCES.css().dataCell());

      setRowItem(row, k);
    }

    private String describe(final AccountExternalId k) {
      if (k.isScheme(AccountExternalId.SCHEME_GERRIT)) {
        // A local user identity should just be itself.
        //
        return k.getSchemeRest();

      } else if (k.isScheme(AccountExternalId.SCHEME_USERNAME)) {
        // A local user identity should just be itself.
        //
        return k.getSchemeRest();

      } else if (k.isScheme(AccountExternalId.SCHEME_MAILTO)) {
        // Describe a mailto address as just its email address, which
        // is already shown in the email address field.
        //
        return "";

      } else if (k.isScheme(OpenIdUrls.URL_GOOGLE)) {
        return OpenIdUtil.C.nameGoogle();

      } else if (k.isScheme(OpenIdUrls.URL_YAHOO)) {
        return OpenIdUtil.C.nameYahoo();

      } else if (k.isScheme(AccountExternalId.LEGACY_GAE)) {
        return OpenIdUtil.C.nameGoogle() + " (Imported from Google AppEngine)";

      } else {
        return k.getExternalId();
      }
    }
  }
}
