import '@material/web/formfield/formfield.js';
import '@material/web/icon/icon.js';
import '@material/web/switch/switch.js';

import consoleCommonStyles from '!!raw-loader!../../../../static/css/common/console.css';
import {msg} from '@lit/localize';
import {css, html, nothing, unsafeCSS} from 'lit';
import {createRef, ref} from 'lit/directives/ref.js';

import {I18nLitElement} from '../../../../common/litI18nUtils.js';
import {SHARED_MD3_STYLES} from '../../../../common/styles/md3.js';
import {kEventFlattenThreadsUpdated} from '../constants.js';

export default class TwptThreadToolbarInject extends I18nLitElement {
  static properties = {
    options: {type: Object},
  };

  static styles = [
    SHARED_MD3_STYLES,
    css`${unsafeCSS(consoleCommonStyles)}`,
    css`
      :host {
        display: block;
        padding-top: 1rem;
      }

      .toolbar {
        display: flex;
        flex-flow: row wrap;
        align-items: center;
        row-gap: 0.5rem;
        padding: 0.5rem 0.25rem;
      }

      .badge-container {
        padding-inline-end: 0.5rem;
        border-inline-end: solid gray 1px;
        margin-inline-end: 0.5rem;
      }

      .TWPT-badge {
        --icon-size: 17px;
      }
    `,
  ];

  nestedViewRef = createRef();

  constructor() {
    super();
    this.options = {};
  }

  renderBadge() {
    return html`
      <div class="badge-container">
        <div class="TWPT-badge">
          <md-icon>repeat</md-icon>
        </div>
      </div>
    `;
  }

  renderFlattenRepliesSwitch() {
    if (!this.options.flattenthreads) return nothing;

    const nestedViewMsg = msg('Nested view', {
      desc:
          'Label for the switch which lets users enable/disable the nested view in a thread.',
    });
    return html`
      <md-formfield label="${nestedViewMsg}">
        <md-switch ${ref(this.nestedViewRef)}
            ?selected=${!this.options?.flattenthreads_switch_enabled}
            @click=${this._flattenThreadsChanged}>
      </md-formfield>
    `;
  }

  render() {
    // NOTE: Keep this in sync!
    if (!this.options.flattenthreads) return nothing;

    return html`
      <div class="toolbar">
        ${this.renderBadge()}
        ${this.renderFlattenRepliesSwitch()}
      </div>
    `;
  }

  _flattenThreadsChanged() {
    const enabled = !this.nestedViewRef.value.selected;
    const e = new CustomEvent(kEventFlattenThreadsUpdated, {
      bubbles: true,
      composed: true,
      detail: {enabled},
    });
    this.dispatchEvent(e);
  }
}
window.customElements.define(
    'twpt-thread-toolbar-inject', TwptThreadToolbarInject);
