/*
 *  Copyright 2007 Dave Johnson (Blogapps project)
 *
 * 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.propono.blogclient;

import java.util.Date;
import java.util.List;

/**
 * Represents a single blog entry.
 */
public interface BlogEntry {

    /** Get token, which can be used to fetch the blog entry */
    public String getToken();

    /**
     * Save this entry to it's collection. If this is a new entry and does not have a collection
     * yet, then save() will save it to the primary collection.
     */
    public void save() throws BlogClientException;

    /** Delete this entry from blog server */
    public void delete() throws BlogClientException;

    /** Permanent link to this entry (assigned by server) */
    public String getPermalink();

    /** Blog is associated with a blog */
    public Blog getBlog();

    /** Get categories, a list of BlogEntry.Category objects */
    public List<Category> getCategories();

    /** Set categories, a list of BlogEntry.Category objects */
    public void setCategories(List<Category> categories);

    /** Get globally unique ID of this blog entry */
    public String getId();

    /** Get title of this blog entry */
    public String getTitle();

    /** Set title of this blog entry */
    public void setTitle(String title);

    /** Get summary of this blog entry */
    public String getSummary();

    /** Set summary of this blog entry */
    public void setSummary(String summary);

    /** Get content of this blog entry */
    public Content getContent();

    /** Set content of this blog entry */
    public void setContent(Content content);

    /** Get draft status of this entry */
    public boolean getDraft();

    /** Set draft status of this entry */
    public void setDraft(boolean draft);

    /** Get author of this entry */
    public Person getAuthor();

    /** Set author of this entry */
    public void setAuthor(Person author);

    /** Set publish date of this entry */
    public Date getPublicationDate();

    /** Get publish date of this entry */
    public void setPublicationDate(Date date);

    /** Get update date of this entry */
    public Date getModificationDate();

    /** Set update date of this entry */
    public void setModificationDate(Date date);

    /** Represents blog entry content */
    public class Content {
        String type = "html";
        String value = null;
        String src = null;

        /** Construct content */
        public Content() {
        }

        /** Construct content with value (and type="html") */
        public Content(final String value) {
            this.value = value;
        }

        /** Get value of content if in-line */
        public String getValue() {
            return value;
        }

        /** Set value of content if in-line */
        public void setValue(final String value) {
            this.value = value;
        }

        /**
         * Get type of content, either "text", "html", "xhtml" or a MIME content-type. Defaults to
         * HTML.
         */
        public String getType() {
            return type;
        }

        /**
         * Set type of content, either "text", "html", "xhtml" or a MIME content-type. Defaults to
         * HTML.
         */
        public void setType(final String type) {
            this.type = type;
        }

        /** Get URI of content if out-of-line */
        public String getSrc() {
            return src;
        }

        /** Set URI of content if out-of-line */
        public void setSrc(final String src) {
            this.src = src;
        }
    }

    /** Represents a blog author or contributor */
    public class Person {
        String name;
        String email;
        String url;

        /** Get person's email */
        public String getEmail() {
            return email;
        }

        /** Set person's email */
        public void setEmail(final String email) {
            this.email = email;
        }

        /** Get person's name */
        public String getName() {
            return name;
        }

        /** Set person's name */
        public void setName(final String name) {
            this.name = name;
        }

        /** Get person's URL */
        public String getUrl() {
            return url;
        }

        /** Set person's URL */
        public void setUrl(final String url) {
            this.url = url;
        }

        /** Returns person's name */
        @Override
        public String toString() {
            return name;
        }
    }

    /** Represents a weblog category */
    public class Category {
        String id;
        String name;
        String url;

        /**
         * Create new Catetory
         */
        public Category() {
        }

        /**
         * Create new category with name.
         */
        public Category(final String id) {
            this.id = id;
            name = id;
        }

        /**
         * Determines if categories are equal based on id.
         */
        @Override
        public boolean equals(final Object obj) {
            final Category other = (Category) obj;
            if (obj == null) {
                return false;
            }
            if (getId() != null && other.getId() != null && getId().equals(other.getId())) {
                return true;
            }
            return false;
        }

        /** Get category id */
        public String getId() {
            return id;
        }

        /** Set category id */
        public void setId(final String id) {
            this.id = id;
        }

        /** Get category display name */
        public String getName() {
            return name;
        }

        /** Set category display name */
        public void setName(final String name) {
            this.name = name;
        }

        /** Get URL of category domain */
        public String getUrl() {
            return url;
        }

        /** Set URL of category domain */
        public void setUrl(final String url) {
            this.url = url;
        }

        /** Return category's name or id for display */
        @Override
        public String toString() {
            return name != null ? name : id;
        }
    }
}
