/*
 * 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.geronimo.javamail.store.nntp.newsrc;

import java.io.IOException;
import java.io.Writer;

public class NNTPNewsrcGroup {
    // the newsrc database we're part of
    NNTPNewsrc newsrc;

    // the name of the group
    protected String name;

    // the subscription flage
    protected boolean subscribed;

    // the range of already seen articles.
    protected RangeList ranges;

    /**
     * Construct a NNTPNewsrcGroup item associated with a given .newsrc
     * database.
     * 
     * @param newsrc
     *            The owning .newsrc database.
     * @param line
     *            The .newsrc range entries in .newsrc format. These ranges are
     *            parsed to create a set of seen flags.
     * 
     * @return A created NNTPNewsrcGroup item.
     */
    public static NNTPNewsrcGroup parse(NNTPNewsrc newsrc, String line) {
        String groupName = null;
        String ranges = null;

        // subscribed lines have a ':' marker acting as a delimiter
        int marker = line.indexOf(':');

        if (marker != -1) {
            groupName = line.substring(0, marker);
            ranges = line.substring(marker + 1);
            return new NNTPNewsrcGroup(newsrc, groupName, ranges, true);
        }

        // now check for an unsubscribed group
        marker = line.indexOf('!');

        if (marker != -1) {
            groupName = line.substring(0, marker);
            ranges = line.substring(marker + 1);
            return new NNTPNewsrcGroup(newsrc, groupName, ranges, false);
        }

        // must be a comment line
        return null;
    }

    /**
     * Construct a .newsrc group item.
     * 
     * @param newsrc
     *            The owning newsrc database.
     * @param name
     *            The group name.
     * @param newsrcRanges
     *            The initial set of seen ranges for the group (may be null).
     * @param subscribed
     *            The initial group subscription state.
     */
    public NNTPNewsrcGroup(NNTPNewsrc newsrc, String name, String newsrcRanges, boolean subscribed) {
        this.newsrc = newsrc;
        this.name = name;
        this.subscribed = subscribed;
        this.ranges = new RangeList(newsrcRanges);
    }

    /**
     * Get the group name.
     * 
     * @return The String name of the group.
     */
    public String getName() {
        return name;
    }

    /**
     * Get the newsrc subscribed status for an article.
     * 
     * @return The current subscription flag.
     */
    public boolean isSubscribed() {
        return subscribed;
    }

    /**
     * Set the subscription status for an article.
     * 
     * @param flag
     *            The new subscription value.
     */
    public void setSubscribed(boolean flag) {
        // we don't blindly set this to the new value since we only want to
        // resave the newsrc file if
        // something changes.
        if (flag && !subscribed) {
            subscribed = true;
            newsrc.setDirty();
        } else if (!flag && subscribed) {
            subscribed = false;
            newsrc.setDirty();
        }
    }

    /**
     * Test if an article has been seen yet.
     * 
     * @param article
     *            The target article.
     * 
     * @return The seen mark for the article.
     */
    public boolean isArticleSeen(int article) {
        return ranges.isMarked(article);
    }

    /**
     * Mark an article as seen.
     * 
     * @param article
     *            The target article number.
     */
    public void markArticleSeen(int article) {
        ranges.setMarked(article);
        if (ranges.isDirty()) {
            newsrc.setDirty();
        }
    }

    /**
     * Mark an article as unseen.
     * 
     * @param article
     *            The target article number.
     */
    public void markArticleUnseen(int article) {
        ranges.setUnmarked(article);
        if (ranges.isDirty()) {
            newsrc.setDirty();
        }
    }

    /**
     * Save this group definition to a .newsrc file.
     * 
     * @param out
     *            The output writer to send the information to.
     * 
     * @exception IOException
     */
    public void save(Writer out) throws IOException {
        out.write(name);
        out.write(subscribed ? ": " : "! ");
        ranges.save(out);
        // put a terminating line end
        out.write("\r\n");
    }
}
