// Copyright 2012 Google Inc. All Rights Reserved.
//
// 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 gitiles}

/**
 * Detailed listing of a commit.
 */
{template commitDetail}
  {@param author: ?}  /** map with "name", "email", and "time" keys for the commit author. */
  {@param committer: ?}  /** map with "name", "email", and "time" keys for the committer. */
  {@param sha: ?}  /** commit SHA-1. */
  {@param tree: ?}  /** tree SHA-1. */
  {@param treeUrl: ?}  /** tree URL. */
  {@param parents: ?}  /** list of parent objects with the following keys:
      sha: SHA-1.
      url: URL to view the parent commit.
      diffUrl: URL to display diffs relative to this parent.
      blameUrl: optional URL to display blame of a file at this parent.
      */
  {@param message: ?}  /** list of commit message parts, where each part contains:
      text: raw text of the part.
      url: optional URL that should be linked to from the part.
      */
  {@param diffTree: ?}  /** list of changed tree entries with the following keys:
      changeType: string matching an org.eclipse.jgit.diff.DiffEntry.ChangeType constant.
      path: (new) path of the tree entry.
      oldPath: old path, only for renames and copies.
      url: URL to a detail page for the tree entry.
      diffUrl: URL to a diff page for the tree entry's diff in this commit.
      */
  {@param logUrl: ?}  /** URL to a log page starting at this commit. */
  {@param archiveUrl: ?}  /** URL to a download link of this commit as an archive. */
  {@param archiveType: ?}  /** type of the archive to download. */
<div class="u-monospace Metadata">
  <table>
    <tr>
      <th class="Metadata-title">{msg desc="Header for commit SHA entry"}commit{/msg}</th>
      <td>
        {$sha}
      </td>
      <td>
        <span>
          [<a href="{$logUrl}">{msg desc="text for the log link"}log{/msg}</a>]
        </span>
        {sp}<span>[<a href="{$archiveUrl}">{$archiveType}</a>]</span>
      </td>
    </tr>
    <tr>
      <th class="Metadata-title">{msg desc="Header for commit author"}author{/msg}</th>
      <td>
        {call person_ data="$author" /}
      </td>
      <td>{$author.time}</td>
    </tr>
    <tr>
      <th class="Metadata-title">{msg desc="Header for committer"}committer{/msg}</th>
      <td>
        {call person_ data="$committer" /}
      </td>
      <td>{$committer.time}</td>
    </tr>
    <tr>
      <th class="Metadata-title">{msg desc="Header for tree SHA entry"}tree{/msg}</th>
      <td><a href="{$treeUrl}">{$tree}</a></td>
    </tr>
    {for $parent in $parents}
      <tr>
        <th class="Metadata-title">{msg desc="Header for parent SHA"}parent{/msg}</th>
        <td>
          <a href="{$parent.url}">{$parent.sha}</a>
          {sp}<span>
            [<a href="{$parent.diffUrl}">{msg desc="text for the parent diff link"}diff{/msg}</a>]
            {if isNonnull($parent.blameUrl)}
              {sp}[<a href="{$parent.blameUrl}">{msg desc="text for the parent blame link"}blame{/msg}</a>]
            {/if}
          </span>
        </td>
      </tr>
    {/for}
  </table>
</div>
{call message_}
  {param className: 'u-pre u-monospace MetadataMessage' /}
  {param message: $message /}
{/call}

{if $diffTree and length($diffTree)}
  <ul class="DiffTree">
    {for $entry in $diffTree}
      <li>
        <a href="{$entry.url}">{$entry.path}</a>
        {switch $entry.changeType}
          {case 'ADD'}
            <span class="DiffTree-action DiffTree-action--add">
              {msg desc="Text for a new tree entry"}
                [Added - <a href="{$entry.diffUrl}">diff</a>]
              {/msg}
            </span>
          {case 'MODIFY'}
            <span class="DiffTree-action DiffTree-action--modify">
              {msg desc="Text for a modified tree entry"}
                [<a href="{$entry.diffUrl}">diff</a>]
              {/msg}
            </span>
          {case 'DELETE'}
            <span class="DiffTree-action DiffTree-action--delete">
              {msg desc="Text for a deleted tree entry"}
                [Deleted - <a href="{$entry.diffUrl}">diff</a>]
              {/msg}
            </span>
          {case 'RENAME'}
            <span class="DiffTree-action DiffTree-action--rename">
              {msg desc="Text for a renamed tree entry"}
                [Renamed from {$entry.oldPath} - <a href="{$entry.diffUrl}">diff</a>]
              {/msg}
            </span>
          {case 'COPY'}
            <span class="DiffTree-action DiffTree-action--copy">
              {msg desc="Text for a copied tree entry"}
                [Copied from {$entry.oldPath} - <a href="{$entry.diffUrl}">diff</a>]
              {/msg}
            </span>
          {default}
        {/switch}
      </li>
    {/for}
  </ul>
  <div class="DiffSummary">
    {if length($diffTree) == 1}
      {msg desc="1 file changed"}1 file changed{/msg}
    {else}
      {msg desc="number of files changed"}{length($diffTree)} files changed{/msg}
    {/if}
  </div>
{/if}

