<!--
Copyright (C) 2016 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.
-->

<link rel="import" href="../../../behaviors/rest-client-behavior/rest-client-behavior.html">
<link rel="import" href="../../../bower_components/polymer/polymer.html">
<link rel="import" href="../../../bower_components/iron-input/iron-input.html">
<link rel="import" href="../../shared/gr-button/gr-button.html">
<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">

<dom-module id="gr-download-dialog">
  <template>
    <style>
      :host {
        display: block;
        padding: 1em;
      }
      ul {
        list-style: none;
        margin-bottom: .5em;
      }
      li {
        display: inline-block;
        margin: 0;
        padding: 0;
      }
      li gr-button {
        margin-right: 1em;
      }
      label,
      input {
        display: block;
      }
      label {
        font-weight: bold;
      }
      input {
        font-family: var(--monospace-font-family);
        font-size: inherit;
      }
      li[selected] gr-button {
        color: #000;
        font-weight: bold;
        text-decoration: none;
      }
      header {
        display: flex;
        justify-content: space-between;
      }
      main {
        border-bottom: 1px solid #ddd;
        border-top: 1px solid #ddd;
        padding: .5em;
      }
      footer {
        display: flex;
        justify-content: space-between;
        padding-top: .75em;
      }
      .command {
        display: flex;
        flex-wrap: wrap;
        margin-bottom: .5em;
        width: 60em;
      }
      .command label {
        flex: 0 0 100%;
      }
      .copyCommand {
        flex-grow: 1;
        margin-right: .3em;
      }
      .closeButtonContainer {
        display: flex;
        flex: 0;
        justify-content: flex-end;
      }
      .patchFiles {
        margin-right: 2em;
      }
      .patchFiles a,
      .archives a {
        display: inline-block;
        margin-right: 1em;
      }
      .patchFiles a:last-of-type,
      .archives a:last-of-type {
        margin-right: 0;
      }
      .title {
        text-align: center;
        flex: 1;
      }
    </style>
    <header>
      <ul hidden$="[[!_schemes.length]]" hidden>
        <template is="dom-repeat" items="[[_schemes]]" as="scheme">
          <li selected$="[[_computeSchemeSelected(scheme, _selectedScheme)]]">
            <gr-button link data-scheme$="[[scheme]]" on-tap="_handleSchemeTap">
              [[scheme]]
            </gr-button>
          </li>
        </template>
      </ul>
      <span class="title">
        Patch set [[patchNum]] of [[_computePatchSetQuantity(change.revisions)]]
      </span>
      <span class="closeButtonContainer">
        <gr-button id="closeButton"
            link
            on-tap="_handleCloseTap">Close</gr-button>
      </span>
    </header>
    <main hidden$="[[!_schemes.length]]" hidden>
      <template is="dom-repeat"
          items="[[_computeDownloadCommands(change, patchNum, _selectedScheme)]]"
          as="command">
        <div class="command">
          <label>[[command.title]]</label>
          <input is="iron-input"
              class="copyCommand"
              type="text"
              bind-value="[[command.command]]"
              on-tap="_handleInputTap"
              readonly>
          <gr-button class="copyToClipboard" on-tap="_copyToClipboard">
            copy
          </gr-button>
        </div>
      </template>
    </main>
    <footer>
      <div class="patchFiles">
        <label>Patch file</label>
        <div>
          <a id="download" href$="[[_computeDownloadLink(change, patchNum)]]">
            [[_computeDownloadFilename(change, patchNum)]]
          </a>
          <a href$="[[_computeZipDownloadLink(change, patchNum)]]">
            [[_computeZipDownloadFilename(change, patchNum)]]
          </a>
        </div>
      </div>
      <div class="archivesContainer" hidden$="[[!config.archives.length]]" hidden>
        <label>Archive</label>
        <div id="archives" class="archives">
          <template is="dom-repeat" items="[[config.archives]]" as="format">
            <a href$="[[_computeArchiveDownloadLink(change, patchNum, format)]]">
              [[format]]
            </a>
          </template>
        </div>
      </div>
    </footer>
    <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
  </template>
  <script src="gr-download-dialog.js"></script>
</dom-module>
