// 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 notes: ?} /** the notes for the corresponding commit */
  {@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 $notes}
  <h4>Notes:</h4>
  <div class="MetadataMessage">
      <span>
        {msg desc="Text for the git notes"}{$notes}{/msg}
      </span>
  </div>
{/if}

{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}
