class QueryResultList extends RessourceList {
  static autoInit() {
    for (let queryResultListElement of document.querySelectorAll('.query-result-list:not(.no-autoinit)')) {
      new QueryResultList(queryResultListElement);
    }
  }

  static options = {
    item: `
      <tr class="hoverable">
        <td><b class="title"></b><br><i class="description"></i><br></td>
        <td><span class="corpus-title"></span><br><span class="query"></span></td>
        <td class="right-align">
          <a class="action-button btn-floating red waves-effect waves-light" data-action="delete"><i class="material-icons">delete</i></a>
          <a class="action-button btn-floating waves-effect waves-light" data-action="view"><i class="material-icons">send</i></a>
        </td>
      </tr>
    `.trim(),
    ressourceMapper: queryResult => {
      return {
        'id': queryResult.id,
        'corpus-title': queryResult.corpus_title,
        'creation-date': queryResult.creation_date,
        'description': queryResult.description,
        'query': queryResult.query,
        'title': queryResult.title
      };
    },
    sortArgs: ['creation-date', {order: 'desc'}],
    valueNames: [
      {data: ['id']},
      {data: ['creation-date']},
      'corpus-title',
      'description',
      'query',
      'title'
    ]
  };

  constructor(listElement, options = {}) {
    super(listElement, {...QueryResultList.options, ...options});
  }

  init(user) {
    super._init(user.query_results);
  }

  onclick(event) {
    let action;
    let actionButtonElement;
    let deleteModal;
    let deleteModalElement;
    let queryResultElement;
    let queryResultId;
    let tmp;

    queryResultElement = event.target.closest('tr[data-id]');
    if (queryResultElement === null) {return;}
    queryResultId = queryResultElement.dataset.id;
    actionButtonElement = event.target.closest('.action-button[data-action]');
    action = actionButtonElement === null ? 'view' : actionButtonElement.dataset.action;
    switch (action) {
      case 'delete':
        tmp = document.createElement('div');
        tmp.innerHTML = `
          <div class="modal">
            <div class="modal-content">
              <h4>Confirm query result deletion</h4>
              <p>Do you really want to delete the query result <b>${app.users[this.userId].query_results[queryResultId].title}</b>? It will be permanently deleted!</p>
            </div>
            <div class="modal-footer">
              <a href="#!" class="btn modal-close waves-effect waves-light">Cancel</a>
              <a class="btn modal-close red waves-effect waves-light" href="/query_results/${queryResultId}/delete"><i class="material-icons left">delete</i>Delete</a>
            </div>
          </div>
        `.trim();
        deleteModalElement = document.querySelector('#modals').appendChild(tmp.firstChild);
        deleteModal = M.Modal.init(
          deleteModalElement,
          {
            onCloseEnd: () => {
              deleteModal.destroy();
              deleteModalElement.remove();
            }
          }
        );
        deleteModal.open();
        break;
      case 'view':
        window.location.href = `/query_results/${queryResultId}`;
        break;
      default:
        break;
    }
  }

  onPATCH(patch) {
    let filteredPatch;
    let match;
    let operation;
    let queryResultId;
    let re;
    let valueName;

    re = new RegExp(`^/users/${this.userId}/query_results/([A-Za-z0-9]*)`);
    filteredPatch = patch.filter(operation => re.test(operation.path));
    for (operation of filteredPatch) {
      switch(operation.op) {
        case 'add':
          re = new RegExp(`^/users/${this.userId}/query_results/([A-Za-z0-9]*)$`);
          if (re.test(operation.path)) {
            this.add(operation.value);
          }
          break;
        case 'remove':
          re = new RegExp(`^/users/${this.userId}/query_results/([A-Za-z0-9]*)$`);
          if (re.test(operation.path)) {
            [match, queryResultId] = operation.path.match(re);
            this.remove(queryResultId);
          }
          break;
        case 'replace':
          re = new RegExp(`^/users/${this.userId}/query_results/([A-Za-z0-9]*)/(corpus_title|description|query|title)$`);
          if (re.test(operation.path)) {
            [match, queryResultId, valueName] = operation.path.match(re);
            this.replace(queryResultId, valueName.replace('_', '-'), operation.value);
          }
          break;
        default:
          break;
      }
    }
  }
}
