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

/**
 * @param commentFiles
 * @param commentCount
 * @param email
 * @param fromName
 * @param labels
 * @param patchSet
 * @param patchSetCommentBlocks
 */
{template .CommentHtml autoescape="strict" kind="html"}
  {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-left: 20px;
  {/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}

  <p>
    {$fromName} <strong>posted comments</strong> on this change.
  </p>

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

  <p>
    Patch set {$patchSet.patchSetId}:
    {foreach $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}
    {/foreach}
  </p>

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

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

  <ul style="{$ulStyle}">
    {foreach $group in $commentFiles}
      <li>
        <p>
          <a href="{$group.link}">{$group.title}:</a>
        </p>

        <ul style="{$ulStyle}">
          {foreach $comment in $group.comments}
            <li>
              {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"}
                      {foreach $line in $comment.lines}
                        {$line}{\n}
                      {/foreach}
                    {/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>
          {/foreach}
        </ul>
      </li>
    {/foreach}
  </ul>
{/template}
