/**
 * 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}

/**
 * The .Comment template will determine the contents of the email related to a
 * user submitting comments on changes.
 * @param change
 * @param coverLetter
 * @param email
 * @param fromName
 * @param commentFiles
 */
{template .Comment kind="text"}
  {$fromName} has posted comments on this change.
  {if $email.changeUrl} ( {$email.changeUrl} ){/if}{\n}
  {\n}
  Change subject: {$change.subject}{\n}
  ......................................................................{\n}
  {if $coverLetter}
    {\n}
    {\n}
    {$coverLetter}{\n}
    {\n}
  {/if}

  {for $group in $commentFiles}
    // Insert a space before the newline so that Gmail does not mistakenly link
    // the following line with the file link. See issue 9201.
    {$group.link}{sp}{\n}
    {$group.title}:{\n}
    {\n}

    {for $comment in $group.comments}
      {if $comment.isRobotComment}
        Robot Comment from {$comment.robotId} (run ID {$comment.robotRunId}):
        {\n}
      {/if}

      {for $line in $comment.lines}
        {if isFirst($line)}
          {if $comment.startLine != 0}
            {$comment.link}
          {/if}

          // Insert a space before the newline so that Gmail does not mistakenly
          // link the following line with the file link. See issue 9201.
          {sp}{\n}

          {$comment.linePrefix}
        {else}
          {$comment.linePrefixEmpty}
        {/if}
        {$line}{\n}
      {/for}
      {if length($comment.lines) == 0}
        {$comment.linePrefix}{\n}
      {/if}

      {if $comment.parentMessage}
        >{sp}{$comment.parentMessage}{\n}
      {/if}
      {$comment.message}{\n}
      {\n}
      {\n}
    {/for}
  {/for}
  {\n}
{/template}
