<?php
#require_once(BASE_PATH . 'classes/Nibble-Forms/Nibble/NibbleForms/NibbleForm.php');
require(BASE_PATH . 'libraries/password_compat/lib/password.php');
require(BASE_PATH . 'libraries/FeedWriter/FeedTypes.php');

class views {
    public static function home($params) {
        global $tpl;
        
        /* #FIXME
        $tpl->assign('announcement', array(
            'id'           => 1234,
            'date'         => time(),
            'title'        => 'Foo Bar',
            'abstract'     => 'baz',
            'content'      => 'It\'s the text!',
            'is_important' => false
        ));
        */
        $tpl->display('home.html');
    }
    
    public static function create($params) {
        global $tpl;
        
        $formdata = array(
            'name'               => array('value'   => $_REQUEST['slug']),
            'uri'                => array('value'   => $_REQUEST['uri']),
            'refresh_on_request' => array('checked' => $_REQUEST['refresh'] == 'interval' ? false : true),
            'interval'           => array('value'   => $_REQUEST['interval']),
            'expire'             => array('checked' => isset($_REQUEST['expire']) ? true : false,
                                          'value'   => $_REQUEST['expire_value'],
                                          'unit'    => $_REQUEST['expire_unit']),
            'description'        => array('value'   => $_REQUEST['description']),
        );
        
        // Check name (slug)
        if (isset($_REQUEST['slug'])
            and preg_match('#^[a-zA-Z0-9_\.+-]+$#', $_REQUEST['slug'])
        ) {
            // Check URI
            if (isset($_REQUEST['uri'])
                and preg_match('#^https?://[a-zA-Z0-9_\.-]+\.[a-zA-Z0-9]{2,}(/.*)?$#', $_REQUEST['uri'])
            ) {
                // Check refresh
                if ($_REQUEST['refresh'] == 'request'
                    or ($_REQUEST['refresh'] == 'interval'
                        and $_REQUEST['interval'] >= 900
                )) {
                    // Check expire
                    if ($_REQUEST['expire'] == false
                        or ($_REQUEST['expire'] == true
                            and intval($_REQUEST['expire_value']) > 0
                            and in_array($_REQUEST['expire_unit'], ['h', 'd', 'w', 'm'])
                    )) {
                        // Check description
                        if (strlen($_REQUEST['description']) < 1000) {
                            // Calculate expiration date, if needed
                            if ($_REQUEST['expire'] == true) {
                                $expireDate = new DateTime();
                                switch ($_REQUEST['expire_unit']) {
                                    case 'h':
                                        #$expireDate = strtotime('+' . $_REQUEST['expire_value'] . ' hours');
                                        $expireString = $expireDate->add(new DateInterval("PT$_REQUEST[expire_value]H"))->format('Y-m-d H:i:s');
                                        break;
                                    case 'd':
                                        #$expireDate = strtotime('+' . $_REQUEST['expire_value'] . ' days');
                                        $expireString = $expireDate->add(new DateInterval("P$_REQUEST[expire_value]D"))->format('Y-m-d H:i:s');
                                        break;
                                    case 'w':
                                        #$expireDate = strtotime('+' . $_REQUEST['expire_value'] . ' weeks');
                                        $expireString = $expireDate->add(new DateInterval("P$_REQUEST[expire_value]W"))->format('Y-m-d H:i:s');
                                        break;
                                    case 'm':
                                        #$expireDate = strtotime('+' . $_REQUEST['expire_value'] . ' months');
                                        $expireString = $expireDate->add(new DateInterval("P$_REQUEST[expire_value]M"))->format('Y-m-d H:i:s');
                                        break;
                                }
                            } else $expireString = null;
                            
                            if (feeds::create($_REQUEST['slug'],
                                              $_REQUEST['uri'],
                                              $_REQUEST['refresh'] == 'interval' ? 'true' : 'false',
                                              $_REQUEST['interval'],
                                              'now',
                                              isset($_REQUEST['expire']) ? 'true' : 'false',
                                              $expireString,
                                              $_REQUEST['password'],
                                              $_SERVER['REMOTE_ADDR'],
                                              'now'
                            )) {
                                $tpl->assign('title', 'Feedized!');
                                $tpl->assign('feed', $_REQUEST);
                                $tpl->assign('interval_hms', sec2hms($_REQUEST['interval']));
                                if ($_REQUEST['expire'])
                                    $tpl->assign('expire_hms', sec2hms($_REQUEST['expire_value']));
                                $tpl->display('created.html');
                                exit();
                            }
                        } else { // erroneous description?
                            $formdata['description']['has_error'] = true;
                            $formdata['description']['error_message'] = 'You description is too long.';
                        }
                    } else { // erroneous expire?
                        $formdata['expire']['has_error'] = true;
                        $formdata['expire']['error_message'] = 'Please enter a valid timespan.';
                    }
                } else { // erroneous interval?
                    $formdata['interval']['has_error'] = true;
                    $formdata['interval']['error_message'] = 'The request interval must be at least 15 minutes (900 seconds). Why did you even try?';
                }
            } else { // erroneous uri?
                $formdata['uri']['has_error'] = true;
                $formdata['uri']['error_message'] = 'Please enter a valid URI, like "http://duckduckgo.com/"';
            }
        } else { // erroneous name?
            $formdata['name']['has_error'] = true;
            $formdata['name']['error_message'] = 'Please enter a valid name for your feed. Allowed characters are: a-z A-Z 0-9 _ . -';
        }
        $tpl->assign('form', $formdata);
        views::home($params);
    }
    
