/*
 * 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.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.DataRecord;
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(DataRecord 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(DataRecord 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();
    }


}
