package net.ihe.xcpd.resp.action;

import org.jboss.seam.util.Base64;

import net.ihe.gazelle.sch.validator.ws.GazelleObjectValidatorServiceStub;
import net.ihe.gazelle.sch.validator.ws.ValidateObject;
import net.ihe.gazelle.sch.validator.ws.ValidateObjectE;
import net.ihe.gazelle.sch.validator.ws.ValidateObjectResponseE;
import net.ihe.gazelle.simulator.common.model.ApplicationConfiguration;
import net.ihe.xcpd.resp.tools.XSDValidator;

/**
 * 
 * @author abderrazek boufahja
 *
 */
public class HL7V3Validator {
    
    public HL7V3Validator(){
    }
    
    public static boolean validateRequestV3XCPD(String requestV3){
        return validateHL7V3ByMetaData(requestV3, "IHE - XCPD ITI-55 (request)");
    }
    
    public static boolean validateHL7V3ByMetaData(String requestV3, String metaData){
        boolean isValid = false;
        if (requestV3 == null){
            return false;
        }
        try{
            String targetEndpoint = ApplicationConfiguration.getValueOfVariable("schematron_validator");
            String xmlMetaData = metaData;
            String xmlRefStandard = "HL7v3";
            String detailedResult = getValidationResult(targetEndpoint, xmlMetaData, xmlRefStandard, requestV3);
            if (detailedResult.contains("<ValidationTestResult>PASSED</ValidationTestResult>")){
                isValid = true;
            }
            else{
                isValid = false;
                System.out.println("res = " + detailedResult);
            }
        }
        catch(Exception e){
            e.printStackTrace();
        }
        return isValid;
    }
    
    public static boolean validateResponseV3XCPD(String responseV3){
        return validateHL7V3ByMetaData(responseV3, "IHE - XCPD ITI-55 (response)");
    }
    
    public static String getValidationResultV3(String xmlMetaData,String message){
        String result = new String();
        String targetEndpoint = ApplicationConfiguration.getValueOfVariable("schematron_validator");
        String xmlRefStandard = "HL7v3";
        try {
            GazelleObjectValidatorServiceStub stub = new GazelleObjectValidatorServiceStub(targetEndpoint);
            ValidateObject params = new ValidateObject();
            params.setXmlMetadata(xmlMetaData);
            params.setXmlReferencedStandard(xmlRefStandard);
            String msgToSend = Base64.encodeBytes(message.getBytes());
            params.setBase64ObjectToValidate(msgToSend);
            ValidateObjectE paramsE = new ValidateObjectE();
            paramsE.setValidateObject(params);
            ValidateObjectResponseE responseE = stub.validateObject(paramsE);
            result = responseE.getValidateObjectResponse().getValidationResult();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
        
    }
    
    private static String getValidationResult(String targetEndpoint, String xmlMetaData, String xmlRefStandard, String message){
        String result = new String();
        try {
            GazelleObjectValidatorServiceStub stub = new GazelleObjectValidatorServiceStub(targetEndpoint);
            ValidateObject params = new ValidateObject();
            params.setXmlMetadata(xmlMetaData);
            params.setXmlReferencedStandard(xmlRefStandard);
            String msgToSend = Base64.encodeBytes(message.getBytes());
            params.setBase64ObjectToValidate(msgToSend);
            
            ValidateObjectE paramsE = new ValidateObjectE();
            paramsE.setValidateObject(params);
            ValidateObjectResponseE responseE = stub.validateObject(paramsE);
            result = responseE.getValidateObjectResponse().getValidationResult();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
        
    }
    
    public static boolean validateRequestV3(String requestXCPD){
        boolean isValid = false;
        if (requestXCPD == null) return false;
        String pathXSD = ApplicationConfiguration.getValueOfVariable("xcpd_request_schema");
        isValid = XSDValidator.validXMLWithDOM(requestXCPD, pathXSD);
        return isValid;
    }
    
    public static boolean validateResponseV3(String responseXCPD){
        boolean isValid = false;
        if (responseXCPD == null) return false;
        String pathXSD = ApplicationConfiguration.getValueOfVariable("xcpd_response_schema");
        isValid = XSDValidator.validXMLWithDOM(responseXCPD, pathXSD);
        return isValid;
    }

}