{/template}

/**
 * Detailed listing of a tree.
 */
{template treeDetail}
  {@param sha: ?}  /** SHA of this path's tree. */
  {@param? logUrl: ?}  /** optional URL to a log for this path. */
  {@param? archiveUrl: ?}  /** optional URL to a download link of this tree as an archive. */
  {@param? archiveType: ?}  /** type of the archive to download, if archiveUrl is set. */
  {@param entries: ?}  /** list of entries with the following keys:
      type: entry type, matching one of the constant names defined in org.eclipse.jgit.lib.FileMode.
      name: tree entry name.
      url: URL to link to.
      targetName: name of a symlink target, required only if type == 'SYMLINK'.
      targetUrl: optional url of a symlink target, required only if type == 'SYMLINK'.
      */
  {@param? readmePath: ?}  /** optional path of the selected README.md file. */
  {@param? readmeHtml: ?}  /** optional rendered README.md contents. */
<div class="TreeDetail">
  <div class="u-sha1 u-monospace TreeDetail-sha1">
    {msg desc="SHA-1 for the path's tree"}tree: {$sha}{/msg}
    {if $logUrl}{sp}[<a href="{$logUrl}">{msg desc="history for a path"}path history{/msg}</a>]{/if}
    {if $archiveUrl}
      {sp}<span>[<a href="{$archiveUrl}">{$archiveType}</a>]</span>
    {/if}
  </div>

  {if length($entries)}
    <ol class="FileList">
      {for $entry in $entries}
        <li class="FileList-item{sp}
              {switch $entry.type}
                {case 'TREE'}FileList-item--gitTree
                {case 'SYMLINK'}FileList-item--symlink
                {case 'REGULAR_FILE'}FileList-item--regularFile
                {case 'EXECUTABLE_FILE'}FileList-item--executableFile
                {case 'GITLINK'}gitlink
                {default}regular-file
              {/switch}
              " title="
              {switch $entry.type}
                {case 'TREE'}{msg desc="Alt text for tree icon"}Tree{/msg}
                {case 'SYMLINK'}{msg desc="Alt text for symlink icon"}Symlink{/msg}
                {case 'REGULAR_FILE'}{msg desc="Alt text for regular file icon"}Regular file{/msg}
                {case 'EXECUTABLE_FILE'}
                  {msg desc="Alt text for executable file icon"}Executable file{/msg}
                {case 'GITLINK'}
                  {msg desc="Alt text for git submodule link icon"}Git submodule link{/msg}
                {default}{msg desc="Alt text for other file icon"}Other{/msg}
              {/switch}
              {sp}- {$entry.name}">
          <a class="FileList-itemLink" href="{$entry.url}">{$entry.name}</a>
          {if $entry.type == 'SYMLINK'}
            {sp}&#x21e8;{sp}
            {if $entry.targetUrl}
              <a href="{$entry.targetUrl}">{$entry.targetName}</a>
            {else}
              {$entry.targetName}
            {/if}
          {/if}
          // TODO(dborowitz): Something reasonable for gitlinks.
        </li>
      {/for}
    </ol>
  {else}
    <p>{msg desc="Informational text for when a tree is empty"}This tree is empty.{/msg}</p>
  {/if}

  {if $readmeHtml}
    <div class="InlineReadme">
      <div class="InlineReadme-path">{$readmePath}</div>
      <div class="doc">{$readmeHtml}</div>
    </div>
  {/if}
</div>
{/template}

