/*
 * Copyright (c) 1998, 2018 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.oxm.mappings.sequenced;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Text;

import org.eclipse.persistence.mappings.DatabaseMapping;
import org.eclipse.persistence.oxm.sequenced.Setting;
import org.eclipse.persistence.testing.oxm.mappings.XMLMappingTestCases;

public class MappingsTestCases extends XMLMappingTestCases {

    private static final String XML_RESOURCE = "org/eclipse/persistence/testing/oxm/mappings/sequenced/Mappings.xml";
    private static final String CONTROL_EMPLOYEE_FIRST_NAME = "Jane";
    private static final String CONTROL_EMPLOYEE_LAST_NAME = "Doe";
    private static final String CONTROL_ADDRESS_ID = "1";
    private static final String CONTROL_ADDRESS_STREET = "1 A Street";
    private static final String CONTROL_ADDRESS_CITY = "Town A";
    private static final String CONTROL_FRAGMENT_NAME = "fragment";
    private static final String CONTROL_FRAGMENT_1_TEXT = "Hello";
    private static final String CONTROL_FRAGMENT_2_TEXT = "World";
    private static final String CONTROL_ANY_ADDRESS_1_STREET = "1 Any Street";
    private static final String CONTROL_ANY_ADDRESS_1_CITY = "First Any Town";
    private static final String CONTROL_ANY_ADDRESS_2_STREET = "2 Any Street";
    private static final String CONTROL_ANY_ADDRESS_2_CITY = "Second Any Town";
    private static final String CONTROL_DEPENDENT_FIRST_NAME = "Dependent First";
    private static final String CONTROL_DEPENDENT_LAST_NAME = "Dependent Last";
    private static final String CONTROL_DEPENDENT_2_FIRST_NAME = "Dependent 2 First";
    private static final String CONTROL_DEPENDENT_2_LAST_NAME = "Dependent 2 Last";

    private EmployeeProject EMPLOYEE_PROJECT;

    public MappingsTestCases(String name) throws Exception {
        super(name);
        setControlDocument(XML_RESOURCE);
        EMPLOYEE_PROJECT = new EmployeeProject();
        setProject(EMPLOYEE_PROJECT);
    }

    public Object getControlObject() {
        Document document;
        try {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            document = db.newDocument();
        } catch(ParserConfigurationException e) {
            throw new RuntimeException(e);
        }

        Employee controlEmployee = new Employee();

        Setting lnPersonalInfoSetting = new Setting(null, "personal-info");
        controlEmployee.getSettings().add(lnPersonalInfoSetting);
        Setting lastNameSetting = new Setting(null, "last-name");
        lnPersonalInfoSetting.addChild(lastNameSetting);
        Setting lastNameTextSetting = new Setting(null, "text()");
        lastNameTextSetting.setObject(controlEmployee);
        DatabaseMapping lastNameMapping = EMPLOYEE_PROJECT.getDescriptor(Employee.class).getMappingForAttributeName("lastName");
        lastNameTextSetting.setMapping(lastNameMapping);
        lastNameTextSetting.setValue(CONTROL_EMPLOYEE_LAST_NAME);
        lastNameSetting.addChild(lastNameTextSetting);

        Address address = new Address();
        address.setId(CONTROL_ADDRESS_ID);
        address.setStreet(CONTROL_ADDRESS_STREET);
        address.setCity(CONTROL_ADDRESS_CITY);
        Setting addressSetting = new Setting(null, "address");
        addressSetting.setObject(controlEmployee);
        DatabaseMapping addressMapping = EMPLOYEE_PROJECT.getDescriptor(Employee.class).getMappingForAttributeName("address");
        addressSetting.setMapping(addressMapping);
        addressSetting.setValue(address);
        controlEmployee.getSettings().add(addressSetting);

        Setting fnPersonalInfoSetting = new Setting(null, "personal-info");
        controlEmployee.getSettings().add(fnPersonalInfoSetting);
        Setting firstNameSetting = new Setting("urn:example", "first-name");
        fnPersonalInfoSetting.addChild(firstNameSetting);
        Setting firstNameTextSetting = new Setting(null, "text()");
        firstNameTextSetting.setObject(controlEmployee);
        DatabaseMapping firstNameMapping = EMPLOYEE_PROJECT.getDescriptor(Employee.class).getMappingForAttributeName("firstName");
        firstNameTextSetting.setMapping(firstNameMapping);
        firstNameTextSetting.setValue(CONTROL_EMPLOYEE_FIRST_NAME);
        firstNameSetting.addChild(firstNameTextSetting);

        Setting dependentSetting = new Setting(null, "dependent");
        controlEmployee.getSettings().add(dependentSetting);
        dependentSetting.setObject(controlEmployee);
        DatabaseMapping dependentMapping = EMPLOYEE_PROJECT.getDescriptor(Employee.class).getMappingForAttributeName("dependent");
        dependentSetting.setMapping(dependentMapping);
        dependentSetting.setValue(getControlDependent(address));




/*
        controlEmployee.setLastName(CONTROL_EMPLOYEE_LAST_NAME);

        Address address1 = new Address();
        address1.setId(CONTROL_ADDRESS_1_ID);
        address1.setStreet(CONTROL_ADDRESS_1_STREET);
        address1.setCity(CONTROL_ADDRESS_1_CITY);
        controlEmployee.setAddress(address1);

        Address anyAddress1 = new Address();
        anyAddress1.setStreet(CONTROL_ANY_ADDRESS_1_STREET);
        anyAddress1.setCity(CONTROL_ANY_ADDRESS_1_CITY);
        controlEmployee.setAny(anyAddress1);

        Dependent dependent1 = new Dependent();
        dependent1.setAddress(address1);
        dependent1.setLastName(CONTROL_DEPENDENT_1_LAST_NAME);
        dependent1.setFirstName(CONTROL_DEPENDENT_1_FIRST_NAME);
        controlEmployee.setDependent(dependent1);

        Element fragment1 = document.createElement(CONTROL_FRAGMENT_NAME);
        Text fragmentText1 = document.createTextNode(CONTROL_FRAGMENT_1_TEXT);
        fragment1.appendChild(fragmentText1);
        controlEmployee.setNode(fragment1);

        controlEmployee.setFirstName(CONTROL_EMPLOYEE_FIRST_NAME);

        Address address2 = new Address();
        address2.setId(CONTROL_ADDRESS_2_ID);
        address2.setStreet(CONTROL_ADDRESS_2_STREET);
        address2.setCity(CONTROL_ADDRESS_2_CITY);
        controlEmployee.setAddress(address2);

        Address anyAddress2 = new Address();
        anyAddress2.setStreet(CONTROL_ANY_ADDRESS_2_STREET);
        anyAddress2.setCity(CONTROL_ANY_ADDRESS_2_CITY);
        controlEmployee.setAny(anyAddress2);

        Dependent dependent2 = new Dependent();
        dependent2.setFirstName(CONTROL_DEPENDENT_2_FIRST_NAME);
        dependent2.setAddress(address2);
        dependent2.setLastName(CONTROL_DEPENDENT_2_LAST_NAME);
        controlEmployee.setDependent(dependent2);

        Element fragment2 = document.createElement(CONTROL_FRAGMENT_NAME);
        Text fragmentText2 = document.createTextNode(CONTROL_FRAGMENT_2_TEXT);
        fragment2.appendChild(fragmentText2);
        controlEmployee.setNode(fragment2);
        */
        return controlEmployee;
    }

    private Dependent getControlDependent(Address address) {
        Dependent dependent = new Dependent();

        Setting dependentLastNameSetting = new Setting(null, "last-name");
        dependent.getSettings().add(dependentLastNameSetting);
        Setting dependentLastNameTextSetting = new Setting(null, "text()");
        dependentLastNameTextSetting.setObject(dependent);
        DatabaseMapping dependentLastNameMapping = EMPLOYEE_PROJECT.getDescriptor(Dependent.class).getMappingForAttributeName("lastName");
        dependentLastNameTextSetting.setMapping(dependentLastNameMapping);
        dependentLastNameTextSetting.setValue(CONTROL_DEPENDENT_LAST_NAME);
        dependentLastNameSetting.addChild(dependentLastNameTextSetting);

        Setting addressIdSetting = new Setting(null, "address-id");
        dependent.getSettings().add(addressIdSetting);
        Setting addressIdTextSetting = new Setting(null, "text()");
        addressIdTextSetting.setObject(dependent);
        DatabaseMapping addressMapping = EMPLOYEE_PROJECT.getDescriptor(Dependent.class).getMappingForAttributeName("address");
        addressIdTextSetting.setMapping(addressMapping);
        addressIdTextSetting.setValue(address);
        addressIdSetting.addChild(addressIdTextSetting);

        Setting dependentFirstNameSetting = new Setting(null, "first-name");
        dependent.getSettings().add(dependentFirstNameSetting);
        Setting dependentFirstNameTextSetting = new Setting(null, "text()");
        dependentFirstNameTextSetting.setObject(dependent);
        DatabaseMapping dependentFirstNameMapping = EMPLOYEE_PROJECT.getDescriptor(Dependent.class).getMappingForAttributeName("firstName");
        dependentFirstNameTextSetting.setMapping(dependentFirstNameMapping);
        dependentFirstNameTextSetting.setValue(CONTROL_DEPENDENT_FIRST_NAME);
        dependentFirstNameSetting.addChild(dependentFirstNameTextSetting);

        return dependent;
    }

    public void xmlToObjectTest(Object testObject) throws Exception {
        Employee testEmployee = (Employee) testObject;
        // assertEquals(10, testEmployee.getSettings().size());
        super.xmlToObjectTest(testObject);
    }

}
