/*******************************************************************************
 * Copyright (c) 2011-2012 Oracle. All rights reserved. This program and the
 * accompanying materials are made available under the terms of the Eclipse
 * Public License v1.0 and Eclipse Distribution License v. 1.0 which accompanies
 * this distribution. The Eclipse Public License is available at
 * http://www.eclipse.org/legal/epl-v10.html and the Eclipse Distribution
 * License is available at http://www.eclipse.org/org/documents/edl-v10.php.
 * 
 * Contributors: dclarke - Bug 361016: Future Versions Examples
 ******************************************************************************/
package tests;

import static example.PersonModelExample.T1;
import static example.PersonModelExample.T2;
import static example.PersonModelExample.T3;
import static example.PersonModelExample.T4;
import static example.PersonModelExample.T5;
import static example.PersonModelExample.T6;
import static temporal.Effectivity.BOT;

import java.util.List;

import model.Person;
import model.PersonHobby;

import org.junit.Assert;
import org.junit.Test;

import temporal.TemporalEntityManager;
import example.PersonModelExample;

/**
 * 
 * @author dclarke
 * @since EclipseLink 2.3.1
 */
public class FuturePersonTests extends BaseTestCase {

    private static PersonModelExample example = new PersonModelExample();

    private Person getSample() {
        return example.futurePerson;
    }

    @Override
    public void populate(TemporalEntityManager em) {
        example.populateHobbies(em);
        for (PersonHobby ph : example.futurePerson.getPersonHobbies().values()) {
            em.persist(ph);
        }
        em.persist(example.futurePerson);
    }

    @Test
    public void queryAllCurrent() {
        TemporalEntityManager em = getEntityManager();

        List<Person> results = example.queryAllCurrent(em);

        Assert.assertTrue(results.isEmpty());
    }

    @Test
    public void queryPersonEditionAtBOT() {
        TemporalEntityManager em = getEntityManager();
        em.setProperty("EFF_TS", BOT);

        List<Person> results = em.createQuery("SELECT p FROM Person p WHERE p.cid = " + getSample().getId(), Person.class).getResultList();

        Assert.assertTrue("Editions found", results.isEmpty());
    }

    @Test
    public void queryFutureEditionOfCurrentPersonAtT1() {
        TemporalEntityManager em = getEntityManager();
        em.setProperty("EFF_TS", T1);

        List<Person> results = em.createQuery("SELECT p FROM Person p WHERE p.cid = " + getSample().getId(), Person.class).getResultList();

        Assert.assertTrue("Editions found", results.isEmpty());
    }

    @Test
    public void queryFutureEditionOfCurrentPersonAtT2() {
        TemporalEntityManager em = getEntityManager();
        em.setEffectiveTime(T2);

        List<Person> results = em.createQuery("SELECT p FROM Person p WHERE p.cid = " + getSample().getId(), Person.class).getResultList();

        System.out.println("QUERY EFFECTIVE @ T2:");
        for (Person p : results) {
            System.out.println("\t>" + p);
            System.out.println("\t\t>" + p.getAddress());
            System.out.println("\t\t>" + p.getPhones().values());
        }

        Assert.assertFalse("No Editions found", results.isEmpty());
        Assert.assertEquals(1, results.size());

        Person person = results.get(0);

        Assert.assertSame(person, person.getContinuity());
        Assert.assertFalse(person.getEffectivity().isCurrent());
        Assert.assertTrue(person.getEffectivity().isFutureEdition());
        Assert.assertEquals(getSample().getId(), person.getId());
        Assert.assertEquals(getSample().getName(), person.getName());
        Assert.assertNull(person.getAddress());
        Assert.assertTrue(person.getPhones().isEmpty());
    }

    @Test
    public void queryFutureEditionOfCurrentPersonAtT3() {
        TemporalEntityManager em = getEntityManager();
        em.setEffectiveTime(T3);

        List<Person> results = em.createQuery("SELECT p FROM Person p WHERE p.cid = " + getSample().getId(), Person.class).getResultList();

        System.out.println("QUERY EFFECTIVE @ T3:");
        for (Person p : results) {
            System.out.println("\t>" + p);
            System.out.println("\t\t>" + p.getAddress());
            System.out.println("\t\t>" + p.getPhones().values());
        }

        Assert.assertFalse("No Editions found", results.isEmpty());
        Assert.assertEquals(1, results.size());

        Person person = results.get(0);

        Assert.assertSame(person, person.getContinuity());
        Assert.assertFalse(person.getEffectivity().isCurrent());
        Assert.assertTrue(person.getEffectivity().isFutureEdition());
        Assert.assertEquals(getSample().getId(), person.getId());
        Assert.assertEquals(getSample().getName(), person.getName());
        Assert.assertNotNull(person.getAddress());
        Assert.assertTrue(person.getPhones().isEmpty());
    }

    @Test
    public void queryFutureEditionOfCurrentPersonAtT4() {
        TemporalEntityManager em = getEntityManager();
        em.setEffectiveTime(T4);

        List<Person> results = em.createQuery("SELECT p FROM Person p WHERE p.cid = " + getSample().getId(), Person.class).getResultList();

        Assert.assertFalse("No PersonEdition Found", results.isEmpty());

        System.out.println("QUERY EFFECTIVE @ T4:");
        for (Person p : results) {
            System.out.println("\t>" + p);
            System.out.println("\t\t>" + p.getAddress());
            System.out.println("\t\t>" + p.getPhones().values());
        }

        Assert.assertFalse("No Editions found", results.isEmpty());
        Assert.assertEquals(1, results.size());

        Person person = results.get(0);

        Assert.assertSame(person, person.getContinuity());
        Assert.assertFalse(person.getEffectivity().isCurrent());
        Assert.assertTrue(person.getEffectivity().isFutureEdition());
        Assert.assertEquals(getSample().getId(), person.getId());
        Assert.assertEquals(getSample().getName(), person.getName());
        Assert.assertNotNull(person.getAddress());
        Assert.assertFalse(person.getPhones().isEmpty());
    }

    @Test
    public void queryFutureEditionOfCurrentPersonAtT5() {
        TemporalEntityManager em = getEntityManager();
        em.setEffectiveTime(T5);

        List<Person> results = em.createQuery("SELECT p FROM Person p WHERE p.cid = " + getSample().getId(), Person.class).getResultList();

        System.out.println("QUERY EFFECTIVE @ T5:");
        for (Person p : results) {
            System.out.println("\t>" + p);
            System.out.println("\t\t>" + p.getAddress());
            System.out.println("\t\t>" + p.getPhones().values());
        }

        Assert.assertFalse("No Editions found", results.isEmpty());
        Assert.assertEquals(1, results.size());

        Person person = results.get(0);

        Assert.assertSame(person, person.getContinuity());
        Assert.assertFalse(person.getEffectivity().isCurrent());
        Assert.assertTrue(person.getEffectivity().isFutureEdition());
        Assert.assertEquals(getSample().getId(), person.getId());
        Assert.assertEquals(getSample().getName(), person.getName());
        Assert.assertNotNull(person.getAddress());
        Assert.assertFalse(person.getPhones().isEmpty());
    }

    @Test
    public void verifyCreateNewEntityInFuture() {
        TemporalEntityManager em = getEntityManager();
        em.setEffectiveTime(T6);

        em.getTransaction().begin();

        Person p = em.newEntity(Person.class);

        Assert.assertNotNull(p);
        Assert.assertNotNull(p.getEffectivity());

        em.getTransaction().rollback();
    }

}
