/*
 * 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.manual;

import org.eclipse.persistence.descriptors.ClassDescriptor;
import org.eclipse.persistence.testing.framework.*;
import org.eclipse.persistence.sessions.*;
import org.eclipse.persistence.expressions.*;
import org.eclipse.persistence.mappings.*;
import org.eclipse.persistence.testing.models.insurance.Claim;
import org.eclipse.persistence.testing.models.insurance.Address;
import org.eclipse.persistence.testing.models.insurance.PolicyHolder;
import org.eclipse.persistence.testing.models.insurance.Policy;

public class DeleteOrderUnitOfWorkTest extends ManualVerifyTestCase {
    public DeleteOrderUnitOfWorkTest() {
        setDescription("The delete order should match the following: CLAIM, POLICY, ADDRESS, HOLDER");
    }

    @Override
    public void reset() {
        ClassDescriptor policyHolderDescriptor = getSession().getClassDescriptor(org.eclipse.persistence.testing.models.insurance.PolicyHolder.class);
        ClassDescriptor policyDescriptor = getSession().getClassDescriptor(org.eclipse.persistence.testing.models.insurance.Policy.class);

        OneToOneMapping addressMapping = (OneToOneMapping)policyHolderDescriptor.getMappingForAttributeName("address");
        addressMapping.setIsPrivateOwned(true);
        addressMapping.initialize(getAbstractSession());

        OneToManyMapping policiesMapping = (OneToManyMapping)policyHolderDescriptor.getMappingForAttributeName("policies");
        policiesMapping.setIsPrivateOwned(true);
        policiesMapping.initialize(getAbstractSession());

        OneToManyMapping claimsMapping = (OneToManyMapping)policyDescriptor.getMappingForAttributeName("claims");
        claimsMapping.setIsPrivateOwned(true);
        claimsMapping.initialize(getAbstractSession());
        rollbackTransaction();
    }

    @Override
    protected void setup() {
        beginTransaction();
        // Setup complex mapping employee as well.
        ClassDescriptor policyHolderDescriptor = getSession().getClassDescriptor(org.eclipse.persistence.testing.models.insurance.PolicyHolder.class);
        ClassDescriptor policyDescriptor = getSession().getClassDescriptor(org.eclipse.persistence.testing.models.insurance.Policy.class);

        OneToOneMapping addressMapping = (OneToOneMapping)policyHolderDescriptor.getMappingForAttributeName("address");
        addressMapping.setIsPrivateOwned(false);
        addressMapping.initialize(getAbstractSession());

        OneToManyMapping policiesMapping = (OneToManyMapping)policyHolderDescriptor.getMappingForAttributeName("policies");
        policiesMapping.setIsPrivateOwned(false);
        policiesMapping.initialize(getAbstractSession());

        OneToManyMapping claimsMapping = (OneToManyMapping)policyDescriptor.getMappingForAttributeName("claims");
        claimsMapping.setIsPrivateOwned(false);
        claimsMapping.initialize(getAbstractSession());
    }

    @Override
    protected void test() {
        ExpressionBuilder builder = new ExpressionBuilder();
        Expression expression = builder.get("id").equal(303);

        UnitOfWork uow = getSession().acquireUnitOfWork();
        Claim claim = (Claim)uow.readObject(org.eclipse.persistence.testing.models.insurance.Claim.class, expression);
        Policy policy = claim.getPolicy();
        PolicyHolder holder = policy.getPolicyHolder();
        Address address = holder.getAddress();

        uow.deleteObject(claim);
        uow.deleteObject(address);
        uow.deleteObject(policy);
        uow.deleteObject(holder);

        uow.commit();
    }
}
