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

import org.eclipse.persistence.queries.*;
import org.eclipse.persistence.testing.framework.*;

/**
 * Author: Edwin Tang
 * The test executes and verifies the stored procedures in the database
 * generated by SPGGenerateAmendmentClassTest.
 */
public class SPGExecuteStoredProcedureTest extends TestCase {
    boolean shouldBindAllParameters;
    int insertSuccess = 1;
    int updateSuccess = 1;
    int deleteSuccess = 1;
    String parameterNamePrefix;
    boolean shouldUseNamedArguments;
    static final Integer menuID = Integer.valueOf(99);
    static final Integer restaurantID = Integer.valueOf(100);
    static final Integer dinerID = Integer.valueOf(101);
    static final Integer personID = Integer.valueOf(102);
    static final Integer locationID = Integer.valueOf(103);
    static final Integer waiterID = Integer.valueOf(104);
    static final Integer menuItemID = Integer.valueOf(105);
    static final String menuType = "Lunch";
    static final String menuTypeUpdate = "Dinner";
    static final String dinerFirstName = "Steve";
    static final String dinerFirstNameUpdate = "Stephen";
    static final String dinerLastName = "McDonald";
    static final String dinerClass = "B";
    static final String personFirstName = "Dan";
    static final String personFirstNameUpdate = "Danial";
    static final String personLastName = "Smith";
    static final String personClass = "A";
    static final String locationArea = "Downtown";
    static final String locationAreaUpdate = "Southeastern";
    static final String locationCity = "Ottawa";
    static final String waiterFirstName = "Joel";
    static final String waiterLastName = "Clark";
    static final String waiterSpeciality = "Speaking Spanish";
    static final String waiterSpecialityUpdate = "Speaking Spanish and Italian";
    static final String waiterClass = "A";
    static final String menuItemName = "Roasted beef and potato";
    static final Float menuItemPrice = Float.valueOf(20.99f);
    static final Float menuItemPriceUpdate = Float.valueOf(22.99f);
    static final String restaurantName = "May Flower";
    static final String restaurantNameUpdate = "Great Wall Restaurant";

    public SPGExecuteStoredProcedureTest() {
    }

    @Override
    public void setup() {
        shouldUseNamedArguments = !getSession().getDatasourcePlatform().isMySQL();
        if(shouldUseNamedArguments) {
            if(getSession().getDatasourcePlatform().isOracle()) {
                parameterNamePrefix = "P_";
            } else {
                parameterNamePrefix = "";
            }
        }
        {
        StoredProcedureCall call = new StoredProcedureCall();
        call.setProcedureName("INS_Menu");
        addArgumentValue(call, "ID",menuID);
        addArgumentValue(call, "REST_ID",restaurantID);
        addArgumentValue(call, "TYPE",menuType);
        insertSuccess = insertSuccess * getSession().executeNonSelectingCall(call);
        }
        {
        StoredProcedureCall call = new StoredProcedureCall();
        call.setProcedureName("INS_Diner");
        addArgumentValue(call, "ID",dinerID);
        addArgumentValue(call, "F_NAME",dinerFirstName);
        addArgumentValue(call, "CLASS",dinerClass);
        addArgumentValue(call, "L_NAME",dinerLastName);
        insertSuccess = insertSuccess * getSession().executeNonSelectingCall(call);
        }
        {
        StoredProcedureCall call = new StoredProcedureCall();
        call.setProcedureName("INS_Person");
        addArgumentValue(call, "ID",personID);
        addArgumentValue(call, "F_NAME",personFirstName);
        addArgumentValue(call, "CLASS",personClass);
        addArgumentValue(call, "L_NAME",personLastName);
        insertSuccess = insertSuccess * getSession().executeNonSelectingCall(call);
        }
        {
        StoredProcedureCall call = new StoredProcedureCall();
        call.setProcedureName("INS_Location");
        addArgumentValue(call, "AREA",locationArea);
        addArgumentValue(call, "ID",locationID);
        addArgumentValue(call, "CITY",locationCity);
        insertSuccess = insertSuccess * getSession().executeNonSelectingCall(call);
        }
        {
        StoredProcedureCall call = new StoredProcedureCall();
        call.setProcedureName("INS_Waiter");
        addArgumentValue(call, "ID",waiterID);
        addArgumentValue(call, "F_NAME",waiterFirstName);
        addArgumentValue(call, "SPECIALT",waiterSpeciality);
        addArgumentValue(call, "CLASS",waiterClass);
        addArgumentValue(call, "W_RST_ID",restaurantID);
        addArgumentValue(call, "L_NAME",waiterLastName);
        insertSuccess = insertSuccess * getSession().executeNonSelectingCall(call);
        }
        {
        StoredProcedureCall call = new StoredProcedureCall();
        call.setProcedureName("INS_MenuItem");
        addArgumentValue(call, "ID",menuItemID);
        addArgumentValue(call, "MENU_ID",menuID);
        addArgumentValue(call, "PRICE",menuItemPrice);
        addArgumentValue(call, "NAME",menuItemName);
        insertSuccess = insertSuccess * getSession().executeNonSelectingCall(call);
        }
        {
        StoredProcedureCall call = new StoredProcedureCall();
        call.setProcedureName("INS_Restaurant");
        addArgumentValue(call, "ID",restaurantID);
        addArgumentValue(call, "NAME",restaurantName);
        insertSuccess = insertSuccess * getSession().executeNonSelectingCall(call);
        }
    }

