package dst.ass1.jpa.tests;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

import java.util.List;

import javax.persistence.EntityManager;

import org.junit.Rule;
import org.junit.Test;

import dst.ass1.jpa.ORMService;
import dst.ass1.jpa.dao.IDAOFactory;
import dst.ass1.jpa.listener.DefaultListener;
import dst.ass1.jpa.model.IModelFactory;
import dst.ass1.jpa.model.IParticipant;

public class Ass1_3_2Test {

    @Rule
    public ORMService orm = new ORMService();

    @Test
    public void testDefaultListener() {
        DefaultListener.clear();

        IDAOFactory daoFactory = orm.getDaoFactory();
        IModelFactory modelFactory = orm.getModelFactory();
        EntityManager em = orm.getEntityManager();

        em.getTransaction().begin();

        // do some inserts
        IParticipant participant = modelFactory.createParticipant();
        participant.setName(TestData.PARTICIPANT_1_NAME);
        participant.setEmail(TestData.PARTICIPANT_1_EMAIL);
        em.persist(participant);
        em.flush();
        em.remove(participant);
        em.flush();

        participant = modelFactory.createParticipant();
        participant.setName(TestData.PARTICIPANT_2_NAME);
        participant.setEmail(TestData.PARTICIPANT_2_EMAIL);
        em.persist(participant);

        assertEquals(1, DefaultListener.getRemoveOperations());
        assertTrue(DefaultListener.getPersistOperations() > 0);
        assertEquals((double) DefaultListener.getOverallTimeToPersist() / DefaultListener.getPersistOperations(), DefaultListener.getAverageTimeToPersist(), 0.0);

        List<IParticipant> participants = daoFactory.createParticipantDAO().findAll();
        assertNotNull(participants);
        assertFalse(participants.isEmpty());

        int loadOperations = DefaultListener.getLoadOperations();
        em.refresh(participants.get(0));
        assertEquals(loadOperations + 1, DefaultListener.getLoadOperations());

        participants = daoFactory.createParticipantDAO().findAll();
        assertNotNull(participants);
        assertFalse(participants.isEmpty());

        participants.get(0).setName("updated");
        em.persist(participants.get(0));
        em.flush();

        assertEquals(1, DefaultListener.getUpdateOperations());
    }
}
