/*******************************************************************************
 * Copyright (c) 2017 Pegasystems Inc. All rights reserved.
 *
 * Contributors:
 *     Manu Varghese
 *******************************************************************************/

package com.pega.gcs.tracerviewer.model;

import org.dom4j.Element;

public class TraceEventInteraction extends TraceEventNonActivity {

    public TraceEventInteraction(TraceEventKey traceEventKey, byte[] bytes, Element traceEventElement) {

        super(traceEventKey, bytes, traceEventElement);

        traceEventType = TraceEventType.INTERACTION;

    }

    /*
     * (non-Javadoc)
     * 
     * @see com.fringe.tracerviewer.TraceEvent#getRule()
     */
    @Override
    protected void setRuleNo(Element traceEventElement) {
        setRuleNo((Integer) null);
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.fringe.tracerviewer.TraceEvent#getStepMethod()
     */
    @Override
    protected void setStepMethod(Element traceEventElement) {
        setStepMethod("");
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.fringe.tracerviewer.TraceEvent#getStepPage()
     */
    @Override
    protected void setStepPage(Element traceEventElement) {
        setStepPage("");
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.fringe.tracerviewer.TraceEvent#getStep()
     */
    @Override
    protected void setStep(Element traceEventElement) {
        setStep("");
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.fringe.tracerviewer.TraceEvent#getStatus()
     */
    @Override
    protected void setStatus(Element traceEventElement) {
        String status = "";

        Element element = traceEventElement.element("InteractionBytes");

        if (element != null) {
            status = element.getText();
            status += "(b)";
        }

        setStatus(status);
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.fringe.tracerviewer.TraceEvent#getEventType()
     */
    @Override
    protected void setEventName(Element traceEventElement) {
        String eventName = "";

        Element element = traceEventElement.element("EventName");

        if (element != null) {
            eventName = element.getText();
        }

        setEventName(eventName);
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.fringe.tracerviewer.TraceEvent#getName()
     */
    @Override
    protected void setName(Element traceEventElement) {
        String name = "";

        Element element = traceEventElement.element("InteractionQueryParam");

        if (element != null) {
            name = element.getText();
        }

        setName(name);
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.fringe.tracerviewer.TraceEvent#getRuleSet()
     */
    @Override
    protected void setRuleSet(Element traceEventElement) {
        setRuleSet("");
    }

    @Override
    public Element getTraceEventPropertyElement() {

        Element traceEventPropertyElement = null;

        Element rootElement = getTraceEventRootElement();

        if (rootElement != null) {

            traceEventPropertyElement = getDefaultTraceEventPropertyElement(rootElement);

            // Interaction
            Element element = rootElement.element("InteractionBytes");

            if (element != null) {
                traceEventPropertyElement.add(createElement("Bytes", element));
            }

            // InteractionQueryParam
            element = rootElement.element("InteractionQueryParam");

            if (element != null) {
                traceEventPropertyElement.add(createElement("Query Param", element));
            }

            // InteractionQueryData
            element = rootElement.element("InteractionQueryData");

            if (element != null) {

                String queryData = element.getText();

                Element queryDataElem = createElement("Query Data", null, "QueryData");

                element = rootElement.element("JSONDataFlag");

                if (element != null) {
                    String jsonValue = element.getText();

                    // TODO: implement JSON parsing
                    if ("true".equals(jsonValue)) {
                        queryDataElem.setText(queryData);
                    } else {
                        queryDataElem = buildTokenTable(queryDataElem, queryData, "&");
                    }
                } else {
                    queryDataElem = buildTokenTable(queryDataElem, queryData, "&");
                }

                traceEventPropertyElement.add(queryDataElem);

            }

            // InteractionPAL
            element = rootElement.element("InteractionPAL");

            if (element != null) {

                String palData = element.getText();

                Element palDataElem = createElement("PAL", null, "PAL");

                palDataElem = buildTokenTable(palDataElem, palData, ";");

                traceEventPropertyElement.add(palDataElem);
            }
        }

        return traceEventPropertyElement;
    }

    @Override
    protected boolean checkStart() {

        boolean start = false;

        String eventName = getEventName();

        if ("Interaction Begin".equals(eventName)) {
            start = true;
        }

        return start;
    }

    @Override
    protected boolean checkEnd() {

        boolean end = false;

        String eventName = getEventName();

        if ("Interaction End".equals(eventName)) {
            end = true;
        }

        return end;
    }
}