/*
 * Copyright (c) 2009, 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.
//     07/07/2014-2.6 Tomas Kraus
//       - 439127: Modified to use this class in jUnit test model.
package org.eclipse.persistence.testing.models.jpa.advanced.embeddable;

import jakarta.persistence.*;
import java.util.*;

/**
 * Visitor entity with Embedded attribute and SqlResultSetMapping.
 */
@SqlResultSetMappings({
    @SqlResultSetMapping(name = "VisitorResults", entities = {
        @EntityResult(entityClass = org.eclipse.persistence.testing.models.jpa.advanced.embeddable.Visitor.class, fields = {
            @FieldResult(name = "id", column = "OID"),
            @FieldResult(name = "name", column = "ONAME"),
            @FieldResult(name = "country.country", column = "OCOUNTRY"),
            @FieldResult(name = "country.code", column = "OCODE")
        })
    }),
})
@Entity
@Table(name = "CMP3_EMBED_VISITOR")
public class Visitor implements java.io.Serializable {

    // Instance variables
    /** Entity primary key. */
    private String id;

    /** Visitor's name. */
    private String name;

    /** Visitor's country. */
    private Country country;

    /**
     * Constructs an empty instance of <code>Visitor</code> entity.
     */
    public Visitor() {}

    /**
     * Constructs an instance of <code>Visitor</code> entity with primary key and name set.
     * @param id   Entity primary key.
     * @param name Visitor's name.
     */
    public Visitor(String id, String name) {
        this.id = id;
        this.name = name;
    }

    /**
     * Constructs an instance of <code>Visitor</code> entity with primary key, name and country set.
     * @param id      Entity primary key.
     * @param name    Visitor's name.
     * @param country Visitor's country.
     */
    public Visitor(String id, String name, Country country) {
        this.id = id;
        this.name = name;
        this.country = country;
    }

    /**
     * Get entity primary key.
     * @return Entity primary key.
     */
    @Id
    @Column(name = "ID")
    public String getId() {
        return id;
    }

    /**
     * Set entity primary key.
     * @param id Entity primary key.
     */
    public void setId(String v) {
        this.id = v;
    }

    /**
     * Get visitor's name.
     * @return Visitor's name.
     */
    @Column(name = "NAME")
    public String getName() {
        return name;
    }

    /**
     * Set visitor's name.
     * @param name Visitor's name.
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * Get visitor's country.
     * @return Visitor's country.
     */
    @Embedded
    public Country getCountry() {
        return country;
    }

    /**
     * Set visitor's country.
     * @param country Visitor's country.
     */
    public void setCountry(Country country) {
        this.country = country;
    }

    /**
     * Compare this entity with given object.
     * @return Value of <code>true</code> if given object is an instance of the same class
     *         and values of ID attributes are equal. Otherwise returns value of <code>false</code>.
     */
    public boolean equals(Object object) {
        Visitor other = (object instanceof Visitor) ? (Visitor) object : null;
        // Given object is not an instance of the same class.
        if (other == null) {
            return false;
        }
        // Compare id.
        if (id != null) {
            if (!id.equals(other.id)) {
                return false;
            }
        } else if (other.id != null) {
            return false;
        }
        return true;
    }

    /**
     * Generates entity hash code.
     * @return Entity hash code based on primary key value.
     */
    public int hashCode() {
        return id != null ? id.hashCode() : "null".hashCode();
    }

    /**
     * Constructs {@link String} representation of this entity instance.
     * @return {@link String} representation of this entity instance.
     */
    @Override
    public String toString() {
        StringBuilder result = new StringBuilder();
        result.append(this.getClass().getSimpleName() + "[");
        result.append("id: " + getId());
        result.append(",  name: " + getName());
        if (getCountry() != null) {
            result.append(", country: " + getCountry());
        } else {
            result.append(", country: null");
        }
        result.append("]");
        return result.toString();
    }
}
