/**
 * @license
 * Copyright (C) 2020 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.
 */
import {html} from '@polymer/polymer/lib/utils/html-tag.js';

export const htmlTemplate = html`
  <style include="shared-styles">
    :host {
      display: block;
    }
    nav {
      align-items: center;
      display: flex;
    }
    .bigTitle {
      color: var(--header-text-color);
      font-size: var(--header-title-font-size);
      text-decoration: none;
    }
    .bigTitle:hover {
      text-decoration: underline;
    }
    .titleText::before {
      background-image: var(--header-icon);
      background-size: var(--header-icon-size) var(--header-icon-size);
      background-repeat: no-repeat;
      content: '';
      display: inline-block;
      height: var(--header-icon-size);
      margin-right: calc(var(--header-icon-size) / 4);
      vertical-align: text-bottom;
      width: var(--header-icon-size);
    }
    .titleText::after {
      content: var(--header-title-content);
    }
    ul {
      list-style: none;
      padding-left: var(--spacing-l);
    }
    .links > li {
      cursor: default;
      display: inline-block;
      padding: 0;
      position: relative;
    }
    .linksTitle {
      display: inline-block;
      font-weight: var(--font-weight-bold);
      position: relative;
      text-transform: uppercase;
    }
    .linksTitle:hover {
      opacity: 0.75;
    }
    .rightItems {
      align-items: center;
      display: flex;
      flex: 1;
      justify-content: flex-end;
    }
    .rightItems gr-endpoint-decorator:not(:empty) {
      margin-left: var(--spacing-l);
    }
    gr-smart-search {
      flex-grow: 1;
      margin: 0 var(--spacing-m);
      max-width: 500px;
    }
    gr-dropdown,
    .browse {
      padding: var(--spacing-m);
    }
    gr-dropdown {
      --gr-dropdown-item: {
        color: var(--primary-text-color);
      }
    }
    .settingsButton {
      margin-left: var(--spacing-m);
    }
    .browse {
      color: var(--header-text-color);
      /* Same as gr-button */
      margin: 5px 4px;
      text-decoration: none;
    }
    .invisible,
    .settingsButton,
    gr-account-dropdown {
      display: none;
    }
    :host([loading]) .accountContainer,
    :host([logged-in]) .loginButton,
    :host([logged-in]) .registerButton {
      display: none;
    }
    :host([logged-in]) .settingsButton,
    :host([logged-in]) gr-account-dropdown {
      display: inline;
    }
    .accountContainer {
      align-items: center;
      display: flex;
      margin: 0 calc(0 - var(--spacing-m)) 0 var(--spacing-m);
      overflow: hidden;
      text-overflow: ellipsis;
      white-space: nowrap;
    }
    .loginButton,
    .registerButton {
      padding: var(--spacing-m) var(--spacing-l);
    }
    .dropdown-trigger {
      text-decoration: none;
    }
    .dropdown-content {
      background-color: var(--view-background-color);
      box-shadow: var(--elevation-level-2);
    }
    /*
       * We are not using :host to do this, because :host has a lowest css priority
       * compared to others. This means that using :host to do this would break styles.
       */
    .linksTitle,
    .bigTitle,
    .loginButton,
    .registerButton,
    iron-icon,
    gr-account-dropdown {
      color: var(--header-text-color);
    }
    #mobileSearch {
      display: none;
    }
    @media screen and (max-width: 50em) {
      .bigTitle {
        font-family: var(--header-font-family);
        font-size: var(--font-size-h3);
        font-weight: var(--font-weight-h3);
        line-height: var(--line-height-h3);
      }
      gr-smart-search,
      .browse,
      .rightItems .hideOnMobile,
      .links > li.hideOnMobile {
        display: none;
      }
      #mobileSearch {
        display: inline-flex;
      }
      .accountContainer {
        margin-left: var(--spacing-m) !important;
      }
      gr-dropdown {
        padding: var(--spacing-m) 0 var(--spacing-m) var(--spacing-m);
      }
    }
  </style>
  <nav>
    <a href$="[[_computeRelativeURL('/')]]" class="bigTitle">
      <gr-endpoint-decorator name="header-title">
        <span class="titleText"></span>
      </gr-endpoint-decorator>
    </a>
    <ul class="links">
      <template is="dom-repeat" items="[[_links]]" as="linkGroup">
        <li class$="[[_computeLinkGroupClass(linkGroup)]]">
          <gr-dropdown
            link=""
            down-arrow=""
            items="[[linkGroup.links]]"
            horizontal-align="left"
          >
            <span class="linksTitle" id="[[linkGroup.title]]">
              [[linkGroup.title]]
            </span>
          </gr-dropdown>
        </li>
      </template>
    </ul>
    <div class="rightItems">
      <gr-endpoint-decorator
        class="hideOnMobile"
        name="header-small-banner"
      ></gr-endpoint-decorator>
      <gr-smart-search
        id="search"
        search-query="{{searchQuery}}"
      ></gr-smart-search>
      <gr-endpoint-decorator
        class="hideOnMobile"
        name="header-browse-source"
      ></gr-endpoint-decorator>
      <div class="accountContainer" id="accountContainer">
        <iron-icon
          id="mobileSearch"
          icon="gr-icons:search"
          on-tap="_onMobileSearchTap"
        ></iron-icon>
        <div class$="[[_computeIsInvisible(_registerURL)]]">
          <a class="registerButton" href$="[[_registerURL]]">
            [[_registerText]]
          </a>
        </div>
        <a class="loginButton" href$="[[loginUrl]]">Sign in</a>
        <a
          class="settingsButton"
          href$="[[_generateSettingsLink()]]"
          title="Settings"
        >
          <iron-icon icon="gr-icons:settings"></iron-icon>
        </a>
        <gr-account-dropdown account="[[_account]]"></gr-account-dropdown>
      </div>
    </div>
  </nav>
  <gr-js-api-interface id="jsAPI"></gr-js-api-interface>
  <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
`;
