// 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 com.google.gitiles.templates.PathDetail}

import * as common from 'com/google/gitiles/templates/Common.soy';
import * as objDetail from 'com/google/gitiles/templates/ObjectDetail.soy';

/**
 * Detail page for a path within a tree.
 */
{template pathDetail stricthtml="false"}
  {@param title: ?}  /** human-readable name of this path. */
  {@param repositoryName: ?}  /** name of this repository. */
  {@param? menuEntries: ?}  /** menu entries. */
  {@param? customVariant: ?}  /** variant name for custom styling. */
  {@param breadcrumbs: ?}  /** breadcrumbs for this page. */
  {@param type: ?}  /** path type, matching one of the constant names defined in
      org.eclipse.jgit.lib.FileMode. */
  {@param data: ?}  /** path data, matching the params for one of .treeDetail, .blobDetail,
      .symlinkDetail, or .gitlinkDetail as appropriate. */
  {@inject staticUrls: ?}
{if $type == 'REGULAR_FILE' or $type == 'EXECUTABLE_FILE'}
  {call common.header data="all"}
    {param css: [$staticUrls.PRETTIFY_CSS_URL] /}
  {/call}
{elseif $data.readmeHtml}
  {call common.header data="all"}
    {param css: [$staticUrls.DOC_CSS_URL, $staticUrls.PRETTIFY_CSS_URL] /}
  {/call}
{else}
  {call common.header data="all" /}
{/if}

{switch $type}
  {case 'TREE'}
    {call objDetail.treeDetail data="$data" /}
  {case 'SYMLINK'}
    {call symlinkDetail data="$data" /}
  {case 'REGULAR_FILE'}
    {call objDetail.blobDetail data="$data" /}
  {case 'EXECUTABLE_FILE'}
    {call objDetail.blobDetail data="$data" /}
  {case 'GITLINK'}
    {call gitlinkDetail data="$data" /}
  {default}
    <div class="error">
      {msg desc="Error message for an unknown object type"}Object has unknown type.{/msg}
    </div>
{/switch}

{call common.footer}
  {param customVariant: $customVariant /}
{/call}
{/template}

/**
 * Detail for a symbolic link.
 */
{template symlinkDetail}
  {@param target: ?}  /** target of this symlink. */
  {@param? targetUrl: ?}  /** optional URL for the target, if it is within this repo. */
<div class="symlink-detail">
  {msg desc="Lead-in text for the symbolic link target."}Symbolic link to{/msg}
  {sp}{if $targetUrl}<a href="{$targetUrl}">{$target}</a>{else}{$target}{/if}
</div>
{/template}

/**
 * Detail for a git submodule link.
 */
{template gitlinkDetail}
  {@param sha: ?}  /** submodule commit SHA. */
  {@param remoteUrl: ?}  /** URL of the remote repository. */
  {@param? httpUrl: ?}  /** optional HTTP URL pointing to a web-browser-compatible URL of the remote
      repository. */
<div class="gitlink-detail">
  {msg desc="Lead-in text for the git link URL"}Submodule link to {$sha} of{/msg}
  {if $remoteUrl}
    {sp}{if $httpUrl}<a href="{$httpUrl}">{$remoteUrl}</a>{else}{$remoteUrl}{/if}
  {else}
    {sp}{msg desc="Text describing an unknown submodule URL"}a submodule with an unknown URL{/msg}
  {/if}
</div>
{/template}
