package page.tools.xml;

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

public class RSSItem implements Comparable<RSSItem> {
    
    private String title;
    private String link;
    private String description;
    private String guid;
    private long pubDate = -1;
    
    public RSSItem() {
        
    }
    
    public RSSItem(String title) {
        setTitle(title);
    }    
    
    public RSSItem(String title, String description) {
        setTitle(title);
        setDescription(description);
    }

    public Node getNode(Document doc) {
        
        Element item = doc.createElement("item");
        
        Element title = doc.createElement("title");
        title.setTextContent(this.getTitle());          
        Element description = doc.createElement("description");
        description.setTextContent(this.getDescription());        
        Element pubDate = doc.createElement("pubDate");
        pubDate.setTextContent(formatDate(this.getPubDate()));  
        
        item.appendChild(title);
        if (this.getLink() != null) {
            Element link = doc.createElement("link");
            link.setTextContent(this.getLink());
            item.appendChild(link);            
        }
        item.appendChild(description);
        if (this.getGuid() != null) {
            Element guid = doc.createElement("guid");
            guid.setTextContent(this.getGuid());             
            item.appendChild(guid);
        }
        item.appendChild(pubDate);
        
        return 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 long getPubDate() {
        return pubDate;
    }

    public void setPubDate(long pubDate) {
        this.pubDate = pubDate;
    }
    
    private String formatDate(long time) {
        return HTTPHeaders.formatDate(time);
    }

    public String getGuid() {
        if (guid == null) {
            // Generate one
            String full = "";
            if (getTitle() != null) full += getTitle();
            if (getDescription() != null) full += getDescription();
            this.guid = WareHouse.getMD5String(full);
        }
        return guid;
    }

    public void setGuid(String guid) {
        this.guid = guid;
    }
    
    public int compareTo(RSSItem item) {
        if (getGuid().equals(item.getGuid())) return 0;
        if (item.getPubDate() < getPubDate()) return -1;
        return 1;
    }
    
    public boolean equals(RSSItem item) {
        return getGuid().equals(item.getGuid());
    }
}

