// Copyright (C) 2015 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.server.mail.send;

import com.google.common.base.Joiner;
import com.google.gerrit.exceptions.EmailException;
import com.google.gerrit.extensions.api.changes.RecipientType;
import com.google.gerrit.mail.Address;
import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.account.AccountSshKey;
import com.google.inject.assistedinject.Assisted;
import com.google.inject.assistedinject.AssistedInject;
import java.util.List;

public class AddKeySender extends OutgoingEmail {
  public interface Factory {
    AddKeySender create(IdentifiedUser user, AccountSshKey sshKey);

    AddKeySender create(IdentifiedUser user, List<String> gpgKey);
  }

  private final IdentifiedUser user;
  private final AccountSshKey sshKey;
  private final List<String> gpgKeys;

  @AssistedInject
  public AddKeySender(
      EmailArguments args, @Assisted IdentifiedUser user, @Assisted AccountSshKey sshKey) {
    super(args, "addkey");
    this.user = user;
    this.sshKey = sshKey;
    this.gpgKeys = null;
  }

  @AssistedInject
  public AddKeySender(
      EmailArguments args, @Assisted IdentifiedUser user, @Assisted List<String> gpgKeys) {
    super(args, "addkey");
    this.user = user;
    this.sshKey = null;
    this.gpgKeys = gpgKeys;
  }

  @Override
  protected void init() throws EmailException {
    super.init();
    setHeader("Subject", String.format("[Gerrit Code Review] New %s Keys Added", getKeyType()));
    add(RecipientType.TO, new Address(getEmail()));
  }

  @Override
  protected boolean shouldSendMessage() {
    if (sshKey == null && (gpgKeys == null || gpgKeys.isEmpty())) {
      // Don't email if no keys were added.
      return false;
    }

    return true;
  }

  @Override
  protected void format() throws EmailException {
    appendText(textTemplate("AddKey"));
    if (useHtml()) {
      appendHtml(soyHtmlTemplate("AddKeyHtml"));
    }
  }

  public String getEmail() {
    return user.getAccount().preferredEmail();
  }

  public String getUserNameEmail() {
    return getUserNameEmailFor(user.getAccountId());
  }

  public String getKeyType() {
    if (sshKey != null) {
      return "SSH";
    } else if (gpgKeys != null) {
      return "GPG";
    }
    return "Unknown";
  }

  public String getSshKey() {
    return (sshKey != null) ? sshKey.sshPublicKey() + "\n" : null;
  }

  public String getGpgKeys() {
    if (gpgKeys != null) {
      return Joiner.on("\n").join(gpgKeys);
    }
    return null;
  }

  @Override
  protected void setupSoyContext() {
    super.setupSoyContext();
    soyContextEmailData.put("email", getEmail());
    soyContextEmailData.put("gpgKeys", getGpgKeys());
    soyContextEmailData.put("keyType", getKeyType());
    soyContextEmailData.put("sshKey", getSshKey());
    soyContextEmailData.put("userNameEmail", getUserNameEmail());
  }

  @Override
  protected boolean supportsHtml() {
    return true;
  }
}

@@ -2519,80 +2519,451 @@
 %0A%0A  
-public String getEmail() %7B%0A    return user.getAccount().preferredEmail()
+@Override%0A  protected void setupSoyContext() %7B%0A    super.setupSoyContext();%0A    soyContextEmailData.put(%22email%22, getEmail());%0A    soyContextEmailData.put(%22gpgKeys%22, getGpgKeys());%0A    soyContextEmailData.put(%22keyType%22, getKeyType());%0A    soyContextEmailData.put(%22sshKey%22, getSshKey());%0A    soyContextEmailData.put(%22userNameEmail%22, getUserNameEmailFor(user.getAccountId()));%0A  %7D%0A%0A  @Override%0A  protected boolean supportsHtml() %7B%0A    return true
 ;%0A  
@@ -2960,37 +2960,38 @@
 n true;%0A  %7D%0A%0A  p
-ublic
+rivate
  String getUserN
@@ -2981,32 +2981,24 @@
 e String get
-UserName
 Email() %7B%0A  
@@ -3010,47 +3010,41 @@
 urn 
-getUserNameEmailFor(user.getAccountId()
+user.getAccount().preferredEmail(
 );%0A 
@@ -3042,37 +3042,38 @@
 mail();%0A  %7D%0A%0A  p
-ublic
+rivate
  String getKeyTy
@@ -3207,37 +3207,38 @@
 known%22;%0A  %7D%0A%0A  p
-ublic
+rivate
  String getSshKe
@@ -3318,21 +3318,22 @@
   %7D%0A%0A  p
-ublic
+rivate
  String 
@@ -3448,437 +3448,7 @@
 %0A  %7D
-%0A%0A  @Override%0A  protected void setupSoyContext() %7B%0A    super.setupSoyContext();%0A    soyContextEmailData.put(%22email%22, getEmail());%0A    soyContextEmailData.put(%22gpgKeys%22, getGpgKeys());%0A    soyContextEmailData.put(%22keyType%22, getKeyType());%0A    soyContextEmailData.put(%22sshKey%22, getSshKey());%0A    soyContextEmailData.put(%22userNameEmail%22, getUserNameEmail());%0A  %7D%0A%0A  @Override%0A  protected boolean supportsHtml() %7B%0A    return true;%0A  %7D
 %0A%7D%0A

Make all methods private which are only within the class