/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

package org.apache.ode.dao.jpa.test;

import junit.framework.TestCase;
import org.apache.ode.bpel.common.CorrelationKey;
import org.apache.ode.bpel.common.CorrelationKeySet;
import org.apache.ode.bpel.dao.BpelDAOConnection;
import org.apache.ode.bpel.dao.CorrelationSetDAO;
import org.apache.ode.bpel.dao.CorrelatorDAO;
import org.apache.ode.bpel.dao.MessageDAO;
import org.apache.ode.bpel.dao.MessageExchangeDAO;
import org.apache.ode.bpel.dao.PartnerLinkDAO;
import org.apache.ode.bpel.dao.ProcessDAO;
import org.apache.ode.bpel.dao.ProcessInstanceDAO;
import org.apache.ode.bpel.dao.ScopeDAO;
import org.apache.ode.bpel.dao.ScopeStateEnum;
import org.apache.ode.bpel.dao.XmlDataDAO;
import org.apache.ode.dao.jpa.BPELDAOConnectionFactoryImpl;
import org.apache.ode.il.EmbeddedGeronimoFactory;
import org.apache.ode.utils.DOMUtils;
import org.apache.ode.utils.GUID;
import org.hsqldb.jdbc.JDBCDataSource;
import org.xml.sax.SAXException;

import javax.sql.DataSource;
import javax.transaction.TransactionManager;
import javax.xml.namespace.QName;
import java.io.IOException;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Properties;

public class InsertObjectTest extends TestCase {

    private static final String TEST_NS = "http://org.apache.ode.jpa.test";
    private static final String CORRELATOR_ID1 = "testCorrelator1";
    private static final String CORRELATOR_ID2 = "testCorrelator2";
    private static final Calendar cal = new GregorianCalendar();

    TransactionManager _txm;
    DataSource _ds;
    BPELDAOConnectionFactoryImpl factory;
    ProcessDAO _process;

    @Override
    protected void setUp() throws Exception {
        JDBCDataSource hsqlds = new JDBCDataSource();
        hsqlds.setDatabase("jdbc:hsqldb:mem:" + new GUID().toString());
        hsqlds.setUser("sa");
        hsqlds.setPassword("");
        Properties prop = new Properties();
        prop.setProperty("sql.enforce_size", "false");
        hsqlds.setProperties(prop);
        _ds = hsqlds;

        _txm = new EmbeddedGeronimoFactory().getTransactionManager();

        factory = new BPELDAOConnectionFactoryImpl();
        factory.setDataSource(_ds);
        factory.setTransactionManager(_txm);
        Properties props = new Properties();
        props.put("openjpa.jdbc.SynchronizeMappings", "buildSchema(ForeignKeys=false)");
        factory.init(props);

        _txm.begin();
    }

    public void testStart() throws Exception {
        createStuff(factory);
    }

    void createStuff(BPELDAOConnectionFactoryImpl factory) throws Exception {
        BpelDAOConnection conn = factory.getConnection();

        CorrelatorDAO corr = createProcess(conn,"testPID1","testType");
        ProcessInstanceDAO pi1 = createProcessInstance(_process, corr);
    }

    @Override
    protected void tearDown() throws Exception {
        _txm.commit();
        _ds = null;
        _txm = null;
    }

    private MessageExchangeDAO createMessageExchange(ProcessDAO p, ProcessInstanceDAO pi, PartnerLinkDAO pl ) throws SAXException, IOException {
        MessageExchangeDAO me = pi.getConnection().createMessageExchange('0');

        me.setCallee(new QName(TEST_NS,"testCallee"));
        me.setChannel("testChannel");
        me.setCorrelationId("testCorrelationId");
        me.setCorrelationStatus("testCorrelationStatus");
        me.setEPR(DOMUtils.stringToDOM("<testEPR>EPR</testEPR>"));
        me.setFault(new QName("testFault"));
        me.setFaultExplanation("testFaultExplanation");
        me.setInstance(pi);
        me.setOperation("testOperation");
        me.setPartnerLink(pl);
        me.setPartnerLinkModelId(1);
        me.setPattern("testPattern");
        me.setPortType(new QName(TEST_NS,"testPortType"));
        me.setProcess(p);
        me.setProperty("testProp1Key", "testProp1");
        me.setProperty("testProp2Key", "testProp2");
        me.setRequest(createMessage(me,"testRequest"));
        me.setResponse(createMessage(me,"testResponse"));
        me.setStatus("testStatus");

        return me;
    }

