<?php
/**
* Copyright 2011 HubSpot, Inc.
*
*   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.
*/
require_once('class.baseclient.php');

class HubSpot_Blog extends HubSpot_BaseClient {
    //Client for HubSpot Blog API.

    //Define required client variables
    protected $API_PATH = 'blog';
    protected $API_VERSION = 'v1';

    /**
    * Get blogs from a given HubSpot portal, as identified by its API key
    *
    * @param params: Array of Blog API query filters and values
    *                See http://docs.hubapi.com/wiki/Blog_API_Methods for valid filters and values
    * @param content_type: Can be either "json" or "atom" depending on if you want JSON or XML returned.
    *
    * @returns list of blogs in JSON or XML format.
    *
    * @throws HubSpot_Exception
    **/
    public function get_blogs($params, $content_type) {
        $endpoint = 'list.' . $content_type;

        if ($content_type == 'json') {
            try {
                return json_decode($this->execute_get_request($this->get_request_url($endpoint,$params)));
            } catch (HubSpot_Exception $e) {
                throw new HubSpot_Exception('Unable to retrieve blogs: ' . $e);
            }
        } else if ($content_type == 'atom') {
            try {
                return $this->execute_get_request($this->get_request_url($endpoint,$params));
            } catch (HubSpot_Exception $e) {
                throw new HubSpot_Exception('Unable to retrieve blogs: ' . $e);
            }
        } else {
            throw new HubSpot_Exception('Invalid content type, please choose either "json" or "atom"');
        }
    }

    /**
    * Get information about a specific blog
    *
    * @param params: Array of Blog API query filters and values
    *                See http://docs.hubapi.com/wiki/Blog_API_Methods for valid filters and values.
    * @param guid: The blog guid that you're looking for information about.
    * @param content_type: Can be either "json" or "atom" depending on if you want JSON or XML returned.
    *
    * @returns list of blogs in JSON or XML format.
    *
    * @throws HubSpot_Exception
    **/
    public function get_blog($params, $guid, $content_type) {
        $endpoint = $guid . '.' . $content_type;

        if ($content_type == 'json') {
            try {
                return json_decode($this->execute_get_request($this->get_request_url($endpoint, $params)));
            } catch (HubSpot_Exception $e) {
                throw new HubSpot_Exception('Unable to retrieve blogs: ' . $e);
            }
        } else if ($content_type == 'atom') {
            try {
                return $this->execute_get_request($this->get_request_url($endpoint, $params));
            } catch (HubSpot_Exception $e) {
                throw new HubSpot_Exception('Unable to retrieve blogs: ' . $e);
            }
        } else {
            throw new HubSpot_Exception('Invalid content type, please choose either "json" or "atom"');
        }
    }

    /**
    * Get posts from a specific blog
    *
    * @param params: Array of Blog API query filters and values
    *                See http://docs.hubapi.com/wiki/Blog_API_Methods for valid filters and values.
    * @param guid: The blog guid that you're getting posts from.
    * @param content_type: Can be either "json" or "atom" depending on if you want JSON or XML returned.
    *
    * @returns list of blogs in JSON or XML format.
    *
    * @throws HubSpot_Exception
    **/
    public function get_posts($params, $guid, $content_type) {
        $endpoint = $guid . '/posts.' . $content_type;

        if ($content_type == 'json') {
            try {
                return json_decode($this->execute_get_request($this->get_request_url($endpoint, $params)));
            } catch (HubSpot_Exception $e) {
                throw new HubSpot_Exception('Unable to retrieve blogs: ' . $e);
            }
        } else if ($content_type == 'atom') {
            try {
                return $this->execute_get_request($this->get_request_url($endpoint, $params));
            } catch (HubSpot_Exception $e) {
                throw new HubSpot_Exception('Unable to retrieve blogs: ' . $e);
            }
        } else {
            throw new HubSpot_Exception('Invalid content type, please choose either "json" or "atom"');
        }
    }

    /**
    * Get all comments for a specific blog
    *
    * @param params: Array of Blog API query filters and values
    *                See http://docs.hubapi.com/wiki/Blog_API_Methods for valid filters and values.
    * @param guid: The blog guid that you're getting comments from.
    * @param content_type: Can be either "json" or "atom" depending on if you want JSON or XML returned.
    *
    * @returns list of blogs in JSON or XML format.
    *
    * @throws HubSpot_Exception
    **/
    public function get_comments($params, $guid, $content_type) {
        $endpoint = $guid . '/comments.' . $content_type;

        if ($content_type == 'json') {
            try {
                return json_decode($this->execute_get_request($this->get_request_url($endpoint, $params)));
            } catch (HubSpot_Exception $e) {
                throw new HubSpot_Exception('Unable to retrieve blogs: ' . $e);
            }
        } else if ($content_type == 'atom') {
            try {
                return $this->execute_get_request($this->get_request_url($endpoint, $params));
            } catch (HubSpot_Exception $e) {
                throw new HubSpot_Exception('Unable to retrieve blogs: ' . $e);
            }
        } else {
            throw new HubSpot_Exception('Invalid content type, please choose either "json" or "atom"');
        }
    }

