import { DefaultTemplateHandlerParams, IComponent } from "types";
import { logger } from "./Logger";
import { GlobalProcessor as Processor } from "./Processor";
import { RegisterClass } from "./RegisterClass";

export class DefaultTemplateHandler {
  template = "";
  __definition = {};
  static __definition = {};
  component?: IComponent;

  constructor({ component, template }: DefaultTemplateHandlerParams) {
    this.component = component;
    this.template = template;
  }

  assign(data: any): string {
    const templateInstance = this;
    if (typeof templateInstance.component === "undefined") {
      throw new Error("DefaultTemplateHandler.assign: component is undefined");
    }
    if (typeof templateInstance.component.processorHandler === "undefined") {
      throw new Error("DefaultTemplateHandler.assign: component.processorHandler is undefined");
    }
    const processorHandler = templateInstance.component.processorHandler;
    processorHandler.component = templateInstance.component;
    let parsedAssignmentText = (typeof templateInstance.template !== "undefined") ? (templateInstance.template) : ("");
    if (typeof data === "object") {
      [...Object.keys(data)].map((k): any => {
        let _value = data[k];
        if (typeof _value === "string" || typeof _value === "number" || (!isNaN(_value))) {
          try {
            _value = Processor.processObject.bind(processorHandler).call(processorHandler, _value, templateInstance.component);
            parsedAssignmentText = parsedAssignmentText.replace((new RegExp(`{{${k}}}`, "g")), _value);
          } catch (e: any) {
            logger.warn(`${templateInstance.component?.name} could not parse processors.`);
            throw Error(`${templateInstance.component?.name} could not parse processors. Reason: ${e.message}`);
          }
        }
        return k;
      });
    } else {
      logger.debug(`${templateInstance.component?.name}.data is not an object`);
    }
    try {
      parsedAssignmentText = Processor.processObject.call(processorHandler, parsedAssignmentText, templateInstance.component);
    } catch (e: any) {
      logger.warn(`${templateInstance.component?.name} could not parse processors.`);
      throw Error(`${templateInstance.component?.name} could not parse processors. Reason: ${e.message}`);
    }
    return parsedAssignmentText;
  }

}
RegisterClass(DefaultTemplateHandler, "com.qcobjects");
