/*
 * Licensed 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 com.rometools.modules.sse.modules;

import java.util.Date;

import com.rometools.rome.feed.CopyFrom;

/**
 * <pre>
 * <sx:related>
 * </pre>
 *
 * Element within
 *
 * <pre>
 * <sx:sharing>
 * </pre>
 *
 * .
 */
public class Related extends SSEModule {
    private static final long serialVersionUID = 1L;

    public static final String NAME = "related";

    /**
     * Indicates whether the link points to a file containing the complete collection of items for
     * this feed.
     */
    public static final int COMPLETE = 0;

    /**
     * Indicates whether the link points to a feed whose contents are being incorporated into this
     * feed by the publisher.
     */
    public static final int AGGREGATED = 1;

    // url for related feeds
    private String link;
    // name or description of the related feed
    private String title;
    // the type of the relation "complete" or "aggregated"
    private Integer type;
    // starting point of the related feed
    private Date since;
    // ending point of a feed
    private Date until;

    public static final String LINK_ATTRIBUTE = "link";
    public static final String SINCE_ATTRIBUTE = "since";
    public static final String TITLE_ATTRIBUTE = "title";
    public static final String TYPE_ATTRIBUTE = "type";
    public static final String UNTIL_ATTRIBUTE = "until";

    @Override
    public void copyFrom(final CopyFrom obj) {
        final Related related = (Related) obj;
        related.link = link;
        related.since = since == null ? null : (Date) since.clone();
        related.title = title;
        related.type = type;
        related.until = until == null ? null : (Date) until.clone();
    }

    /**
     * link A required, URL attribute. The URL for related feeds.
     *
     * @return the URL for related feeds
     */
    // TODO: use a java.net.URL?
    public String getLink() {
        return link;
    }

    /**
     * Set the URL for related feeds.
     *
     * @param link the URL for related feeds.
     */
    public void setLink(final String link) {
        this.link = link;
    }

    /**
     * title An optional, string attribute. The name or description of the related feed.
     *
     * @return The name or description of the related feed.
     */
    public String getTitle() {
        return title;
    }

    /**
     * Set the name or description of the related feed.
     *
     * @param title the name or description of the related feed.
     */
    public void setTitle(final String title) {
        this.title = title;
    }

    /**
     * type A required, string attribute. This attribute can have one of the following values:
     * <p>
     * "complete" if the link points to file containing the complete collection of items for this
     * feed.
     * <p>
     * "aggregated" if the link points to a feed whose contents are being incorporated into this
     * feed by the publisher.
     *
     * @return the type of the releated feed.
     */
    public Integer getType() {
        return type;
    }

    /**
     * Set the type of relationship, complete or aggregated.
     *
     * @param type the type of relationship, complete or aggregated.
     */
    public void setType(final Integer type) {
        this.type = type;
    }

    /**
     * An optional, date-time attribute. This is the starting point of the related feed. If this
     * attribute is omitted or blank, it is assumed that this is a complete feed.
     *
     * @return the starting point of the related feed.
     */
    public Date getSince() {
        return since;
    }

    /**
     * Set the starting point of the related feed.
     *
     * @param since the starting point of the related feed.
     */
    public void setSince(final Date since) {
        this.since = since;
    }

    /**
     * An optional, date-time attribute. This is the ending point of a feed.
     *
     * @return the ending point of the feed, until.
     */
    public Date getUntil() {
        return until;
    }

    /**
     * Set the ending point of the feed, until. An optional, date-time attribute.
     *
     * @param until the ending point of the feed.
     */
    public void setUntil(final Date until) {
        this.until = until;
    }
}
