/*******************************************************************************
 * 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 example;

import java.sql.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import model.Address;
import model.Hobby;
import model.Person;
import model.entities.AddressEntity;
import model.entities.PersonEntity;

import org.eclipse.persistence.jpa.JpaHelper;
import org.eclipse.persistence.sessions.server.Server;
import org.eclipse.persistence.tools.schemaframework.SchemaManager;

import temporal.Effectivity;
import temporal.TemporalEntityManager;

/**
 * This test case performs current and edition queries on a simple
 * Person-Address-Phones model both illustrating and verifying query operations.
 * 
 * @author dclarke
 * @since EclipseLink 2.3.1 
 */
public class PersonModelExample {

    public Person simplePerson;

    public Person fullPerson;

    public Person futurePerson;

    public Map<String, Hobby> hobbies = new HashMap<String, Hobby>();

    public static final long T1 = 100;
    public static final long T2 = 200;
    public static final long T3 = 300;
    public static final long T4 = 400;
    public static final long T5 = 500;
    public static final long T6 = 600;
    public static final long T7 = 700;
    public static final long T8 = 800;
    public static final long T9 = 900;
    public static final long T10 = 1000;

    public static final String GOLF = "Golfing";
    public static final String SKI = "Skiing";
    public static final String SWIM = "Swimming";
    public static final String RUN = "Running";
    public static final String PAINT = "Painting";

    public PersonModelExample() {
        // Create Hobbies
        this.hobbies.put(GOLF, new Hobby(GOLF, null));
        this.hobbies.put(SKI, new Hobby(SKI, null));
        this.hobbies.put(SWIM, new Hobby(SWIM, null));
        this.hobbies.put(RUN, new Hobby(RUN, null));
        this.hobbies.put(PAINT, new Hobby(PAINT, null));

        // Create Simple Person with no relationships
        this.simplePerson = new PersonEntity();
        this.simplePerson.setName("Bob");

        // create fullPerson
        this.fullPerson = new PersonEntity();
        this.fullPerson.setName("Jim");
        this.fullPerson.setAddress(new AddressEntity("123 Anywhere St", "Miami", "Florida"));
        this.fullPerson.addPhone("Home", "111-111-1111");
        this.fullPerson.setDateOfBirth(new Date(70, 8, 13));

        // create futurePerson
        this.futurePerson = new PersonEntity();
        this.futurePerson.setName("Sally");
        this.futurePerson.getEffectivity().setStart(T2);
        Address futureAddress = new AddressEntity("45 O'Connor Street", "Ottawa", "Ontario");
        futureAddress.getEffectivity().setStart(T3);
        this.futurePerson.setAddress(futureAddress);
        this.futurePerson.addPhone("Work", "321-654-0987").getEffectivity().setStart(T4);
        this.futurePerson.addHobby(this.hobbies.get(GOLF), T2);
    }

    public static void main(String[] args) {
        PersonModelExample example = new PersonModelExample();
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("example");

        // Replace Schema
        Server session = JpaHelper.getServerSession(emf);
        SchemaManager sm = new SchemaManager(session);
        sm.replaceDefaultTables();
        sm.replaceSequences();

        EntityManager em = TemporalEntityManager.getInstance(emf.createEntityManager());

        em.getTransaction().begin();
        example.populateAll(em);
        em.getTransaction().commit();

        em.clear();
        em.getEntityManagerFactory().getCache().evictAll();
        example.queryAllCurrent(em);

        em.close();
        emf.close();
    }

    /**
     * Create a new Person edition based on the current starting at T2.
     */
    public void populateAll(EntityManager em) {
        populateHobbies(em);
        em.persist(this.simplePerson);
        em.persist(this.fullPerson);
        em.persist(this.futurePerson);
    }

    public void populateHobbies(EntityManager em) {
        for (Hobby h : this.hobbies.values()) {
            em.persist(h);
        }
    }

    public List<Person> queryAllCurrent(EntityManager em) {
        List<Person> results = em.createQuery("SELECT p From Person p", Person.class).getResultList();

        System.out.println("\nQUERY ALL CURRENT:");
        for (Person p : results) {
            System.out.println("\t>" + p);
        }

        return results;
    }

