/*
 * Copyright (c) 1998, 2020 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);
    }

    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);
    }

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

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

    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;
    }
}
