/*******************************************************************************
 * Copyright (c) 2011-2012 Oracle. All rights reserved.
 * This program and the accompanying materials are made available under the 
 * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
 * which accompanies this distribution. 
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
 * and the Eclipse Distribution License is available at 
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * Contributors:
 *      dclarke - Bug 361016: Future Versions Examples
 ******************************************************************************/
package temporal;

import java.io.StringWriter;

import javax.persistence.Column;
import javax.persistence.Embeddable;

import org.eclipse.persistence.internal.helper.Helper;

/**
 * Embedded class encompassing the effectivity start and end dates as well as a
 * reference to the continuity. This class is mapped onto temporal entity
 * classes that implement {@link TemporalEntity}
 * 
 * @author dclarke
 * @since EclipseLink 2.3.1
 */
@Embeddable
public class Effectivity {

    /**
     * Beginning Of Time (BOT) value used to indicate the current version in
     * this example since no history is maintained.
     */
    public static final long BOT = 0;

    /**
     * End Of Time (EOT) value used to represent that the edition using this
     * value has no planned termination.
     */
    public static final long EOT = Long.MAX_VALUE;

    /**
     * Start time where this edition is planned to become the current edition.
     * The current edition always has a start value of {@value #BOT}.
     */
    @Column(name = "START_TS")
    private long start = BOT;

    /**
     * The end time where this edition is planned to be replaced another
     * edition. The final edition in the sequence that has no planned terminal
     * time will have a value of {@link #EOT}
     */
    @Column(name = "END_TS")
    private long end = EOT;

    public Effectivity() {
    }

    public long getStart() {
        return start;
    }

    public void setStart(long start) {
        this.start = start;
    }

    public long getEnd() {
        return end;
    }

    public void setEnd(long end) {
        this.end = end;
    }

    public boolean isCurrent() {
        return getStart() == BOT;
    }

    /**
     * @return <code>true</code> if this edition only exists in the future.
     */
    public boolean isFutureEdition() {
        return getStart() > BOT;
    }

    public String toString() {
        return "Effectivity(" + timeString(getStart()) + " - " + timeString(getEnd()) + ")";
    }

    public String toString(TemporalEntity<?> entity) {
        StringWriter writer = new StringWriter();

        writer.write(Helper.getShortClassName(entity));
        writer.write("(" + entity.getId() + ")");
        writer.write("Effective: ");
        writer.write(timeString(getStart()));
        writer.write(" to ");
        writer.write(timeString(getEnd()));

        return writer.toString();
    }

    protected static String timeString(long ts) {
        if (ts == BOT) {
            return "BOT";
        }
        if (ts == EOT) {
            return "EOT";
        }
        return Long.toString(ts);
    }

    public boolean includes(Long effective) {
        if (effective == null) {
            return includes(BOT);
        }
        return getStart() <= effective && getEnd() > effective;
    }
}