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

{template .CommentHtml}
  {@param commentFiles: ?}
  {@param commentCount: ?}
  {@param email: ?}
  {@param labels: ?}
  {@param patchSet: ?}
  {@param patchSetCommentBlocks: ?}
  {let $commentHeaderStyle kind="css"}
    margin-bottom: 4px;
  {/let}

  {let $blockquoteStyle kind="css"}
    border-left: 1px solid #aaa;
    margin: 10px 0;
    padding: 0 10px;
  {/let}

  {let $ulStyle kind="css"}
    list-style: none;
    padding: 0;
  {/let}

  {let $fileLiStyle kind="css"}
    margin: 0;
    padding: 0;
  {/let}

  {let $commentLiStyle kind="css"}
    margin: 0;
    padding: 0 0 0 16px;
  {/let}

  {let $voteStyle kind="css"}
    border-radius: 3px;
    display: inline-block;
    margin: 0 2px;
    padding: 4px;
  {/let}

  {let $positiveVoteStyle kind="css"}
    {$voteStyle}
    background-color: #d4ffd4;
  {/let}

  {let $negativeVoteStyle kind="css"}
    {$voteStyle}
    background-color: #ffd4d4;
  {/let}

  {let $neutralVoteStyle kind="css"}
    {$voteStyle}
    background-color: #ddd;
  {/let}

  {if $patchSetCommentBlocks}
    {call .WikiFormat}{param content: $patchSetCommentBlocks /}{/call}
  {/if}

  {if length($labels) > 0}
    <p>
      Patch set {$patchSet.patchSetId}:
      {for $label in $labels}
        {if $label.value > 0}
          <span style="{$positiveVoteStyle}">
            {$label.label}{sp}+{$label.value}
          </span>
        {elseif $label.value < 0}
          <span style="{$negativeVoteStyle}">
            {$label.label}{sp}{$label.value}
          </span>
        {else}
          <span style="{$neutralVoteStyle}">
            -{$label.label}
          </span>
        {/if}
      {/for}
    </p>
  {/if}

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

  {if $commentCount == 1}
    <p>1 comment:</p>
  {elseif $commentCount > 1}
    <p>{$commentCount} comments:</p>
  {/if}

  <ul style="{$ulStyle}">
    {for $group in $commentFiles}
      <li style="{$fileLiStyle}">
        <p>
          {$group.title}:
        </p>

        <ul style="{$ulStyle}">
          {for $comment in $group.comments}
            <li style="{$commentLiStyle}">
              {if $comment.isRobotComment}
                <p style="{$commentHeaderStyle}">
                  Robot Comment from{sp}
                  {if $comment.robotUrl}<a href="{$comment.robotUrl}">{/if}
                  {$comment.robotId}
                  {if $comment.robotUrl}</a>{/if}{sp}
                  (run ID {$comment.robotRunId}):
                </p>
              {/if}

              <p style="{$commentHeaderStyle}">
                <a href="{$comment.link}">
                  {if $comment.startLine == 0}
                    Patch Set #{$group.patchSetId}:
                  {else}
                    Patch Set #{$group.patchSetId},{sp}
                    Line {$comment.startLine}:
                  {/if}
                </a>{sp}
                {if length($comment.lines) == 1}
                  <code style="font-family:monospace,monospace">
                    {$comment.lines[0]}
                  </code>
                {/if}
              </p>

              {if length($comment.lines) > 1}
                <p>
                  <blockquote style="{$blockquoteStyle}">
                    {call .Pre}{param content kind="html"}
                      {for $line in $comment.lines}
                        {$line}{\n}
                      {/for}
                    {/param}{/call}
                  </blockquote>
                </p>
              {/if}

              {if $comment.parentMessage}
                <p>
                  <blockquote style="{$blockquoteStyle}">
                    {$comment.parentMessage}
                  </blockquote>
                </p>
              {/if}

              {call .WikiFormat}{param content: $comment.messageBlocks /}{/call}
            </li>
          {/for}
        </ul>
      </li>
    {/for}
  </ul>
{/template}