    public static function feed($params) {
        $feedData = feeds::getBySlug($params['slug']);
        if (!$feedData)
            return [404, 'feed'];
        $itemData = feedItems::getAll($feedData['id']);
        
        $feed = new ATOMFeedWriter();
        $feed->setTitle($feedData['slug']);
        $feed->setLink('https://feedizer.tigris.fanir.de/feed/' . $feedData['slug']);
        $feed->setChannelElement('updated', (new DateTime($itemData[0]['timestamp']))->format(DATE_ATOM));
        
        foreach ($itemData as $item) {
            $feedItem = $feed->createNewItem();
            
            $feedItem->setTitle($feedData['slug']);
            $feedItem->setLink($feedData['uri']);
            $feedItem->setDate($item['timestamp']);
            switch ($params['contentType']) {
                case 'page':
                    $feedItem->setDescription($item['html']);
                    break;
                case 'diff':
                    $feedItem->setDescription(nl2br(htmlspecialchars($item['diff'], ENT_XML1 | ENT_SUBSTITUTE | ENT_COMPAT)));
                    break;
                default: return [404];
            }
            $feed->addItem($feedItem);
        }
        
        $feed->generateFeed();
        
        return 0;
    }
    
    public static function feedInfo($params) {
        global $tpl, $md;
        
        $feed = feeds::getBySlug($params['slug']);
        
        if (!$feed)
            return [404, 'feed'];
        
        #$feed['description'] = $md->transform(htmlspecialchars($feed['description']));
        
        $tpl->assign('feed', $feed);
        $tpl->assign('interval_hms', sec2hms($feed['refresh_interval']));
        
        $tpl->display('feedInfo.html');
    }
    
    public static function flatpage($params) {
        $file = $params['slug'] . '.html';
        
        if (in_array($file, scandir(BASE_PATH . 'templates/flatpages'))) {
            global $tpl;
            $tpl->display('flatpages/' . $file);
        } else {
            return [404];
        }
    }
    
    public static function announcement($params) {
        $ann = announcements::getById($params['id']);
        
        if ($ann != false) {
            global $tpl;
            $tpl->assign('announcement', $ann);
            $tpl->display('announcement.html');
        } else {
            return [404, 'announcement'];
        }
    }
}