<?php
/*
 * Sakura News Page
 */

// Declare Namespace
namespace Sakura;

// Use DOMDocument
use DOMDocument;

// Include components
require_once str_replace(basename(__DIR__), '', dirname(__FILE__)) .'_sakura/sakura.php';

// Get user data
$disqus_user = Users::getUser(Session::$userId);

// Set disqus data
$disqus_data = [
    $disqus_user['id'],
    $disqus_user['username'],
    $disqus_user['email'],
    'http://'. Configuration::getConfig('url_main') .'/a/'. $disqus_user['id'],
    'http://'. Configuration::getConfig('url_main') .'/u/'. $disqus_user['id']
];

// Add page specific things
$renderData['newsPosts'] = Main::getNewsPosts((isset($_GET['id']) && !isset($_GET['xml']) && is_numeric($_GET['id'])) ? $_GET['id'] : null, (isset($_GET['id']) && !isset($_GET['xml']) && is_numeric($_GET['id'])));
$renderData['page'] = [
    'title'         => (isset($_GET['id']) ? (count($renderData['newsPosts']) ? $renderData['newsPosts'][0]['title'] : 'Post does not exist!') : 'News'),
    'disqus_sso'    => (($disqus_message = base64_encode(json_encode($disqus_data))) .' '. Main::dsqHmacSha1($disqus_message .' '. time(), Configuration::getConfig('disqus_api_secret')) .' '. time()),
    'view_post'     => isset($_GET['id']) && count($renderData['newsPosts']),
    'currentPage'   => 0
];

// News XML feed
if(isset($_GET['xml'])) {
    
    // Meta data attributes
    $metaData = [
        'title'         => ($_FEED_TITLE = Configuration::getConfig('sitename')) .' News',
        'link'          => ($_FEED_URL = 'http://'. Configuration::getConfig('url_main')),
        'description'   => 'News about '. $_FEED_TITLE,
        'language'      => 'en-gb',
        'webMaster'     => Users::getUser(1)['email'] .' ('. $_FEED_TITLE .' Webmaster)',
        'pubDate'       => ($_FEED_DATE = date('r', $renderData['newsPosts'][0]['date'])),
        'lastBuildDate' => $_FEED_DATE,
    ];

    // Item attributes
    $itemData = [
        'title'         => ['text' => '{EVAL}',                     'eval' => '$newsPost["title"]'],
        'link'          => ['text' => $_FEED_URL .'/news/{EVAL}',   'eval' => '$newsPost["id"]'],
        'guid'          => ['text' => $_FEED_URL .'/news/{EVAL}',   'eval' => '$newsPost["id"]'],
        'pubDate'       => ['text' => '{EVAL}',                     'eval' => 'date("D, d M Y G:i:s O", $newsPost["date"])'],
        'dc:publisher'  => ['text' => '{EVAL}',                     'eval' => '$newsPost["udata"]["username"]'],
        'description'   => ['cdata' => '{EVAL}',                    'eval' => '$newsPost["parsed"]'],
    ];

    // Create a new DOM document
    $feed = new DOMDocument('1.0', 'utf-8');

    // Create the RSS element
    $fRss = $feed->createElement('rss');

    // Set attributes
    $fRss->setAttribute('version',      '2.0');
    $fRss->setAttribute('xmlns:atom',   'http://www.w3.org/2005/Atom');
    $fRss->setAttribute('xmlns:dc',     'http://purl.org/dc/elements/1.1');

    // Create the channel element
    $fChannel = $feed->createElement('channel');

    // Build meta elements
    foreach($metaData as $name => $value) {

        // Create the elements
        $mElem      = $feed->createElement($name);
        $mElemText  = $feed->createTextNode($value);

        // Append them
        $mElem      ->appendChild($mElemText);
        $fChannel   ->appendChild($mElem);

        // Unset the working vars
        unset($mElem);
        unset($mElemText);

    }

    // Add all the posts
    foreach($renderData['newsPosts'] as $newsPost) {

        // Create item element
        $fPost = $feed->createElement('item');

        // Create post attributes
        foreach($itemData as $tag => $valueData) {

            // Create the element
            $pElem = $feed->createElement($tag);

            // Create value
            eval('$value = '. $valueData['eval'] .';');
            $value = str_replace('{EVAL}', $value, $valueData[(array_key_exists('cdata', $valueData) ? 'cdata' : 'text')]);

            // Create text node or cdata container
            $pElemText = (array_key_exists('cdata', $valueData)) ? $feed->createCDATASection($value) : $feed->createTextNode($value);

            // Append them
            $pElem  ->appendChild($pElemText);
            $fPost  ->appendChild($pElem);

            // Unset the working vars
            unset($pElem);
            unset($pElemText);
            unset($value);

        }

        // Append the item to the channel
        $fChannel->appendChild($fPost);

    }

    // Append the channel element to RSS
    $fRss->appendChild($fChannel);

    // Append the RSS element to the DOM
    $feed->appendChild($fRss);

    // Return the feed
    print $feed->saveXML();
    exit;

}

// If we're not using the XML feed and we're not viewing a single post create pages
if(!isset($_GET['id'])) {

    // Create the current page
    $renderData['newsPosts']            = array_chunk($renderData['newsPosts'], Configuration::getConfig('news_posts_per_page'), true);
    $renderData['page']['currentPage']  = isset($_GET['page']) && ($_GET['page'] - 1) >= 0 ? $_GET['page'] - 1 : 0;

}

// Print page contents
print Templates::render('main/news.tpl', $renderData);