    @Override
    public void test() {
        {
        StoredProcedureCall call = new StoredProcedureCall();
        call.setProcedureName("UPD_Menu");
        addArgumentValue(call, "ID",menuID);
        addArgumentValue(call, "REST_ID",restaurantID);
        addArgumentValue(call, "TYPE",menuTypeUpdate);
        updateSuccess = updateSuccess * getSession().executeNonSelectingCall(call);
        }
        {
        StoredProcedureCall call = new StoredProcedureCall();
        call.setProcedureName("UPD_Diner");
        addArgumentValue(call, "ID",dinerID);
        addArgumentValue(call, "F_NAME",dinerFirstNameUpdate);
        addArgumentValue(call, "CLASS",dinerClass);
        addArgumentValue(call, "L_NAME",dinerLastName);
        updateSuccess = updateSuccess * getSession().executeNonSelectingCall(call);
        }
        {
        StoredProcedureCall call = new StoredProcedureCall();
        call.setProcedureName("UPD_Person");
        addArgumentValue(call, "ID",personID);
        addArgumentValue(call, "F_NAME",personFirstNameUpdate);
        addArgumentValue(call, "CLASS",personClass);
        addArgumentValue(call, "L_NAME",personLastName);
        updateSuccess = updateSuccess * getSession().executeNonSelectingCall(call);
        }
        {
        StoredProcedureCall call = new StoredProcedureCall();
        call.setProcedureName("UPD_Location");
        addArgumentValue(call, "AREA",locationAreaUpdate);
        addArgumentValue(call, "ID",locationID);
        addArgumentValue(call, "CITY",locationCity);
        updateSuccess = updateSuccess * getSession().executeNonSelectingCall(call);
        }
        {
        StoredProcedureCall call = new StoredProcedureCall();
        call.setProcedureName("UPD_Waiter");
        addArgumentValue(call, "ID",waiterID);
        addArgumentValue(call, "F_NAME",waiterFirstName);
        addArgumentValue(call, "SPECIALT",waiterSpecialityUpdate);
        addArgumentValue(call, "CLASS",waiterClass);
        addArgumentValue(call, "W_RST_ID",restaurantID);
        addArgumentValue(call, "L_NAME",waiterLastName);
        updateSuccess = updateSuccess * getSession().executeNonSelectingCall(call);
        }
        {
        StoredProcedureCall call = new StoredProcedureCall();
        call.setProcedureName("UPD_MenuItem");
        addArgumentValue(call, "ID",menuItemID);
        addArgumentValue(call, "MENU_ID",menuID);
        addArgumentValue(call, "PRICE",menuItemPriceUpdate);
        addArgumentValue(call, "NAME",menuItemName);
        updateSuccess = updateSuccess * getSession().executeNonSelectingCall(call);
        }
        {
        StoredProcedureCall call = new StoredProcedureCall();
        call.setProcedureName("UPD_Restaurant");
        addArgumentValue(call, "ID",restaurantID);
        addArgumentValue(call, "NAME",restaurantNameUpdate);
        updateSuccess = updateSuccess * getSession().executeNonSelectingCall(call);
        }
    }

