/**
 * @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="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]]"
            repo="[[repo]]"
            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>
`;