    /**
    * Get information about a specific blog post.
    *
    * @param params: Array of Blog API query filters and values
    *                See http://docs.hubapi.com/wiki/Blog_API_Methods for valid filters and values.
    * @param guid: The blog post guid that you're getting information about.
    * @param content_type: Can be either "json" or "atom" depending on if you want JSON or XML returned.
    *
    * @returns list of blogs in JSON or XML format.
    *
    * @throws HubSpot_Exception
    **/
    public function get_post($params, $guid, $content_type) {
        $endpoint = 'posts/' . $guid . '.' . $content_type;

        if ($content_type == 'json') {
            try {
                return json_decode($this->execute_get_request($this->get_request_url($endpoint, $params)));
            } catch (HubSpot_Exception $e) {
                throw new HubSpot_Exception('Unable to retrieve blogs: ' . $e);
            }
        } else if ($content_type == 'atom') {
            try {
                return $this->execute_get_request($this->get_request_url($endpoint, $params));
            } catch (HubSpot_Exception $e) {
                throw new HubSpot_Exception('Unable to retrieve blogs: ' . $e);
            }
        } else {
            throw new HubSpot_Exception('Invalid content type, please choose either "json" or "atom"');
        }
    }

    /**
    * Get comments for a specific blog post.
    *
    * @param params: Array of Blog API query filters and values
    *                See http://docs.hubapi.com/wiki/Blog_API_Methods for valid filters and values.
    * @param guid: The blog post guid that you're getting comments from.
    * @param content_type: Can be either "json" or "atom" depending on if you want JSON or XML returned.
    *
    * @returns list of blogs in JSON or XML format.
    *
    * @throws HubSpot_Exception
    **/
    public function get_post_comments($params, $post_guid, $content_type) {
        $endpoint = 'posts/' . $post_guid . '/comments.' . $content_type;

        if ($content_type == 'json') {
            try {
                return json_decode($this->execute_get_request($this->get_request_url($endpoint, $params)));
            } catch (HubSpot_Exception $e) {
                throw new HubSpot_Exception('Unable to retrieve blogs: ' . $e);
            }
        } else if ($content_type == 'atom') {
            try {
                return $this->execute_get_request($this->get_request_url($endpoint, $params));
            } catch (HubSpot_Exception $e) {
                throw new HubSpot_Exception('Unable to retrieve blogs: ' . $e);
            }
        } else {
            throw new HubSpot_Exception('Invalid content type, please choose either "json" or "atom"');
        }
    }

    /**
    * Get information about a specific comment.
    *
    * @param params: Array of Blog API query filters and values
    *                See http://docs.hubapi.com/wiki/Blog_API_Methods for valid filters and values.
    * @param guid: The comment guid that you're getting information about.
    * @param content_type: Can be either "json" or "atom" depending on if you want JSON or XML returned.
    *
    * @returns list of blogs in JSON or XML format.
    *
    * @throws HubSpot_Exception
    **/
    public function get_comment($params, $comment_guid, $content_type) {
        $endpoint = 'comments/' . $comment_guid . '.' . $content_type;

        if ($content_type == 'json') {
            try {
                return json_decode($this->execute_get_request($this->get_request_url($endpoint, $params)));
            } catch (HubSpot_Exception $e) {
                throw new HubSpot_Exception('Unable to retrieve blogs: ' . $e);
            }
        } else if ($content_type == 'atom') {
            try {
                return $this->execute_get_request($this->get_request_url($endpoint, $params));
            } catch (HubSpot_Exception $e) {
                throw new HubSpot_Exception('Unable to retrieve blogs: ' . $e);
            }
        } else {
            throw new HubSpot_Exception('Invalid content type, please choose either "json" or "atom"');
        }
    }


    /**
    * Create a blog post in draft mode (not published)
    *
    * @param blog_guid: The blog guid that you're creating the new post in.
    * @param author_name: The author name for the post you're creating.
    * @param author_email: The author email for the post you're creating. Please note that this email MUST be a vaild user
    *       in the HubSpot portal you're creating the blog post in.
    * @param title: The title of the blog post you're creating.
    * @param summary: The summary of the blog post you're creating.
    * @param post_content: The blog post itself that you're creating. Can be HTML.
    * @param tags: An array of tags that you want to tag the blog post which you're creating. This must be an array,
    *           see "example.php" for an example.
    *
    * @returns Body of POST request
    *
    * @throws HubSpot_Exception
    **/
    public function create_post($blog_guid, $author_name, $author_email, $title, $summary, $post_content, $tags) {
        $endpoint = $blog_guid . '/posts.atom';

        if ($this->isBlank($title)) {
            throw new HubSpot_Exception('Blog title is required!');
        } else if ($this->isBlank($post_content)) {
            throw new HubSpot_Exception('Blog content is required!');
        } else if ($this->isBlank($author_email)) {
            throw new HubSpot_Exception('Author email is required!');
        }

        $tag_to_input = '';
        foreach ($tags as $tag) {
            $tag_to_input = $tag_to_input . '<category term="'. $tag .'" />';
        }

        $body = '<?xml version="1.0" encoding="utf-8"?>
            <entry xmlns="http://www.w3.org/2005/Atom">
              <title>' . $title . '</title>
                 <author>
                   <name>' . $author_name . '</name>
                   <email>' . $author_email .'</email>
                 </author>
                 <summary>' . $summary . '</summary>
                 <content type="html"><![CDATA['.$post_content.']]></content>
                 '. $tag_to_input .'
            </entry>';

        try {
            return $this->execute_xml_post_request($this->get_request_url($endpoint,null), $body);
        } catch (HubSpot_Exception $e) {
            throw new HubSpot_Exception('Unable to add blog post: ' . $e);
        }
    }

