/**
 * @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';

export const htmlTemplate = html`
  <style include="gr-font-styles">
    /* Workaround for empty style block - see https://github.com/Polymer/tools/issues/408 */
  </style>
  <style include="shared-styles">
    :host {
      display: block;
      margin-bottom: var(--spacing-l);
    }
    fieldset {
      border: 1px solid var(--border-color);
    }
    .name {
      align-items: center;
      display: flex;
    }
    .header,
    #deletedContainer {
      align-items: center;
      background: var(--table-header-background-color);
      border-bottom: 1px dotted var(--border-color);
      display: flex;
      justify-content: space-between;
      min-height: 3em;
      padding: 0 var(--spacing-m);
    }
    #deletedContainer {
      border-bottom: 0;
    }
    .sectionContent {
      padding: var(--spacing-m);
    }
    #editBtn,
    .editing #editBtn.global,
    #deletedContainer,
    .deleted #mainContainer,
    #addPermission,
    #deleteBtn,
    .editingRef .name,
    .editRefInput {
      display: none;
    }
    .editing #editBtn,
    .editingRef .editRefInput {
      display: flex;
    }
    .deleted #deletedContainer {
      display: flex;
    }
    .editing #addPermission,
    #mainContainer,
    .editing #deleteBtn {
      display: block;
    }
    .editing #deleteBtn,
    #undoRemoveBtn {
      padding-right: var(--spacing-m);
    }
  </style>
  <style include="gr-form-styles">
    /* Workaround for empty style block - see https://github.com/Polymer/tools/issues/408 */
  </style>
  <fieldset
    id="section"
    class$="gr-form-styles [[_computeSectionClass(editing, canUpload, ownerOf, _editingRef, _deleted)]]"
  >
    <div id="mainContainer">
      <div class="header">
        <div class="name">
          <h3 class="heading-3">[[_computeSectionName(section.id)]]</h3>
          <gr-button
            id="editBtn"
            link=""
            class$="[[_computeEditBtnClass(section.id)]]"
            on-click="editReference"
          >
            <iron-icon id="icon" icon="gr-icons:create"></iron-icon>
          </gr-button>
        </div>
        <iron-input
          class="editRefInput"
          bind-value="{{section.id}}"
          type="text"
          on-input="_handleValueChange"
        >
          <input
            class="editRefInput"
            bind-value="{{section.id}}"
            is="iron-input"
            type="text"
            on-input="_handleValueChange"
          />
        </iron-input>
        <gr-button link="" id="deleteBtn" on-click="_handleRemoveReference"
          >Remove</gr-button
        >
      </div>
      <!-- end header -->
      <div class="sectionContent">
        <template is="dom-repeat" items="{{_permissions}}" as="permission">
          <gr-permission
            name="[[_computePermissionName(section.id, permission, capabilities)]]"
            permission="{{permission}}"
            labels="[[labels]]"
            section="[[section.id]]"
            editing="[[editing]]"
            groups="[[groups]]"
            on-added-permission-removed="_handleAddedPermissionRemoved"
          >
          </gr-permission>
        </template>
        <div id="addPermission">
          Add permission:
          <select id="permissionSelect">
            <!-- called with a third parameter so that permissions update
                  after a new section is added. -->
            <template
              is="dom-repeat"
              items="[[_computePermissions(section.id, capabilities, labels, section.value.permissions.*)]]"
            >
              <option value="[[item.value.id]]">[[item.value.name]]</option>
            </template>
          </select>
          <gr-button link="" id="addBtn" on-click="_handleAddPermission"
            >Add</gr-button
          >
        </div>
        <!-- end addPermission -->
      </div>
      <!-- end sectionContent -->
    </div>
    <!-- end mainContainer -->
    <div id="deletedContainer">
      <span>[[_computeSectionName(section.id)]] was deleted</span>
      <gr-button link="" id="undoRemoveBtn" on-click="_handleUndoRemove"
        >Undo</gr-button
      >
    </div>
    <!-- end deletedContainer -->
  </fieldset>
`;
