// 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.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.openid.OpenIdUrls;
import com.google.gerrit.reviewdb.client.AccountExternalId;
import com.google.gerrit.reviewdb.client.AuthType;
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.Window.Location;
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);

    if (Gerrit.getConfig().getAuthType() == AuthType.OPENID
        || Gerrit.getConfig().getAuthType() == AuthType.OAUTH) {
      Button linkIdentity = new Button(Util.C.buttonLinkIdentity());
      linkIdentity.addClickHandler(new ClickHandler() {
        @Override
        public void onClick(final ClickEvent event) {
          Location.assign(Gerrit.loginRedirect(History.getToken()) + "?link");
        }
      });
      add(linkIdentity);
    }
  }

  @Override
  protected void onLoad() {
    super.onLoad();
    Util.ACCOUNT_SEC
        .myExternalIds(new ScreenLoadCallback<List<AccountExternalId>>(this) {
          @Override
          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<>();
      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>>() {
              @Override
              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("https://www.google.com/accounts/o8/id")) {
        return OpenIdUtil.C.nameGoogle();

      } else if (k.isScheme(OpenIdUrls.URL_LAUNCHPAD)) {
        return OpenIdUtil.C.nameLaunchpad();

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

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