/**
 * @license
 * Copyright 2016 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */
import '../gr-icon/gr-icon';
import {spinnerStyles} from '../../../styles/gr-spinner-styles';
import {votingStyles} from '../../../styles/gr-voting-styles';
import {css, html, LitElement, nothing, PropertyValues} from 'lit';
import {customElement, property} from 'lit/decorators.js';
import {getEventPath, Key} from '../../../utils/dom-util';
import {getAppContext} from '../../../services/app-context';
import {classMap} from 'lit/directives/class-map.js';
import {Interaction} from '../../../constants/reporting';
import {ShortcutController} from '../../lit/shortcut-controller';
import '@material/web/button/elevated-button';
import '@material/web/button/text-button';

declare global {
  interface HTMLElementTagNameMap {
    'gr-button': GrButton;
  }
}
/**
 * @attr {Boolean} position-below
 * @attr {Boolean} primary - set primary button color
 * @attr {Boolean} secondary - set secondary button color
 */
@customElement('gr-button')
export class GrButton extends LitElement {
  /**
   * Should this button be rendered as a vote chip? Then we are applying
   * the .voteChip class (see gr-voting-styles) to the md-text-button/md-elevated-button.
   */
  @property({type: Boolean, reflect: true})
  voteChip = false;

  // Note: don't assign a value to this, since constructor is called
  // after created, the initial value maybe overridden by this
  private initialTabindex?: string;

  @property({type: Boolean, attribute: 'down-arrow'})
  downArrow = false;

  @property({type: Boolean, reflect: true})
  link = false;

  // If flattened then the button will not be shown as raised.
  @property({type: Boolean, reflect: true})
  flatten = false;

  @property({type: Boolean, reflect: true})
  loading = false;

  @property({type: Boolean, reflect: true})
  disabled: boolean | null = null;

  // Private but used in tests.
  readonly reporting = getAppContext().reportingService;

  private readonly shortcuts = new ShortcutController(this);

  static override get styles() {
    return [
      votingStyles,
      spinnerStyles,
      css`
        /* general styles for all buttons */
        :host {
          --background-color: var(
            --button-background-color,
            var(--default-button-background-color)
          );
          --text-color: var(
            --gr-button-text-color,
            var(--default-button-text-color)
          );
          display: inline-block;
          position: relative;
        }
        :host([hidden]) {
          display: none;
        }
        :host md-text-button,
        :host md-elevated-button {
          --md-text-button-label-text-font: var(--header-font-family);
          --md-text-button-label-text-weight: var(--font-weight-medium);
          --md-elevated-button-label-text-font: var(--header-font-family);
          --md-elevated-button-label-text-weight: var(--font-weight-medium);
          text-transform: none;
          /* This is also set in the button-label-(font|weight) css vars above. We keep this incase it is also needed. */
          font-weight: var(--font-weight-medium);
          font-family: var(--header-font-family);
          font: inherit;
          color: var(--text-color);
          --md-text-button-container-color: var(--text-color);
        }

        md-text-button,
        md-elevated-button {
          --md-text-button-label-text-font: var(--font-family, inherit);
          --md-text-button-label-text-weight: var(
            --font-weight-normal,
            inherit
          );
          --md-elevated-button-label-text-font: var(--font-family, inherit);
          --md-elevated-button-label-text-weight: var(
            --font-weight-normal,
            inherit
          );
          --md-text-button-container-color: var(--background-color);
          --md-text-button-hover-container-color: var(--background-color);
          --md-elevated-button-container-color: var(--background-color);
          --md-elevated-button-hover-container-color: var(--background-color);
          --md-sys-color-primary: var(--text-color);
          /* We set this to 0 which defaults to 12px under text-button.
            This is because for some reason it makes the size of it bigger
            which makes some of the buttons look wrong. E.g. attention set has
            a bigger width and thus a lot of space. This fixes it. */
          --md-text-button-leading-space: 0;
          --md-text-button-trailing-space: 0;
          /* Brings back the round corners we had with paper-button */
          --md-text-button-container-shape: 4px;
          --md-elevated-button-container-shape: 4px;
          align-items: center;
          background-color: var(--background-color);
          color: var(--text-color);
          /* This is also set in the button-label-(font|weight) css vars above. We keep this incase it is also needed. */
          font-family: var(--font-family, inherit);
          font-weight: var(--font-weight-normal, inherit);
          display: flex;
          justify-content: center;
          margin: var(--margin, 0);
          min-width: var(--border, 0);
          padding: var(--gr-button-padding, var(--spacing-s) var(--spacing-m));
          /* Needed to resize properly */
          min-height: auto;
          height: auto;
          cursor: pointer;
        }
        :host md-text-button:hover,
        :host md-elevated-button:hover {
          background: linear-gradient(rgba(0, 0, 0, 0.12), rgba(0, 0, 0, 0.12)),
            var(--background-color);
        }

        :host([primary]) {
          --background-color: var(--primary-button-background-color);
          --text-color: var(--primary-button-text-color);
        }
        :host([link][primary]) {
          --text-color: var(--primary-button-background-color);
        }

        /* Keep below color definition for primary so that this takes precedence
          when disabled. */
        :host([disabled]),
        :host([loading]) {
          --background-color: var(--disabled-button-background-color);
          --text-color: var(--deemphasized-text-color);
          cursor: default;
        }

        :host([disabled][flatten]) {
          --background-color: transparent;
          --text-color: var(--disabled-foreground);
        }

        /* Styles for link buttons specifically */
        :host([link]) {
          --background-color: transparent;
          --margin: 0;
        }
        :host([disabled][link]),
        :host([loading][link]) {
          --background-color: transparent;
          --text-color: var(--disabled-foreground);
          cursor: default;
        }
        gr-icon.downArrow {
          color: inherit;
        }
        .newVoteChip {
          border: 1px solid var(--border-color);
          box-shadow: none;
          box-sizing: border-box;
          min-width: 3em;
          --md-sys-color-primary: var(--vote-text-color);
        }
      `,
    ];
  }

