/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.apache.openjpa.persistence.jdbc.annotations;


import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import jakarta.persistence.Basic;
import jakarta.persistence.Column;
import jakarta.persistence.DiscriminatorColumn;
import jakarta.persistence.DiscriminatorValue;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.Id;
import jakarta.persistence.IdClass;
import jakarta.persistence.Inheritance;
import jakarta.persistence.InheritanceType;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.JoinTable;
import jakarta.persistence.ManyToMany;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToOne;
import jakarta.persistence.Table;
import jakarta.persistence.Version;

@Entity
@Table(name = "ANNOTEST2")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "ANNOCLS")
@DiscriminatorValue("ANNO2")
@IdClass(AnnoTest2.Oid.class)
public class AnnoTest2 {

    @Id
    @Column(name = "PK1")
    protected long pk1;

    @Id
    @Column(name = "PK2")
    protected String pk2;

    @Version
    @Column(name = "ANNOVER")
    protected Date version;

    @Basic
    protected String basic;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "INVERSEONEONE_PK", referencedColumnName = "PK")
    protected AnnoTest1 inverseOneOne;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "MANYONEONE_PK", referencedColumnName = "PK")
    protected AnnoTest1 oneManyOwner;

    @ManyToMany
    @JoinTable(name = "ANNOTEST2_MANYMANY",
        joinColumns = {
        @JoinColumn(name = "MANY_PK1", referencedColumnName = "PK1"),
        @JoinColumn(name = "MANY_PK2", referencedColumnName = "PK2") },
        inverseJoinColumns =
        @JoinColumn(name = "MANYE_PK", referencedColumnName = "PK"))
    protected Set<AnnoTest1> manyMany = new HashSet();

    public AnnoTest2() {
    }

    public AnnoTest2(long pk1, String pk2) {
        this.pk1 = pk1;
        this.pk2 = pk2;
    }

    public void setPk1(long val) {
        pk1 = val;
    }

    public long getPk1() {
        return pk1;
    }

    public void setPk2(String str) {
        pk2 = str;
    }

    public String getPk2() {
        return pk2;
    }

    public Date getVersion() {
        return version;
    }

    public void setBasic(String s) {
        basic = s;
    }

    public String getBasic() {
        return basic;
    }

    public void setInverseOneOne(AnnoTest1 other) {
        inverseOneOne = other;
    }

    public AnnoTest1 getInverseOneOne() {
        return inverseOneOne;
    }

    public void setOneManyOwner(AnnoTest1 other) {
        oneManyOwner = other;
    }

    public AnnoTest1 getOneManyOwner() {
        return oneManyOwner;
    }

    public Set getManyMany() {
        return manyMany;
    }

    public static class Oid {

        public long pk1;
        public String pk2;

        public Oid() {
        }

        public Oid(long pk1, String pk2) {
            this.pk1 = pk1;
            this.pk2 = pk2;
        }

        public Oid(String str) {
            if (str != null) {
                int index = str.indexOf(",");
                pk1 = Long.parseLong(str.substring(0, index));
                pk2 = str.substring(index + 1);
                if ("null".equals(pk2))
                    pk2 = null;
            }
        }

        @Override
        public boolean equals(Object o) {
            if (o == this)
                return true;
            if (!(o instanceof Oid))
                return false;
            Oid other = (Oid) o;
            if (pk1 != other.pk1)
                return false;
            if (pk2 == null)
                return other.pk2 == null;
            return pk2.equals(other.pk2);
        }

        @Override
        public int hashCode() {
            return ((int) pk1) + (pk2 == null ? 0 : pk2.hashCode());
        }

        @Override
        public String toString() {
            return pk1 + "," + (pk2 == null ? "null" : pk2);
        }
    }
}