    @Override
    public void reset() {
        {
        StoredProcedureCall call = new StoredProcedureCall();
        call.setProcedureName("DEL_Menu");
        addArgumentValue(call, "ID",menuID);
        deleteSuccess = deleteSuccess * getSession().executeNonSelectingCall(call);
        }
        {
        StoredProcedureCall call = new StoredProcedureCall();
        call.setProcedureName("D_1M_Menu_items");
        addArgumentValue(call, "ID",menuID);
        deleteSuccess = deleteSuccess * getSession().executeNonSelectingCall(call);
        }
        {
        StoredProcedureCall call = new StoredProcedureCall();
        call.setProcedureName("DEL_Diner");
        addArgumentValue(call, "ID",dinerID);
        deleteSuccess = deleteSuccess * getSession().executeNonSelectingCall(call);
        }
        {
        StoredProcedureCall call = new StoredProcedureCall();
        call.setProcedureName("DEL_Person");
        addArgumentValue(call, "ID",personID);
        deleteSuccess = deleteSuccess * getSession().executeNonSelectingCall(call);
        }
        {
        StoredProcedureCall call = new StoredProcedureCall();
        call.setProcedureName("DEL_Location");
        addArgumentValue(call, "ID",locationID);
        deleteSuccess = deleteSuccess * getSession().executeNonSelectingCall(call);
        }
        {
        StoredProcedureCall call = new StoredProcedureCall();
        call.setProcedureName("DEL_Waiter");
        addArgumentValue(call, "ID",waiterID);
        deleteSuccess = deleteSuccess * getSession().executeNonSelectingCall(call);
        }
        {
        StoredProcedureCall call = new StoredProcedureCall();
        call.setProcedureName("DEL_MenuItem");
        addArgumentValue(call, "ID",menuItemID);
        deleteSuccess = deleteSuccess * getSession().executeNonSelectingCall(call);
        }
        {
        StoredProcedureCall call = new StoredProcedureCall();
        call.setProcedureName("DEL_Restaurant");
        addArgumentValue(call, "ID",restaurantID);
        deleteSuccess = deleteSuccess * getSession().executeNonSelectingCall(call);
        }
        {
        StoredProcedureCall call = new StoredProcedureCall();
        call.setProcedureName("D_1M_Restaurant_waiters");
        addArgumentValue(call, "ID",restaurantID);
        deleteSuccess = deleteSuccess * getSession().executeNonSelectingCall(call);
        }
        {
        StoredProcedureCall call = new StoredProcedureCall();
        call.setProcedureName("D_1M_Restaurant_menus");
        addArgumentValue(call, "ID",restaurantID);
        deleteSuccess = deleteSuccess * getSession().executeNonSelectingCall(call);
        }
    }

    @Override
    public void verify() {
        if(insertSuccess * updateSuccess * deleteSuccess == 0 ) {
          throw new TestErrorException("Failed to call stored procedures.") ;
        }
    }

    protected void addArgumentValue(StoredProcedureCall call, String name, Object value) {
        if(shouldUseNamedArguments) {
            call.addNamedArgumentValue(parameterNamePrefix + name, value);
        } else {
            call.addUnamedArgumentValue(value);
        }
    }
}
