/**
 * Copyright (C) 2016 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.
 */

{namespace com.google.gerrit.server.mail.template.NewChangeHtml}

import * as mailTemplate from 'com/google/gerrit/server/mail/Private.soy';

{template NewChangeHtml}
  {@param diffLines: ?}
  {@param email: ?}
  {@param fromName: ?}
  {@param ownerName: ?}
  {@param patchSet: ?}
  {@param projectName: ?}
  <p>
    {if $email.reviewerNames or $email.removedReviewerNames}
      {if $email.reviewerNames}
        {$fromName} would like{sp}
        {for $reviewerName, $index in $email.reviewerNames}
          {if $index > 0}
            {if $index == length($email.reviewerNames) - 1}{sp}and{else},{/if}{sp}
          {/if}
          {$reviewerName}
        {/for}{sp}
        to <strong>review</strong> this change
        {if $fromName != $ownerName}{sp}authored by {$ownerName}{/if}.
        {\n}
      {/if}
      {if $email.removedReviewerNames}
        <p>
          {$fromName}{sp}
          <strong>
            removed{sp}
            {for $reviewerName, $index in $email.removedReviewerNames}
              {if $index > 0}
                {if $index == length($email.removedReviewerNames) - 1}{sp}and{else},{/if}{sp}
              {/if}
              {$reviewerName}
            {/for}
          </strong>{sp}
          from this change.
        </p>
        {\n}
      {/if}
    {else}
      {$ownerName} has uploaded this change for <strong>review</strong>.
    {/if}
  </p>

  {if $email.changeUrl}
    <p>
      {call mailTemplate.ViewChangeButton data="all" /}
    </p>
  {/if}

  {call mailTemplate.Pre}
    {param content: $email.changeDetail /}
  {/call}

  {if $email.sshHost}
    {call mailTemplate.Pre}
      {param content kind="html"}
        git pull ssh:{print '//'}{$email.sshHost}/{$projectName}
        {sp}{$patchSet.refName}
      {/param}
    {/call}
  {/if}

  {if $email.includeDiff}
    {call mailTemplate.UnifiedDiff}
      {param diffLines: $diffLines /}
    {/call}
  {/if}
{/template}