    public List<Person> queryAllCurrentJoinAddress(EntityManager em) {
        List<Person> results = em.createQuery("SELECT p From Person p JOIN FETCH p.address", Person.class).getResultList();

        System.out.println("\nQUERY CURRENT (JOIN ADDRESS):");
        for (Person p : results) {
            System.out.println("\t>" + p);
        }

        return results;
    }

    public Person queryCurrentSimple(EntityManager em) {
        Person person = em.createQuery("SELECT p From Person p WHERE p.id = " + this.simplePerson.getId(), Person.class).getSingleResult();
        person.getAddress();

        System.out.println("FIND CURRENT: " + person);
        return person;
    }

    public Person querySampleCurrentPersonJoinAddress(EntityManager em) {
        Person person = em.createQuery("SELECT p From Person p JOIN FETCH p.address WHERE p.id = " + this.simplePerson.getId(), Person.class).getSingleResult();
        person.getAddress();

        System.out.println("FIND CURRENT: " + person);

        return person;
    }

    public Person findSampleCurrentPerson(EntityManager em) {
        Person person = em.find(Person.class, this.simplePerson.getId());

        System.out.println("FIND CURRENT: " + person);

        return person;
    }

    public Person queryFutureEditionOfCurrentPersonAtBOT(TemporalEntityManager em) {
        em.setEffectiveTime(Effectivity.BOT);

        Person pEdition = em.createQuery("SELECT p FROM Person p WHERE p.cid = " + this.simplePerson.getId(), Person.class).getSingleResult();

        System.out.println("QUERY EDITION @ BOT: " + pEdition);

        return pEdition;
    }

    public Person queryFutureEditionOfCurrentPersonAtT1(TemporalEntityManager em) {
        em.setEffectiveTime(T1);

        Person pEdition = em.createQuery("SELECT p FROM Person p WHERE p.cid = " + this.simplePerson.getId(), Person.class).getSingleResult();

        System.out.println("QUERY EDITION @ T1: " + pEdition);

        return pEdition;
    }

    public Person queryFutureEditionOfCurrentPersonAtT2(TemporalEntityManager em) {
        em.setEffectiveTime(T2);

        Person pEdition = em.createQuery("SELECT p FROM Person p WHERE p.cid = " + this.simplePerson.getId(), Person.class).getSingleResult();

        System.out.println("QUERY EDITION @ T2: " + pEdition);

        return pEdition;
    }

    public Person queryFutureEditionOfCurrentPersonAtT2JoinFetchAddress(TemporalEntityManager em) {
        em.setEffectiveTime(T2);

        Person person = em.createQuery("SELECT p FROM Person p JOIN FETCH p.address WHERE p.cid = " + this.simplePerson.getId(), Person.class).getSingleResult();
        Address address = person.getAddress();

        System.out.println("QUERY EDITION @ T2: " + person);
        System.out.println("\t> " + address);

        return person;
    }

    public Person queryFutureEditionOfCurrentPersonAtT3(TemporalEntityManager em) {
        em.setEffectiveTime(T3);

        Person personEdition = em.createQuery("SELECT p FROM Person p WHERE p.cid = " + this.simplePerson.getId(), Person.class).getSingleResult();

        System.out.println("QUERY EDITION @ T3: " + personEdition);

        return personEdition;
    }

    public Person queryFutureEditionOfCurrentPersonAtT4(TemporalEntityManager em) {
        em.setEffectiveTime(T4);

        Person pEdition = em.createQuery("SELECT p FROM Person p WHERE p.cid = " + this.simplePerson.getId(), Person.class).getSingleResult();

        System.out.println("QUERY EDITION @ T4: " + pEdition);

        return pEdition;
    }

    public Person queryFutureEditionOfCurrentPersonAtT5(TemporalEntityManager em) {
        em.setEffectiveTime( T5);

        Person pEdition = em.createQuery("SELECT p FROM Person p WHERE p.cid = " + this.simplePerson.getId(), Person.class).getSingleResult();

        System.out.println("QUERY EDITION @ T5: " + pEdition);

        return pEdition;
    }

    public List<Person> nativeQueryForAllEdition(EntityManager em) {

        @SuppressWarnings("unchecked")
        List<Person> editions = em.createNativeQuery("SELECT * From TPERSON WHERE CID = " + this.simplePerson.getId(), Person.class).getResultList();

        System.out.println("QUERY ALL EDITIONS:");
        for (Person p : editions) {
            System.out.println("\t" + p);
        }

        return editions;
    }

}
