/*
 * 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.sdo.helper.xsdhelper.defineandgenerate;

import commonj.sdo.DataObject;
import commonj.sdo.Type;
import java.util.ArrayList;
import java.util.List;
import junit.textui.TestRunner;
import org.eclipse.persistence.sdo.SDOConstants;
import org.eclipse.persistence.sdo.SDOProperty;
import org.eclipse.persistence.sdo.SDOType;
import org.eclipse.persistence.sdo.helper.SDOTypeHelper;

public class DefineAndGenerateSequencesPurchaseOrderTestCases extends XSDHelperDefineAndGenerateTestCases {
    public DefineAndGenerateSequencesPurchaseOrderTestCases(String name) {
        super(name);
    }

    @Override
    public String getSchemaToDefine() {
        return "org/eclipse/persistence/testing/sdo/schemas/PurchaseOrderComplexSequenced.xsd";
    }

    public static void main(String[] args) {
        String[] arguments = { "-c", "org.eclipse.persistence.testing.sdo.helper.xsdhelper.defineandgenerate.DefineAndGenerateSequencesPurchaseOrderTestCases" };
        TestRunner.main(arguments);
    }

    @Override
    public String getControlGeneratedFileName() {
        return "org/eclipse/persistence/testing/sdo/schemas/PurchaseOrderComplexSequenced.xsd";
    }

    @Override
    public List getTypesToGenerateFrom() {
        return getControlTypes();
    }

    @Override
    public List getControlTypes() {
        SDOType changeSummaryType = (SDOType) aHelperContext.getTypeHelper().getType(SDOConstants.SDO_URL, SDOConstants.CHANGESUMMARY);

        List<Type> types = new ArrayList<Type>();
        ((SDOTypeHelper)typeHelper).reset();
        //String xsdSchema = getSchema("org/eclipse/persistence/testing/sdo/schemas/PurchaseOrderComplexSequenced.xsd");
        //List types = xsdHelper.define(xsdSchema);
        DataObject addressTypeDO = dataFactory.create("commonj.sdo", "Type");
        addressTypeDO.set("uri", NON_DEFAULT_URI);
        addressTypeDO.set("name", "AddressType");
        addressTypeDO.set("sequenced", true);

        addProperty(addressTypeDO, "name", SDOConstants.SDO_STRING, false, false, true);
        addProperty(addressTypeDO, "street", SDOConstants.SDO_STRING, false, true, true);
        addProperty(addressTypeDO, "city", SDOConstants.SDO_STRING, false, false, true);

        Type addressType = typeHelper.define(addressTypeDO);
        ((SDOProperty)addressType.getProperty("name")).setXsd(true);
        ((SDOProperty)addressType.getProperty("name")).setXsdLocalName("name");
        ((SDOProperty)addressType.getProperty("street")).setXsd(true);
        ((SDOProperty)addressType.getProperty("street")).setXsdLocalName("street");
        ((SDOProperty)addressType.getProperty("city")).setXsd(true);
        ((SDOProperty)addressType.getProperty("city")).setXsdLocalName("city");
        //-----------------
        DataObject usAddressTypeDO = dataFactory.create("commonj.sdo", "Type");
        usAddressTypeDO.set("uri", NON_DEFAULT_URI);
        usAddressTypeDO.set("name", "usAddressType");
        usAddressTypeDO.set("sequenced", true);
        List<Type> baseTypes = new ArrayList<Type>();
        baseTypes.add(addressType);
        usAddressTypeDO.set("baseType", baseTypes);

        DataObject stateProp = addProperty(usAddressTypeDO, "state", SDOConstants.SDO_STRING);
        stateProp.set(SDOConstants.XMLELEMENT_PROPERTY, true);

        Type usAddressType = typeHelper.define(usAddressTypeDO);
        ((SDOProperty)usAddressType.getProperty("state")).setXsd(true);
        ((SDOProperty)usAddressType.getProperty("state")).setXsdLocalName("state");
        //-----------------
        DataObject cdnAddressTypeDO = dataFactory.create("commonj.sdo", "Type");
        cdnAddressTypeDO.set("uri", NON_DEFAULT_URI);
        cdnAddressTypeDO.set("name", "cdnAddressType");
        cdnAddressTypeDO.set("sequenced", true);
        baseTypes = new ArrayList<Type>(); // reset
        baseTypes.add(addressType);
        cdnAddressTypeDO.set("baseType", baseTypes);

        addProperty(cdnAddressTypeDO, "province", SDOConstants.SDO_STRING, false, false, true);
        addProperty(cdnAddressTypeDO, "postalcode", SDOConstants.SDO_STRING, false, false, true);

        Type cdnAddressType = typeHelper.define(cdnAddressTypeDO);
        ((SDOProperty)cdnAddressType.getProperty("province")).setXsd(true);
        ((SDOProperty)cdnAddressType.getProperty("province")).setXsdLocalName("province");
        ((SDOProperty)cdnAddressType.getProperty("postalcode")).setXsd(true);
        ((SDOProperty)cdnAddressType.getProperty("postalcode")).setXsdLocalName("postalcode");

        //-----------------
        DataObject cdnAddressMailingTypeDO = dataFactory.create("commonj.sdo", "Type");
        cdnAddressMailingTypeDO.set("uri", NON_DEFAULT_URI);
        cdnAddressMailingTypeDO.set("name", "cdnAddressMailingType");
        cdnAddressMailingTypeDO.set("sequenced", true);
        baseTypes = new ArrayList<Type>(); // reset
        baseTypes.add(cdnAddressType);
        cdnAddressMailingTypeDO.set("baseType", baseTypes);

        DataObject deliveryInfoProp = addProperty(cdnAddressMailingTypeDO, "deliveryInfo", SDOConstants.SDO_STRING);
        deliveryInfoProp.set(SDOConstants.XMLELEMENT_PROPERTY, true);

        Type cdnAddressMailingType = typeHelper.define(cdnAddressMailingTypeDO);
        ((SDOProperty)cdnAddressMailingType.getProperty("deliveryInfo")).setXsd(true);
        ((SDOProperty)cdnAddressMailingType.getProperty("deliveryInfo")).setXsdLocalName("deliveryInfo");

        //-----------------
        DataObject itemTypeDO = dataFactory.create("commonj.sdo", "Type");
        itemTypeDO.set("uri", NON_DEFAULT_URI);
        itemTypeDO.set("name", "LineItemType");

        DataObject prodcutNameProp = addProperty(itemTypeDO, "productName", SDOConstants.SDO_STRING);
        prodcutNameProp.set(SDOConstants.XMLELEMENT_PROPERTY, true);
        DataObject priceProp = addProperty(itemTypeDO, "price", SDOConstants.SDO_FLOAT);
        priceProp.set(SDOConstants.XMLELEMENT_PROPERTY, true);
        DataObject shipDateProp = addProperty(itemTypeDO, "shipDate", SDOConstants.SDO_STRING);
        shipDateProp.set(SDOConstants.XMLELEMENT_PROPERTY, true);
        DataObject commentProp = addProperty(itemTypeDO, "comment", SDOConstants.SDO_STRING);
        commentProp.set(SDOConstants.XMLELEMENT_PROPERTY, true);

        Type itemType = typeHelper.define(itemTypeDO);
        ((SDOProperty)itemType.getProperty("productName")).setXsd(true);
        ((SDOProperty)itemType.getProperty("productName")).setXsdLocalName("productName");

        ((SDOProperty)itemType.getProperty("price")).setXsd(true);
        ((SDOProperty)itemType.getProperty("price")).setXsdLocalName("price");

        ((SDOProperty)itemType.getProperty("shipDate")).setXsd(true);
        ((SDOProperty)itemType.getProperty("shipDate")).setXsdLocalName("shipDate");

        ((SDOProperty)itemType.getProperty("comment")).setXsd(true);
        ((SDOProperty)itemType.getProperty("comment")).setXsdLocalName("comment");
        //-----------------
        DataObject itemsTypeDO = dataFactory.create("commonj.sdo", "Type");
        itemsTypeDO.set("uri", NON_DEFAULT_URI);
        itemsTypeDO.set("name", "Items");
        itemsTypeDO.set("sequenced", true);

        addProperty(itemsTypeDO, "item", itemType, true, true, true);

        Type itemsType = typeHelper.define(itemsTypeDO);
        ((SDOProperty)itemsType.getProperty("item")).setXsd(true);
        ((SDOProperty)itemsType.getProperty("item")).setXsdLocalName("item");
        //-----------------
        DataObject poTypeDO = dataFactory.create("commonj.sdo", "Type");
        poTypeDO.set("uri", NON_DEFAULT_URI);
        poTypeDO.set("name", "PurchaseOrderType");

        addProperty(poTypeDO, "address", addressType, true, true, true);
        addProperty(poTypeDO, "comment", SDOConstants.SDO_STRING, false, false, true);
        addProperty(poTypeDO, "items", itemsType, true, false, true);

        Type poType = typeHelper.define(poTypeDO);
        ((SDOProperty)poType.getProperty("address")).setXsd(true);
        ((SDOProperty)poType.getProperty("address")).setXsdLocalName("address");
        ((SDOProperty)poType.getProperty("comment")).setXsd(true);
        ((SDOProperty)poType.getProperty("comment")).setXsdLocalName("comment");
        ((SDOProperty)poType.getProperty("items")).setXsd(true);
        ((SDOProperty)poType.getProperty("items")).setXsdLocalName("items");
      //  ((SDOProperty)poType.getProperty("myCS")).setXsd(true);
//        ((SDOProperty)poType.getProperty("myCS")).setXsdLocalName("myCS");

       //-----------------
        DataObject companyTypeDO = dataFactory.create("commonj.sdo", "Type");
        companyTypeDO.set("uri", NON_DEFAULT_URI);
        companyTypeDO.set("name", "CompanyType");

        DataObject csProp = addProperty(companyTypeDO, "myCS", changeSummaryType, true, false, true);
        csProp.set("readOnly", true);
        addProperty(companyTypeDO, "order", poType, true, false, true);

        Type companyType = typeHelper.define(companyTypeDO);
        ((SDOProperty)companyType.getProperty("myCS")).setXsd(true);
        ((SDOProperty)companyType.getProperty("myCS")).setXsdLocalName("myCS");

        ((SDOProperty)companyType.getProperty("order")).setXsd(true);
        ((SDOProperty)companyType.getProperty("order")).setXsdLocalName("order");

        //------------------

        types.add(companyType);
        types.add(cdnAddressType);
        types.add(usAddressType);
        types.add(itemsType);
        types.add(poType);
        types.add(cdnAddressMailingType);
        types.add(itemType);
        types.add(addressType);


        return types;
    }
}