    private MessageDAO createMessage(MessageExchangeDAO me, String name) throws SAXException, IOException {
        MessageDAO m = me.createMessage(new QName(TEST_NS,name));

        m.setType(new QName(TEST_NS,name));
        m.setData(DOMUtils.stringToDOM("<testData>some test data</testData>"));

        return m;
    }

    private CorrelatorDAO createProcess(BpelDAOConnection conn, String pid, String type) {
        _process = conn.createProcess(new QName(TEST_NS,pid), new QName(TEST_NS,type),"GUID1",1);
        CorrelatorDAO corr = _process.addCorrelator(CORRELATOR_ID1);
        _process.addCorrelator(CORRELATOR_ID2);
        return corr;
    }

    private ProcessInstanceDAO createProcessInstance(ProcessDAO process, CorrelatorDAO corr) throws SAXException, IOException {
        ProcessInstanceDAO pi = null;
        String[] actions = { "action1","action2" };
        String[] correlationKeys = { "key1", "key2" };
        CorrelationKey key1 = new CorrelationKey("key1",correlationKeys);
        CorrelationKey key2 = new CorrelationKey("key2",correlationKeys);
        CorrelationKey[] corrkeys = {key1,key2};
        QName[] names = { new QName(TEST_NS,"name1"), new QName(TEST_NS,"name2") };

        pi = process.createInstance(corr);

        pi.setExecutionState(new String("test execution state").getBytes());
        pi.setFault(new QName(TEST_NS,"testFault"), "testExplanation", 1, 1, DOMUtils.stringToDOM("<testFaultMessage>testMessage</testFaultMessage>"));
        pi.setLastActiveTime(cal.getTime());
        pi.setState((short) 1);

        pi.createActivityRecovery("testChannel1", 3, "testReason1", cal.getTime(), DOMUtils.stringToDOM("<testData>testData1</testData>"), actions, 2);
        pi.createActivityRecovery("testChannel2", 4, "testReason2", cal.getTime(), DOMUtils.stringToDOM("<testData>testData2</testData>"), actions, 2);

        ScopeDAO root = pi.createScope(null, "Root", 1);
        root.setState(ScopeStateEnum.ACTIVE);
        ScopeDAO child1 = pi.createScope(root, "Child1", 2);
        child1.setState(ScopeStateEnum.ACTIVE);
        XmlDataDAO var1 = child1.getVariable("var1");
        var1.set(DOMUtils.stringToDOM("<testData>testData</testData>"));
        var1.setProperty("key1", "prop1");
        var1.setProperty("key2", "prop2");
        XmlDataDAO var2 = child1.getVariable("var2");
        var2.set(DOMUtils.stringToDOM("<testData>testData</testData>"));
        var2.setProperty("key1", "prop1");
        var2.setProperty("key2", "prop2");

        CorrelationSetDAO cs1 = child1.getCorrelationSet("TestCorrelationSet1");
        cs1.setValue(names,key1);

        PartnerLinkDAO pl1 = child1.createPartnerLink(1, "Test PartnerLink1", "MyRole1", "PartnerRole1");
        pl1.setMyEPR(DOMUtils.stringToDOM("<testEPR>testMyEPR</testEPR>"));
        pl1.setMyRoleServiceName(new QName(TEST_NS,"testRoleService"));
        pl1.setMySessionId("TestMySessionID");
        pl1.setPartnerEPR(DOMUtils.stringToDOM("<testEPR>testPartnerEPR</testEPR>"));
        pl1.setPartnerSessionId("TestPartnerSessionID");

        MessageExchangeDAO mex = createMessageExchange(process,pi,pl1);

        corr.addRoute("testRoute", pi, 1, new CorrelationKeySet().add(key1), "one");
        corr.enqueueMessage(mex, new CorrelationKeySet().add(corrkeys[0]).add(corrkeys[1]));

        return pi;
    }

}
