package page.tools.xml;

import java.util.Collection;
import java.util.Set;
import java.util.TreeSet;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.wikiwebserver.core.WikiWebServer;
import org.wikiwebserver.handler.http.HTTPHeaders;

public class RSSChannel {
    
    private static final String GENERATOR = "WikiWebServer " + WikiWebServer.VERSION_CODE;    
    
    private String name;
    private String title;
    private String link;
    private String description;
    private String language = "en-us";
    private long pubDate = System.currentTimeMillis();
    private long lastBuildDate = pubDate;
    
    private Set<RSSItem> items = new TreeSet<RSSItem>();
    
    public RSSChannel() {
        
    }
    
    public RSSChannel(String name, String title, String link, String description) {
        setName(name);
        setTitle(title);
        setLink(link);
        setDescription(description);
    }

    public Node getNode(Document doc) {
        
        Element channel = doc.createElement("channel");
        
        Element title = doc.createElement("title");
        title.setTextContent(this.getTitle());   
        Element link = doc.createElement("link");
        link.setTextContent(this.getLink());        
        Element description = doc.createElement("description");
        description.setTextContent(this.getDescription());        
        Element language = doc.createElement("language");
        language.setTextContent(this.getLanguage());        
        Element pubDate = doc.createElement("pubDate");
        pubDate.setTextContent(formatDate(this.getPubDate()));        
        Element lastBuildDate = doc.createElement("lastBuildDate");
        lastBuildDate.setTextContent(formatDate(this.getLastBuildDate()));   
        Element generator = doc.createElement("generator");
        generator.setTextContent(GENERATOR);        
        
        channel.appendChild(title);
        channel.appendChild(link);
        channel.appendChild(description);
        channel.appendChild(language);
        channel.appendChild(pubDate);
        channel.appendChild(lastBuildDate);
        channel.appendChild(generator);
        
        for (RSSItem item : getItems()) {
            channel.appendChild(item.getNode(doc));
        }
        
        return channel;
    }
    
    public void addAllItems(Collection<RSSItem> moreItems) {
        items.addAll(items);
    }
    
    public void addItem(RSSItem item) {
        items.add(item);
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getLink() {
        return link;
    }

    public void setLink(String link) {
        this.link = link;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getLanguage() {
        return language;
    }

    public void setLanguage(String language) {
        this.language = language;
    }

    public long getPubDate() {
        return pubDate;
    }

    public void setPubDate(long pubDate) {
        this.pubDate = pubDate;
    }

    public long getLastBuildDate() {
        return lastBuildDate;
    }

    public void setLastBuildDate(long lastBuildDate) {
        this.lastBuildDate = lastBuildDate;
    }

    public Collection<RSSItem> getItems() {
        return items;
    }

    public void setItems(Set<RSSItem> items) {
        this.items = items;
    }
    
    private String formatDate(long time) {
        return HTTPHeaders.formatDate(time);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

