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

import java.io.StringWriter;

import java.sql.Time;

import java.util.ArrayList;
import java.util.Vector;

import org.eclipse.persistence.exceptions.DescriptorException;
import org.eclipse.persistence.indirection.ValueHolder;
import org.eclipse.persistence.indirection.ValueHolderInterface;
import org.eclipse.persistence.sessions.Record;
import org.eclipse.persistence.sessions.Session;


public class PersonWithValueHolder {
    public long p_id;
    private String p_name;
    public ValueHolderInterface address;
    public ArrayList phoneNumbers;
    public Vector projects;
    public Time[] normalHours;

    public PersonWithValueHolder() {
        this.p_name = "";
        this.address = new ValueHolder();
        this.phoneNumbers = new ArrayList();
    }

    public long getId() {
        return p_id;
    }

    public void setId(long id) {
        this.p_id = id;
    }

    public String getName() {
        return p_name;
    }

    public void setName(String name) {
        this.p_name = name;
    }

    public ValueHolderInterface getAddressHolder() {
        return address;
    }

    public void setAddressHolder(ValueHolderInterface addressNew) {
        this.address = addressNew;
    }

    public Address getAddress() {
        return (Address)address.getValue();
    }

    public void setAddress(Address addressNew) {
        this.address.setValue(addressNew);
    }

    public void setProjects(Vector newProjects) {
        this.projects = newProjects;
    }

    public Vector getProjects() {
        return projects;
    }

    public void setPhones(ArrayList newPhones) {
        this.phoneNumbers = newPhones;
    }

    public ArrayList getPhones() {
        return phoneNumbers;
    }

    public Time[] buildNormalHours(Record row) {
        Time[] hours = new Time[2];
        // hours[0] = (Time) session.getPlatform().convertObject(row.get("START_TIME"), java.sql.Time.class);
        //hours[1] = (Time) session.getPlatform().convertObject(row.get("END_TIME"), java.sql.Time.class);
        return hours;
    }

    public Time[] buildNormalHoursAgain(Record row, Session session) throws DescriptorException {
        Time[] hours = new Time[2];
        // hours[0] = (Time) session.getPlatform().convertObject(row.get("START_TIME"), java.sql.Time.class);
        // hours[1] = (Time) session.getPlatform().convertObject(row.get("END_TIME"), java.sql.Time.class);
        return hours;
    }

    public Time[] getNormalHours() {
        return normalHours;
    }

    public Time getEndTime() {
        return getNormalHours()[1];
    }

    public Time getStartTime() {
        return getNormalHours()[0];
    }


    public String toString() {
        StringWriter writer = new StringWriter();
        writer.write("Person: ");
        writer.write(getName());
        writer.write(" ");
        return writer.toString();
    }


}
