/*
 * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0,
 * or the Eclipse Distribution License v. 1.0 which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 */

// Contributors:
//     Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.testing.tests.jpa.inherited;

import java.util.Date;
import java.util.Calendar;
import org.eclipse.persistence.testing.models.jpa.inherited.*;
import org.eclipse.persistence.internal.jpa.EntityManagerImpl;
import org.eclipse.persistence.testing.framework.TestErrorException;
import org.eclipse.persistence.testing.tests.jpa.EntityContainerTestBase;

/**
 *
 * @author Guy Pelletier
 */
@SuppressWarnings("deprecation")
public class InheritedCRUDTest extends EntityContainerTestBase {
    protected boolean m_reset = false;    // reset gets called twice on error
    protected Exception m_exception;

    private BeerConsumer beerConsumer1, beerConsumer2;
    private Alpine alpine1, alpine2, alpine3;
    private Canadian canadian1, canadian2;

    public InheritedCRUDTest() {
        setDescription("Tests the creation of an inheritance subclass that uses multiple tables with a different pk column than its parent");
    }

    @Override
    public void setup () {
        super.setup();
        m_reset = true;
        m_exception = null;
        ((EntityManagerImpl)getEntityManager()).getActiveSession().getIdentityMapAccessor().initializeAllIdentityMaps();
    }

    @Override
    public void test() throws Exception {
        try {
            beginTransaction();

            beerConsumer1 = new BeerConsumer();
            beerConsumer1.setName("Guy Pelletier");
            getEntityManager().persist(beerConsumer1);

            beerConsumer2 = new BeerConsumer();
            beerConsumer2.setName("Tom Ware");
            getEntityManager().persist(beerConsumer2);
            SerialNumber serialNumber1 = new SerialNumber();
            getEntityManager().persist(serialNumber1);
            alpine1 = new Alpine(serialNumber1);
            alpine1.setBestBeforeDate(new Date(2005, 8, 17));
            alpine1.setAlcoholContent(5.0);
            alpine1.setBeerConsumer(beerConsumer2);
            getEntityManager().persist(alpine1);

            SerialNumber serialNumber2 = new SerialNumber();
            getEntityManager().persist(serialNumber2);
            alpine2 = new Alpine(serialNumber2);
            alpine2.setBestBeforeDate(new Date(2005, 8, 21));
            alpine2.setAlcoholContent(5.0);
            alpine2.setBeerConsumer(beerConsumer2);
            getEntityManager().persist(alpine2);

            SerialNumber serialNumber3 = new SerialNumber();
            getEntityManager().persist(serialNumber3);
            alpine3 = new Alpine(serialNumber3);
            alpine3.setBestBeforeDate(new Date(2005, 8, 22));
            alpine3.setAlcoholContent(5.0);
            alpine3.setBeerConsumer(beerConsumer2);
            getEntityManager().persist(alpine3);

            canadian1 = new Canadian();
            canadian1.setBornOnDate(Calendar.getInstance().getTime());
            canadian1.setAlcoholContent(5.0);
            canadian1.setBeerConsumer(beerConsumer1);
            getEntityManager().persist(canadian1);

            canadian2 = new Canadian();
            canadian2.setBornOnDate(Calendar.getInstance().getTime());
            canadian2.setAlcoholContent(5.0);
            canadian2.setBeerConsumer(beerConsumer1);
            getEntityManager().persist(canadian2);

            commitTransaction();
        } catch (Exception e) {
            m_exception = e;
        }
    }

    @Override
    public void reset () {
        if (m_reset) {
            m_reset = false;
        }
    }

    @Override
    public void verify() {
        if (m_exception != null) {
            throw new TestErrorException("Exception was thrown when creating a bus: " + m_exception.getMessage());
        }
    }
}
