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

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}
