/**
 * @license
 * Copyright (C) 2019 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 {RepoName} from '@gerritcodereview/typescript-api/rest-api';
import {RestPluginApi} from '@gerritcodereview/typescript-api/rest';
import {PluginApi} from '@gerritcodereview/typescript-api/plugin';
import '@gerritcodereview/typescript-api/gerrit';
import {customElement, property, query, state} from 'lit/decorators';
import {css, CSSResult, html, LitElement} from 'lit';
import './rv-edit-screen';

declare global {
  interface HTMLElementTagNameMap {
    'rv-reviewers': RvReviewers;
  }
}

declare interface AccountCapabilityInfo {
  'reviewers-modifyReviewersConfig'?: boolean;
}

type ProjectAccessInfoMap = {[projectName: string]: ProjectAccessInfo};

declare interface ProjectAccessInfo {
  is_owner?: boolean;
}

@customElement('rv-reviewers')
export class RvReviewers extends LitElement {
  @query('#rvScreenModal')
  rvScreenModal?: HTMLDialogElement;

  /** Guaranteed to be set by the `repo-command` endpoint. */
  @property({type: Object})
  plugin!: PluginApi;

  /** Guaranteed to be set by the `repo-command` endpoint. */
  @property({type: String})
  repoName!: RepoName;

  @state()
  pluginRestApi!: RestPluginApi;

  @state()
  canModifyConfig = false;

  @state()
  loading = true;

  static override get styles() {
    return [
      window.Gerrit.styles.font as CSSResult,
      window.Gerrit.styles.modal as CSSResult,
      css`
        :host {
          display: block;
          margin-bottom: var(--spacing-xxl);
        }
        #rvScreenModal {
          width: 50em;
          overflow: auto;
        }
        h2 {
          margin-top: var(--spacing-xxl);
          margin-bottom: var(--spacing-s);
        }
        p {
          padding: var(--spacing-m) 0;
          margin: 0;
        }
      `,
    ];
  }

  override render() {
    return html`
      <h2 class="heading-2">Edit reviewers config</h2>
      <div>
        <p>
          Allows you to define rules for when specific groups or accounts should
          automatically be added as reviewers or CCs to a change.
        </p>
      </div>
      <div>
        <gr-button @click="${() => this.rvScreenModal?.showModal()}">
          Edit Reviewers Config
        </gr-button>
      </div>
      <dialog id="rvScreenModal">
        <rv-edit-screen
          .pluginRestApi="${this.pluginRestApi}"
          .repoName="${this.repoName}"
          .loading="${this.loading}"
          .canModifyConfig="${this.canModifyConfig}"
          @close="${() => this.rvScreenModal?.close()}"
        >
        </rv-edit-screen>
      </dialog>
    `;
  }

  override connectedCallback() {
    super.connectedCallback();
    this.pluginRestApi = this.plugin.restApi();
    const p1 = this.getRepoAccess(this.repoName).then(access => {
      if (access[this.repoName]?.is_owner) {
        this.canModifyConfig = true;
      }
    });
    const p2 = this.getCapabilities().then(capabilities => {
      if (capabilities['reviewers-modifyReviewersConfig']) {
        this.canModifyConfig = true;
      }
    });
    Promise.all([p1, p2]).then(() => (this.loading = false));
  }

  getRepoAccess(repoName: RepoName) {
    return this.pluginRestApi.get<ProjectAccessInfoMap>(
      '/access/?project=' + encodeURIComponent(repoName)
    );
  }

  getCapabilities() {
    return this.pluginRestApi.get<AccountCapabilityInfo>(
      '/accounts/self/capabilities'
    );
  }
}
