package net.ihe.xcpd.resp.action;

import gazelle.ihe.net.hl7.translator.PDQRequestV3ToV2Translator;
import gazelle.ihe.net.hl7.translator.PDQResponseV2ToV3Translator;

import java.io.Serializable;

import javax.ejb.Remove;
import javax.ejb.Stateful;

import net.ihe.gazelle.simulator.common.model.ApplicationConfiguration;
import net.ihe.xcpd.resp.tools.XmlFormatter;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Destroy;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.faces.FacesMessages;
import org.jboss.seam.log.Log;

/**
 * @author Abderrazek Boufahja > INRIA Rennes IHE development Project
 *
 */
@Stateful
@Name("mapperManager")
@Scope(ScopeType.SESSION)
public class MapperManager implements MapperManagerLocal, Serializable{

   
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    
  //~ Statics variables and Class initializer ////////////////////////////////////////

    /** Logger */
    @Logger
    private static Log log;

    //~ Attribute ///////////////////////////////////////////////////////////////////////
    
    private String requestV3;
    
    private String requestV2;
    
    private String initialV3;
    
    private String responseV2;
    
    private String responseV3;
    
    private boolean validRequest = false;
    
    //~ getters and setters /////////////////////////////////////////////////////////////
     
    public void setValidRequest(boolean validRequest) {
        this.validRequest = validRequest;
    }

    public boolean isValidRequest() {
        return validRequest;
    }

    public String getRequestV2() {
        return requestV2;
    }

    public void setRequestV2(String requestV2) {
        this.requestV2 = requestV2;
    }
    
    public String getRequestV3() {
        return requestV3;
    }

    public void setRequestV3(String requestV3) {
        this.requestV3 = requestV3;
    }

    public String getResponseV3() {
        return responseV3;
    }

    public void setResponseV3(String responseV3) {
        this.responseV3 = responseV3;
    }

    public void setInitialV3(String initialV3) {
        this.initialV3 = initialV3;
    }

    public String getInitialV3() {
        return initialV3;
    }

    public void setResponseV2(String responseV2) {
        this.responseV2 = responseV2;
    }

    public String getResponseV2() {
        return responseV2;
    }

    public static void setLog(Log log) {
        MapperManager.log = log;
    }

    public static Log getLog() {
        return log;
    }

    // methods /////////////////////////////////////////////////////////////////////////
    
    public void transformV3ToV2() throws Exception{
        if (requestV3 != null){
            if (requestV3.equals("")){
                requestV2 = null;
                FacesMessages.instance().add("The HL7V3 is null.");
                return;
            }
            String req = PDQRequestV3ToV2Translator.translateRequestV3ToV2(requestV3);
            requestV2 = req;
        }
    }
    
    public void transformV2ToV3() throws Exception{
        if ((responseV2 != null) && (initialV3 != null)){
            responseV2 = responseV2.replace("\n", "\r");
            responseV2 = responseV2.replace("\r\r", "\r");
            String systemRootId = ApplicationConfiguration.getValueOfVariable("system_id_root");
            String res = PDQResponseV2ToV3Translator.translateResponseV2ToV3(responseV2, initialV3, systemRootId);
            if (res == null) {
                FacesMessages.instance().add("Problem on the mapping, please review the structure of HL7V2 Response.");
                return;
            }
            responseV3 = XmlFormatter.transformXMLToHTML(res);
        }
        else{
            FacesMessages.instance().add("The initial Request HL7V3 and the response HL7V2 must not be null.");
        }
    }
    
    public void validateV3Request(){
        this.validRequest = HL7V3Validator.validateRequestV3(this.requestV3);
        if (this.validRequest){
            FacesMessages.instance().add("Well formed request");
        }
        else{
            FacesMessages.instance().add("Not Well formet request");
        }
    }
    
    public void validateV3Request(String request){
        this.validRequest = HL7V3Validator.validateRequestV3(request);
        if (this.validRequest){
            FacesMessages.instance().add("Well formed request");
        }
        else{
            FacesMessages.instance().add("Not Well formet request");
        }
    }

    // destroy method ///////////////////////////////////////////////////////////////////
    
    @Destroy
    @Remove
    public void destroy()
    {
        log.info("destroy");
    }
}
