import {CCApi} from '../../../../common/api.js';
import {getAuthUser} from '../../../../common/communityConsoleUtils.js';

const kPiiScanType_ScanNone = 0;
const kType_Reply = 1;
const kType_RecommendedAnswer = 3;
const kPostMethodCommunityConsole = 4;

const kVariablesRegex = /\$([A-Za-z_]+)/g;

export default class CRRunner {
  constructor() {
    this._CRs = [];
    this._haveCRsBeenLoaded = false;
  }

  loadCRs() {
    return CCApi(
               'ListCannedResponses', {}, /* authenticated = */ true,
               getAuthUser())
        .then(res => {
          this._CRs = res?.[1] ?? [];
          this._haveCRsBeenLoaded = true;
        });
  }

  _getCRPayload(id) {
    let maybeLoadCRsPromise;
    if (!this._haveCRsBeenLoaded)
      maybeLoadCRsPromise = this.loadCRs();
    else
      maybeLoadCRsPromise = Promise.resolve();

    return maybeLoadCRsPromise.then(() => {
      let cr = this._CRs.find(cr => cr?.[1]?.[1] == id);
      if (!cr) throw new Error(`Couldn't find CR with id ${id}.`);
      return cr?.[3];
    });
  }

  _templateSubstitute(payload, thread) {
    if (!payload.match(kVariablesRegex)) return Promise.resolve(payload);

    return thread.loadThreadDetails().then(() => {
      return payload.replaceAll(kVariablesRegex, (_, p1) => {
        return thread?.[p1] ?? '';
      });
    });
  }

  execute(action, thread) {
    let crId = action?.getCannedResponseId?.();
    if (!crId)
      return Promise.reject(
          new Error('The action doesn\'t contain a valid CR id.'));

    return this._getCRPayload(crId)
        .then(payload => this._templateSubstitute(payload, thread))
        .then(payload => {
          let subscribe = action?.getSubscribe?.() ?? false;
          let markAsAnswer = action?.getMarkAsAnswer?.() ?? false;
          return CCApi(
              'CreateMessage', {
                1: thread.forumId,
                2: thread.threadId,
                // message
                3: {
                  4: payload,
                  6: {
                    1: markAsAnswer ? kType_RecommendedAnswer : kType_Reply,
                  },
                  11: kPostMethodCommunityConsole,
                },
                4: subscribe,
                6: kPiiScanType_ScanNone,
              },
              /* authenticated = */ true, getAuthUser());
        });
  }
}
