/**
 * @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;
    }
    :host([disabled]) {
      opacity: 0.5;
      pointer-events: none;
    }
    label {
      cursor: pointer;
    }
    .main {
      display: flex;
      flex-direction: column;
      width: 100%;
    }
    .main label,
    .main input[type='text'] {
      display: block;
      width: 100%;
    }
    iron-autogrow-textarea {
      font-family: var(--monospace-font-family);
      font-size: var(--font-size-mono);
      line-height: var(--line-height-mono);
      width: 73ch; /* Add a char to account for the border. */
    }
    .cherryPickTopicLayout {
      display: flex;
    }
    .cherryPickSingleChange,
    .cherryPickTopic {
      margin-left: var(--spacing-m);
      margin-bottom: var(--spacing-m);
    }
    .cherry-pick-topic-message {
      margin-bottom: var(--spacing-m);
    }
    label[for='messageInput'],
    label[for='baseInput'] {
      margin-top: var(--spacing-m);
    }
    .title {
      font-weight: var(--font-weight-bold);
    }
    tr > td {
      padding: var(--spacing-m);
    }
    th {
      color: var(--deemphasized-text-color);
    }
    table {
      border-collapse: collapse;
    }
    tr {
      border-bottom: 1px solid var(--border-color);
    }
    .error {
      color: var(--error-text-color);
    }
    .error-message {
      color: var(--error-text-color);
      margin: var(--spacing-m) 0 var(--spacing-m) 0;
    }
  </style>
  <gr-dialog
    confirm-label="Cherry Pick"
    cancel-label="[[_computeCancelLabel(_statuses)]]"
    disabled$="[[_computeDisableCherryPick(_cherryPickType, _duplicateProjectChanges, _statuses)]]"
    on-confirm="_handleConfirmTap"
    on-cancel="_handleCancelTap"
  >
    <div class="header title" slot="header">
      Cherry Pick Change to Another Branch
    </div>
    <div class="main" slot="main">
      <template is="dom-if" if="[[_showCherryPickTopic]]">
        <div class="cherryPickTopicLayout">
          <input
            name="cherryPickOptions"
            type="radio"
            id="cherryPickSingleChange"
            on-change="_handlecherryPickSingleChangeClicked"
            checked=""
          />
          <label for="cherryPickSingleChange" class="cherryPickSingleChange">
            Cherry Pick single change
          </label>
        </div>
        <div class="cherryPickTopicLayout">
          <input
            name="cherryPickOptions"
            type="radio"
            id="cherryPickTopic"
            on-change="_handlecherryPickTopicClicked"
          />
          <label for="cherryPickTopic" class="cherryPickTopic">
            Cherry Pick entire topic ([[_changesCount]] Changes)
          </label>
        </div></template
      >

      <label for="branchInput">
        Cherry Pick to branch
      </label>
      <gr-autocomplete
        id="branchInput"
        text="{{branch}}"
        query="[[_query]]"
        placeholder="Destination branch"
      >
      </gr-autocomplete>
      <template is="dom-if" if="[[_invalidBranch]]">
        <span class="error"> Branch name cannot contain space or commas. </span>
      </template>
      <template
        is="dom-if"
        if="[[_computeIfSinglecherryPick(_cherryPickType)]]"
      >
        <label for="baseInput">
          Provide base commit sha1 for cherry-pick
        </label>
        <iron-input
          maxlength="40"
          placeholder="(optional)"
          bind-value="{{baseCommit}}"
        >
          <input
            is="iron-input"
            id="baseCommitInput"
            maxlength="40"
            placeholder="(optional)"
            bind-value="{{baseCommit}}"
          />
        </iron-input>
        <label for="messageInput">
          Cherry Pick Commit Message
        </label>
      </template>
      <template
        is="dom-if"
        if="[[_computeIfSinglecherryPick(_cherryPickType)]]"
      >
        <iron-autogrow-textarea
          id="messageInput"
          class="message"
          autocomplete="on"
          rows="4"
          max-rows="15"
          bind-value="{{message}}"
        ></iron-autogrow-textarea>
      </template>
      <template is="dom-if" if="[[_computeIfCherryPickTopic(_cherryPickType)]]">
        <span class="error-message"
          >[[_computeTopicErrorMessage(_duplicateProjectChanges)]]</span
        >
        <span class="cherry-pick-topic-message">
          Commit Message will be auto generated
        </span>
        <table>
          <thead>
            <tr>
              <th>Change</th>
              <th>Subject</th>
              <th>Project</th>
              <th>Status</th>
              <!-- Error Message -->
              <th></th>
            </tr>
          </thead>
          <tbody>
            <template is="dom-repeat" items="[[changes]]">
              <tr>
                <td><span> [[_getChangeId(item)]] </span></td>
                <td>
                  <span> [[_getTrimmedChangeSubject(item.subject)]] </span>
                </td>
                <td><span> [[item.project]] </span></td>
                <td>
                  <span class$="[[_computeStatusClass(item, _statuses)]]">
                    [[_computeStatus(item, _statuses)]]
                  </span>
                </td>
                <td>
                  <span class="error">
                    [[_computeError(item, _statuses)]]
                  </span>
                </td>
              </tr>
            </template>
          </tbody>
        </table>
      </template>
    </div>
  </gr-dialog>
  <gr-reporting
    id="reporting"
    category="confirm-cherry-pick-dialog"
  ></gr-reporting>
  <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
`;