/**
 * Common header for a blob shared between detail, blame, etc. views.
 */
{template blobHeader}
  {@param sha: ?}  /** SHA of this file's blob. */
  {@param? fileUrl: ?}  /** optional URL to a detail view of this file. */
  {@param? logUrl: ?}  /** optional URL to a log for this file. */
  {@param? blameUrl: ?}  /** optional URL to a blame for this file. */
  {@param? docUrl: ?}  /** optional URL to view rendered file. */
<div class="u-sha1 u-monospace BlobSha1">
  {msg desc="SHA-1 for the file's blob"}blob: {$sha}{/msg}
  {if $fileUrl}{sp}[<a href="{$fileUrl}">{msg desc="detail view of a file"}file{/msg}</a>]{/if}
  {if $logUrl}{sp}[<a href="{$logUrl}">{msg desc="history for a file"}log{/msg}</a>]{/if}
  {if $blameUrl}{sp}[<a href="{$blameUrl}">{msg desc="blame for a file"}blame{/msg}</a>]{/if}
  {if $docUrl}{sp}[<a href="{$docUrl}">{msg desc="view rendered file"}view{/msg}</a>]{/if}
</div>
{/template}

/**
 * Detailed listing of a blob.
 */
{template blobDetail}
  {@param sha: ?}  /** SHA of this file's blob. */
  {@param? logUrl: ?}  /** optional URL to a log for this file. */
  {@param? blameUrl: ?}  /** optional URL to a blame for this file. */
  {@param lines: ?}  /** lines (may be empty), or null for a binary file. Each line is a list of
      entries with "classes" and "text" fields for pretty-printed spans. */
  {@param? size: ?}  /** for binary files only, size in bytes. */
  {call blobHeader data="all" /}

  {if $lines != null}
    {if $lines}
      <table class="FileContents">
        {for $line in $lines}
          {let $n: index($line) + 1 /}
          <tr class="u-pre u-monospace FileContents-line">
            <td class="u-lineNum u-noSelect FileContents-lineNum"
                data-line-number="{$n}" onclick="window.location.hash='#{$n}'"></td>
            <td class="FileContents-lineContents" id="{$n}">
              {for $span in $line}
                <span class="{$span.classes}">{$span.text}</span>
              {/for}
            </td>
          </tr>
        {/for}
      </table>
    {else}
      <div class="FileContents-empty">Empty file</div>
    {/if}
  {else}
    <div class="FileContents-binary">
      {msg desc="size of binary file in bytes"}{$size}-byte binary file{/msg}
    </div>
  {/if}
{/template}

/**
 * Detailed listing of an annotated tag.
 */
{template tagDetail}
  {@param sha: ?}  /** SHA of this tag. */
  {@param? tagger: ?}  /** optional map with "name", "email", and "time" keys for the tagger. */
  {@param object: ?}  /** SHA of the object this tag points to. */
  {@param message: ?}  /** tag message. */
<div class="u-monospace Metadata">
  <table>
    <tr>
      <th class="Metadata-title">{msg desc="Header for tag SHA entry"}tag{/msg}</th>
      <td class="sha">{$sha}</td>
      <td>{sp}</td>
    </tr>
    {if $tagger}
      <tr>
        <th class="Metadata-title">{msg desc="Header for tagger"}tagger{/msg}</th>
        <td>
          {call person_ data="$tagger" /}
        </td>
        <td>{$tagger.time}</td>
      </tr>
    {/if}
    <tr>
      <th class="Metadata-title">{msg desc="Header for tagged object SHA"}object{/msg}</th>
      <td class="sha">{$object}</td>
      <td>{sp}</td>
    </tr>
  </table>
</div>
{if $message and length($message)}
  {call message_}
    {param className: 'u-pre u-monospace MetadataMessage' /}
    {param message: $message /}
  {/call}
{/if}
{/template}

/**
 * Line about a git person identity.
 */
{template person_}
  {@param name: ?}  /** name. */
  {@param email: ?}  /** email. */
{$name}{if $email} &lt;{$email}&gt;{/if}
{/template}

/**
 * Preformatted message, possibly containing hyperlinks.
 */
{template message_ visibility="private"}
  {@param className: ?}  /** CSS class name for <pre> block. */
  {@param message: ?}  /** list of message parts, where each part contains:
      text: raw text of the part.
      url: optional URL that should be linked to from the part.
      */
<pre class="{$className}">
  {for $part in $message}
    {if $part.url}<a href="{$part.url}">{$part.text}</a>{else}{$part.text}{/if}
  {/for}
</pre>
{/template}
