<!--
@license
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="../../../bower_components/polymer/polymer.html">

<link rel="import" href="../../../behaviors/gr-patch-set-behavior/gr-patch-set-behavior.html">
<link rel="import" href="../../../behaviors/rest-client-behavior/rest-client-behavior.html">
<link rel="import" href="../../../styles/shared-styles.html">
<link rel="import" href="../../shared/gr-download-commands/gr-download-commands.html">

<dom-module id="gr-download-dialog">
  <template>
    <style include="shared-styles">
      :host {
        background-color: var(--dialog-background-color);
        display: block;
      }
      section {
        display: flex;
        padding: .5em 1.5em;
      }
      section:not(:first-of-type) {
        border-top: 1px solid var(--border-color);
      }
      .flexContainer {
        display: flex;
        justify-content: space-between;
        padding-top: .75em;
      }
      .footer {
        justify-content: flex-end;
      }
      .closeButtonContainer {
        align-items: flex-end;
        display: flex;
        flex: 0;
        justify-content: flex-end;
      }
      .patchFiles,
      .archivesContainer {
        padding-bottom: .5em;
      }
      .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 {
        flex: 1;
        font-weight: var(--font-weight-bold);
      }
      .hidden {
        display: none;
      }
    </style>
    <section>
      <span class="title">
        Patch set [[patchNum]] of [[_computePatchSetQuantity(change.revisions)]]
      </span>
    </section>
    <section class$="[[_computeShowDownloadCommands(_schemes)]]">
      <gr-download-commands
          id="downloadCommands"
          commands="[[_computeDownloadCommands(change, patchNum, _selectedScheme)]]"
          schemes="[[_schemes]]"
          selected-scheme="{{_selectedScheme}}"></gr-download-commands>
    </section>
    <section class="flexContainer">
      <div class="patchFiles" hidden="[[_computeHidePatchFile(change, patchNum)]]" hidden>
        <label>Patch file</label>
        <div>
          <a
              id="download"
              href$="[[_computeDownloadLink(change, patchNum)]]"
              download>
            [[_computeDownloadFilename(change, patchNum)]]
          </a>
          <a
              href$="[[_computeZipDownloadLink(change, patchNum)]]"
              download>
            [[_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)]]"
                download>
              [[format]]
            </a>
          </template>
        </div>
      </div>
    </section>
    <section class="footer">
      <span class="closeButtonContainer">
        <gr-button id="closeButton"
            link
            on-tap="_handleCloseTap">Close</gr-button>
      </span>
    </section>
  </template>
  <script src="gr-download-dialog.js"></script>
</dom-module>