    /**
    * Update a blog post
    *
    * @param post_guid: The blog post guid that you're getting information about.
    * @param title: The title of the blog post you're creating.
    * @param summary: The summary of the blog post you're creating.
    * @param post_content: The blog post itself that you're creating.
    * @param tags: An array of tags that you want to tag the blog post which you're creating. This must be an array,
    *           see "example.php" for an example.
    * @param meta_desc: The meta description that you want to update (or create)
    * @param keywords: An array of meta keywords that you want to update or create anew.
    *
    * @returns Body of POST request
    *
    * @throws HubSpot_Exception
    **/
    public function update_post($post_guid, $title, $summary, $post_content, $tags, $meta_desc, $keywords) {
        $endpoint = 'posts/' . $post_guid . '.atom';

        if ($this->isBlank($post_guid)) {
            throw new HubSpot_Exception('Post guid is required!');
        }

        $tag_to_input = '';
        foreach ($tags as $tag) {
            $tag_to_input = $tag_to_input . '<category term="'. $tag .'" />';
        }
        $keywords_to_input = '';
        foreach ($keywords as $word) {
            $keywords_to_input = $keywords_to_input . $word . ',';
        }

        $body = '<?xml version="1.0" encoding="utf-8"?>
        <entry xmlns="http://www.w3.org/2005/Atom" xmlns:hs="http://www.hubspot.com/">
            <title>'. $title .'</title>
            <summary>'. $summary .'</summary>
            <content type="text">'. $post_content .'</content>
            '. $tag_to_input .'
            <hs:metaDescription>'. $meta_desc .'</hs:metaDescription>
            <hs:metaKeywords>'. $keywords_to_input .'</hs:metaKeywords>
        </entry>';
        //echo $body;

        try {
            return $this->execute_xml_put_request($this->get_request_url($endpoint,null), $body);
        } catch (HubSpot_Exception $e) {
            throw new HubSpot_Exception('Unable to update blog post: ' . $e);
        }
    }

    /**
    * Publish a blog post (making its state go from draft to published)
    *
    * @param post_guid: The blog post guid that you're publishing.
    * @param publish_time: This is an ISO-8601 formatted date string in UTC time (i.e. 2011-03-13T18:30:02Z). See example.php for help.
    * @param should_notify: If false then email and social media notifications will be not be sent. If not specified or explicitly set
    *           to true, then the email and social media notifications will go out as normal.
    *
    * @returns Body of POST request
    *
    * @throws HubSpot_Exception
    **/
    public function publish_post($post_guid, $publish_time, $should_notify) {
        $endpoint = 'posts/' . $post_guid . '.atom';

        if ($this->isBlank($post_guid)) {
            throw new HubSpot_Exception('Post guid is required!');
        }

        $body = '<?xml version="1.0" encoding="utf-8"?>
        <entry xmlns="http://www.w3.org/2005/Atom" xmlns:hs="http://www.hubspot.com/">
            <published>'. $publish_time .'</published>
            <hs:draft>false</hs:draft>
            <hs:sendNotifications>'. $should_notify .'</hs:sendNotifications>
        </entry>';

        try {
            return $this->execute_xml_put_request($this->get_request_url($endpoint,null), $body);
        } catch (HubSpot_Exception $e) {
            throw new HubSpot_Exception('Unable to publish blog post: ' . $e);
        }
    }

    /**
    * Create a blog comment in a blog post
    *
    * @param post_guid: The blog post guid for the comment that you're publishing.
    * @param author_name: The author name for the comment you're creating.
    * @param author_email: The author email for the comment you're creating.
    * @param url: The website URL for the comment author.
    * @param comment: The comment text, can be HTML.
    *
    * @returns Body of POST request
    *
    * @throws HubSpot_Exception
    **/
    public function create_comment($post_guid, $author_name, $author_email, $url, $comment) {
        $endpoint = 'posts/' . $post_guid . '/comments.atom';

        $body = '<?xml version="1.0" encoding="utf-8"?>
        <entry xmlns="http://www.w3.org/2005/Atom">
          <author>
            <name>'.$author_name.'</name>
            <email>'.$author_email.'</email>
            <uri>'.$url.'</uri>
          </author>
          <content><![CDATA['.$comment.']]></content>
        </entry>';

        try {
            return $this->execute_xml_post_request($this->get_request_url($endpoint,null), $body);
        } catch (HubSpot_Exception $e) {
            throw new HubSpot_Exception('Unable to add blog post: ' . $e);
        }
    }
}