import '@material/web/button/outlined-button.js';
import '@material/web/icon/icon.js';
import '@material/web/textfield/filled-text-field.js';
import './ActionEditor.js';

import {css, html, LitElement, nothing} from 'lit';
import {createRef, ref} from 'lit/directives/ref.js';
import {repeat} from 'lit/directives/repeat.js';

import * as pb from '../../proto/main_pb.js';
import WorkflowsStorage from '../../workflowsStorage.js';

export default class WFWorkflowEditor extends LitElement {
  static properties = {
    workflow: {type: Object},
    readOnly: {type: Boolean},
  };

  static styles = css`
    .name {
      width: 100%;
      margin-bottom: 20px;
    }
  `;

  nameRef = createRef();

  constructor() {
    super();
    this.workflow = new pb.workflows.Workflow();
    this.readOnly = false;
  }

  renderName() {
    return html`
      <md-filled-text-field ${ref(this.nameRef)}
          class="name"
          placeholder="Untitled workflow"
          value=${this.workflow.getName()}
          required
          @input=${this._nameChanged}>
      </md-filled-text-field>
    `;
  }

  renderActions() {
    return repeat(this._actions(), (action, i) => html`
      <wf-action-editor
          .action=${action}
          ?readOnly=${this.readOnly}
          ?disableRemoveButton=${this._actions().length <= 1}
          step=${i + 1}
          @action-removed=${() => this._removeAction(i)}>
      </wf-action-editor>
    `);
  }

  renderAddActionBtn() {
    if (this.readOnly) return nothing;
    return html`
      <md-outlined-button
          @click=${this._addAction}>
        <md-icon slot="icon">add</md-icon>
        Add another action
      </md-outlined-button>
    `;
  }

  render() {
    return [
      this.renderName(),
      this.renderActions(),
      this.renderAddActionBtn(),
    ];
  }

  checkValidity() {
    let allValid = true;

    // Check the workflow name is set
    allValid &&= this.nameRef.value.reportValidity();

    // Check all the actions are well-formed
    const actionEditors = this.renderRoot.querySelectorAll('wf-action-editor');
    for (const editor of actionEditors) allValid &&= editor.checkValidity();

    return allValid;
  }

  save(uuid) {
    const allValid = this.checkValidity();

    // Save the workflow if the validation checks passed
    if (allValid) {
      if (!uuid)
        WorkflowsStorage.add(this.workflow);
      else
        WorkflowsStorage.update(uuid, this.workflow);
    }

    return allValid;
  }

  _actions() {
    return this.workflow.getActionsList();
  }

  _nameChanged() {
    this.workflow.setName(this.nameRef.value.value);
    this._dispatchUpdateEvent();
  }

  _addAction() {
    let action = new pb.workflows.Action();
    let rAction = new pb.workflows.Action.ReplyWithCRAction();
    action.setReplyWithCrAction(rAction);
    this.workflow.addActions(action);
    this._dispatchUpdateEvent();
  }

  _removeAction(index) {
    let actions = this.workflow.getActionsList();
    actions.splice(index, 1);
    this.workflow.setActionsList(actions);
    this._dispatchUpdateEvent();
  }

  _updateAction(index, action) {
    let actions = this.workflow.getActionsList();
    actions[index] = action;
    this.workflow.setActionsList(actions);
    this._dispatchUpdateEvent();
  }

  _dispatchUpdateEvent() {
    // Request an update for this component
    this.requestUpdate();

    // Transmit to other components that the workflow has changed
    const e = new Event('workflow-updated', {bubbles: true, composed: true});
    this.renderRoot.dispatchEvent(e);
  }
}
window.customElements.define('wf-workflow-editor', WFWorkflowEditor);
