/*
 * Copyright (c) 2005, 2021 Oracle and/or its affiliates. All rights reserved.
 * Copyright (c) 2005, 2015 SAP. 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:
//     SAP - initial API and implementation

package org.eclipse.persistence.testing.tests.wdf.jpa1.inheritance;

import java.sql.SQLException;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import jakarta.persistence.EntityManager;
import jakarta.persistence.Query;

import org.eclipse.persistence.testing.framework.wdf.JPAEnvironment;
import org.eclipse.persistence.testing.models.wdf.jpa1.employee.Bicycle;
import org.eclipse.persistence.testing.models.wdf.jpa1.employee.Car;
import org.eclipse.persistence.testing.models.wdf.jpa1.employee.Employee;
import org.eclipse.persistence.testing.models.wdf.jpa1.employee.MotorVehicle;
import org.eclipse.persistence.testing.models.wdf.jpa1.employee.MountainBike;
import org.eclipse.persistence.testing.models.wdf.jpa1.employee.RoadBike;
import org.eclipse.persistence.testing.models.wdf.jpa1.employee.Truck;
import org.eclipse.persistence.testing.tests.wdf.jpa1.JPA1Base;
import org.junit.Test;

public class RelationsTest extends JPA1Base {

    @Test
    public void testEmployeeWithTruck() throws SQLException {
        clearAllTables();
        JPAEnvironment env = getEnvironment();
        EntityManager em = env.getEntityManager();
        try {
            Employee employee = new Employee(1234, "Mighty", "Mouse", null);
            Truck truck = new Truck();
            truck.setBrand("Renault");
            truck.setColor("yellow");
            truck.setLicensePlateNumber("MA-US 1234");
            truck.setModel("Trafic");
            truck.setMaxLoad((short) 800);
            truck.setDriver(employee);
            employee.setMotorVehicle(truck);
            env.beginTransaction(em);
            em.persist(employee);
            final Short id = truck.getId();
            env.commitTransaction(em);
            employee = null;
            em.clear();
            employee = em.find(Employee.class, 1234);
            verify(employee != null, "employee not found");
            MotorVehicle motorVehicle = employee.getMotorVehicle();
            verify(motorVehicle != null, "no motor vehicle found");
            verify(motorVehicle.getClass() == Truck.class, "wrong class: " + motorVehicle.getClass());
            verify("yellow".equals(motorVehicle.getColor()), "wrong color: " + motorVehicle.getColor());
            verify(id.equals(motorVehicle.getId()), "wrong motor vehicle id: " + motorVehicle.getId());
        } finally {
            closeEntityManager(em);
        }
    }

    @Test
    public void testEmployeeWithBicycles() throws SQLException {
        clearAllTables();
        JPAEnvironment env = getEnvironment();
        EntityManager em = env.getEntityManager();
        try {
            Employee employee = new Employee(17, "Kuno", "Hurtig", null);
            Set<Employee> riders = new HashSet<Employee>();
            riders.add(employee);
            Set<Bicycle> bicycles = new HashSet<Bicycle>();
            Bicycle roadBike = new RoadBike();
            roadBike.setRiders(riders);
            bicycles.add(roadBike);
            MountainBike mountainBike = new MountainBike();
            mountainBike.setRiders(riders);
            bicycles.add(mountainBike);
            employee.setBicycles(bicycles);
            env.beginTransaction(em);
            em.persist(employee);
            final Short roadBikeId = roadBike.getId();
            env.commitTransaction(em);
            employee = null;
            em.clear();
            employee = em.find(Employee.class, 17);
            verify(employee != null, "employee not found");
            bicycles = employee.getBicycles();
            verify(bicycles != null, "bicycles is null");
            verify(bicycles.size() == 2, "wrong size");
            Iterator<Bicycle> iter = bicycles.iterator();
            Bicycle bike1 = iter.next();
            Bicycle bike2 = iter.next();
            verify(bike1.getClass() == RoadBike.class && bike2.getClass() == MountainBike.class
                    || bike1.getClass() == MountainBike.class && bike2.getClass() == RoadBike.class,
                    "bicyles have unexpected types: " + bike1.getClass().getName() + ", " + bike2.getClass().getName());
            em.clear();
            env.beginTransaction(em);
            em.find(Bicycle.class, roadBikeId);
            env.commitTransaction(em);
        } finally {
            closeEntityManager(em);
        }
    }

    @Test
    public void testEnBlocLoading() throws SQLException {
        clearAllTables();
        JPAEnvironment env = getEnvironment();
        EntityManager em = env.getEntityManager();
        try {
            Employee e1 = new Employee(1, "Paul", "Weber", null);
            Car car = new Car();
            car.setDriver(e1);
            e1.setMotorVehicle(car);

            Employee e2 = new Employee(2, "Paul", "Breitner", null);
            Truck truck = new Truck();
            truck.setDriver(e2);
            e2.setMotorVehicle(truck);

            Employee e3 = new Employee(3, "Paulchen", "Panther", null);
            MotorVehicle mv = new MotorVehicle();
            mv.setDriver(e3);
            e3.setMotorVehicle(mv);

            env.beginTransaction(em);
            em.persist(e1);
            em.persist(e2);
            em.persist(e3);
            em.persist(car);
            em.persist(truck);
            em.persist(mv);

            env.commitTransactionAndClear(em);

            env.beginTransaction(em);

            Query query = em.createQuery("select mv from MotorVehicle mv");
            query.getResultList();

        } finally {
            closeEntityManager(em);
        }

    }
}
