package eu.toldi.rss;

import com.thoughtworks.xstream.annotations.XStreamAlias;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import java.awt.*;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * Egy RSS hírcsatornán található cikk reprezentálására használt osztály.
 */
@XStreamAlias("article")
public class Article {
    /**
     * A Cikk címe
     */
    private String title;
    /**
     * A cíkk elérési útvonala
     */
    @XStreamAlias("link")
    private String URL;
    /**
     * A cikkhez tartozó leírás
     */
    @XStreamAlias("description")
    private String Description;
    /**
     * Cikkhez tartozó kép elérési útvonala
     */
    private String imageURL;
    /**
     * A cikk szerzője
     */
    private String author;
    /**
     * A cikk kiadásának dátuma
     */
    private LocalDateTime pubDate;
    @Override
    public String toString() {
        return "Article{" +
                "title='" + title + '\'' +
                ", URL='" + URL + '\'' +
                ", Description='" + Description + '\'' +
                ", imageURL='" + imageURL + '\'' +
                ", author='" + author + '\'' +
                ", pubDate=" + pubDate+
                '}';
    }

    public Article(){}

    /**
     * Cikk beolvasása egy megadott Node objektumból. Egy hírcsatorna beolvasásakor könnyedén alkalmazható egy "item" Node-ra
     * @param article Egy "item" Node egy RSS hírcsatornáról
     */
    public Article(Node article){
        NodeList properties = article.getChildNodes();
        for (int j = 0; j < properties.getLength(); j++) {
            Node node = properties.item(j);
            String tagName = node.getNodeName();
            switch (tagName) {
                case "title":
                    this.setTitle(node.getTextContent());
                    break;
                case "author":
                case "dc:creator":
                    this.setAuthor(node.getTextContent());
                    break;
                case "pubDate":
                    this.setPubDate(LocalDateTime.parse(node.getTextContent(), DateTimeFormatter.RFC_1123_DATE_TIME));
                    break;
                case "link":
                    this.setURL(node.getTextContent());
                    break;
                case "description":
                    this.setDescription(node.getTextContent());
                    break;
                case "enclosure":
                    Element e = (Element) node;
                    if (e.getAttribute("type").equals("image/png") || e.getAttribute("type").equals("image/jpeg"))
                        this.setImageURL(e.getAttribute("url"));
                default:
                    break;
            }
        }
    }

    /**
     * Cikk címének lekérése
     * @return a cikk címe
     */
    public String getTitle() {
        return title;
    }

    /**
     * Cikk címének beállítása
     * @param title a cikk új címe
     */
    public void setTitle(String title) {
        this.title = title;
    }

    /**
     * A cikkre mutató link lekérése
     * @return a cikkre mutató link
     */
    public String getURL() {
        return URL;
    }

    /**
     * A cikkre mutató link beállítása
     * @param URL a cikkre mutató link
     */
    public void setURL(String URL) {
        this.URL = URL;
    }

    /**
     * Cikk leírásának lekérése
     * @return a cikk leírása
     */
    public String getDescription() {
        return Description;
    }

    /**
     * Cikk leírásának beállítása
     * @param description a cikk leírása
     */
    public void setDescription(String description) {
        Description = description;
    }

    /**
     * A cikkhez tartózó kép címének lekérése
     * @return a cikkhez tartózó kép címe
     */
    public String getImageURL() {
        return imageURL;
    }

    /**
     * A cikkhez tartózó kép címének beállítása
     * @param imageURL a cikkhez tartózó kép címe
     */
    public void setImageURL(String imageURL) {
        this.imageURL = imageURL;
    }

    /**
     * A cikk írójának lekérése
     * @return a cikk írója
     */
    public String getAuthor() {
        return author;
    }

    /**
     * A cikk írójának beállítása
     * @param author a cikk írója
     */
    public void setAuthor(String author) {
        this.author = author;
    }

    /**
     * A cikk kiadásának dátumának lekérése
     * @return a cikk kiadásának dátuma
     */
    public LocalDateTime getPubDate() {
        return pubDate;
    }

    /**
     * A cikk kiadási dátumának beállítása
     * @param pubDate acikk kiadási dátuma
     */
    public void setPubDate(LocalDateTime pubDate) {
        this.pubDate = pubDate;
    }

    /**
     * A cikk megnyitása böngészőben (ha ez lehetséges)
     */
    public void open(){
        if(getURL() == null) return;
        Desktop desktop;
        if(Desktop.isDesktopSupported() && (desktop = Desktop.getDesktop()).isSupported(Desktop.Action.BROWSE)){
            try {
                desktop.browse(new URI(URL));
            } catch (IOException | URISyntaxException e) {
                e.printStackTrace();
            }
        }else{
            Runtime runtime = Runtime.getRuntime();
            try {
                runtime.exec("xdg-open " + URL);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
