import CONFIG from './config';
import Vue, { PropType } from 'vue';
export default Vue.component('message', {
  data() {
    return {};
  },
  computed: {
    textEscaped(): string {
      let s = this.template ? this.template : this.templates[this.templateId];
      //This hack is required to preserve backwards compatability
      if (!this.template && this.templateId == CONFIG.defaultTemplateId
          && this.args.length == 1) {
        s = this.templates[CONFIG.defaultAltTemplateId] //Swap out default template :/
      }
      s = s.replace(`@default`, this.templates[this.templateId]);
      s = s.replace(/{(\d+)}/g, (match, number) => {
        const argEscaped = this.args[number] != undefined ? this.escape(this.args[number]) : match;
        if (number == 0 && this.color) {
          //color is deprecated, use templates or ^1 etc.
          return this.colorizeOld(argEscaped);
        }
        return argEscaped;
      });
      // format variant args
      s = s.replace(/\{\{([a-zA-Z0-9_\-]+?)\}\}/g, (match, id) => {
        const argEscaped = this.params[id] != undefined ? this.escape(this.params[id]) : match;
        return argEscaped;
      });
      return this.colorize(s);
    },
  },
  methods: {
    colorizeOld(str: string): string {
      return `${str}`
    },
    colorize(str: string): string {
      let s = "" + colorTrans(str) + "";
      const styleDict: {[ key: string ]: string} = {
        '*': 'font-weight: bold;',
        '_': 'text-decoration: underline;',
        '~': 'text-decoration: line-through;',
        '=': 'text-decoration: underline line-through;',
        'r': 'text-decoration: none;font-weight: normal;',
      };
      const styleRegex = /\^(\_|\*|\=|\~|\/|r)(.*?)(?=$|\^r|<\/em>)/;
      while (s.match(styleRegex)) { //Any better solution would be appreciated :P
        s = s.replace(styleRegex, (str, style, inner) => `${inner}`)
      }
      return s.replace(/]*><\/span[^>]*>/g, '');
      function colorTrans(str: string) {
        return str
          .replace(/\^([0-9])/g, (str, color) => ``)
          .replace(/\^#([0-9A-F]{3,6})/gi, (str, color) => ``)
          .replace(/~([a-z])~/g, (str, color) => ``);
      }
    },
    escape(unsafe: string): string {
      return String(unsafe)
       .replace(/&/g, '&')
       .replace(//g, '>')
       .replace(/"/g, '"')
       .replace(/'/g, ''');
    },
  },
  props: {
    templates: {
      type: Object as PropType<{ [key: string]: string }>,
    },
    args: {
      type: Array as PropType,
    },
    params: {
      type: Object as PropType<{ [ key: string]: string }>,
    },
    template: {
      type: String,
      default: null,
    },
    templateId: {
      type: String,
      default: CONFIG.defaultTemplateId,
    },
    multiline: {
      type: Boolean,
      default: false,
    },
    color: { //deprecated
      type: Array as PropType,
      default: null,
    },
  },
});