import {DefaultJitsuEvent} from "@jitsu/types/event";
import {DestinationFunction, DestinationMessage, JitsuDestinationContext} from "@jitsu/types/extension";

export type ElasticsearchDestinationConfig = {
    anonymous?: boolean,
    elasticsearch_domain: string,
    elasticsearch_port: string,
    elasticsearch_target: string,
    elasticsearch_apikey: string,
}

export const JitsuElasticsearch: DestinationFunction<DefaultJitsuEvent, ElasticsearchDestinationConfig> =  (event: DefaultJitsuEvent, dstContext: JitsuDestinationContext<ElasticsearchDestinationConfig>) => {
    const context = event.eventn_ctx || event;
    const config = dstContext.config

    // Remove JITSU fields
    if(context.JITSU_ENVELOP){
      delete context["JITSU_ENVELOP"];
    }
    if(context.__HTTP_CONTEXT__){
      delete context["__HTTP_CONTEXT__"];
    }

    if(config.anonymous){
      context.source_ip = "000.000.000.000"; // masl ip
      if(context.ids){
        context.ids.ga = "undefined"; // mask ga
      }
    }

    const myHeaders = {
      "Authorization": "ApiKey "+config.elasticsearch_apikey,
      "Content-Type": "application/json",
      "User-Agent": context.user_agent,
      "X-Forwarded-For": context.source_ip,
    }

    var posturl = config.elasticsearch_domain;
    if(typeof config.elasticsearch_port !== "undefined" && config.elasticsearch_port !== ""){
      posturl = posturl + ":" + config.elasticsearch_port
    }
    posturl = posturl + "/" + config.elasticsearch_target + "/_doc/"

    let envelops:DestinationMessage[] = [];
    envelops.push({
      method: "POST",
      url: posturl,
      headers: myHeaders,
      body:context
    });
    return envelops;
}