  override render() {
    const buttonClass = classMap({
      newVoteChip: this.voteChip,
    });

    if (!this.link && !this.flatten) {
      return html`
        <md-elevated-button
          class=${buttonClass}
          ?disabled=${this.disabled || this.loading}
          part="md-elevated-button"
          role="button"
          tabindex="-1"
        >
          ${this.loading ? html`<span class="loadingSpin"></span>` : ''}
          <slot></slot>
          ${this.renderArrowIcon()}
        </md-elevated-button>
      `;
    }

    return html`
      <md-text-button
        class=${buttonClass}
        ?disabled=${this.disabled || this.loading}
        part="md-text-button"
        role="button"
        tabindex="-1"
      >
        ${this.loading ? html`<span class="loadingSpin"></span>` : ''}
        <slot></slot>
        ${this.renderArrowIcon()}
      </md-text-button>
    `;
  }

  renderArrowIcon() {
    if (!this.downArrow) return nothing;
    return html`<gr-icon icon="arrow_drop_down" class="downArrow"></gr-icon>`;
  }

  constructor() {
    super();
    this.initialTabindex = this.getAttribute('tabindex') || '0';
    this.addEventListener('click', e => this.handleAction(e));
    this.shortcuts.addLocal({key: Key.ENTER}, () => this.click());
    this.shortcuts.addLocal({key: Key.SPACE}, () => this.click());
  }

  override updated(changedProperties: PropertyValues) {
    if (changedProperties.has('disabled')) {
      this.setAttribute(
        'tabindex',
        this.disabled ? '-1' : this.initialTabindex || '0'
      );
    }
    if (changedProperties.has('loading') || changedProperties.has('disabled')) {
      this.setAttribute(
        'aria-disabled',
        this.disabled || this.loading ? 'true' : 'false'
      );
    }
  }

  override connectedCallback() {
    super.connectedCallback();
    if (!this.getAttribute('role')) {
      this.setAttribute('role', 'button');
    }
    if (!this.getAttribute('tabindex')) {
      this.setAttribute('tabindex', '0');
    }
  }

  private handleAction(e: MouseEvent) {
    if (this.disabled || this.loading) {
      e.preventDefault();
      e.stopPropagation();
      e.stopImmediatePropagation();
      return;
    }

    this.reporting.reportInteraction(Interaction.BUTTON_CLICK, {
      path: getEventPath(e),
      // Before change 456201 `<gr-button>` used css text-transform:uppercase.
      // We are using `toUpperCase()` here to keep the logs consistent.
      text: this.innerText.toUpperCase(),
    });
  }
}
