<?php
/**
*/
date_default_timezone_set(@date_default_timezone_get());

/**
 * @param string $locale
 *
 * @return array
*/
function html_news($locale = 'en', $count = 5)
{
    $news = get_news($locale, $count);
    $html =  '<ul class="news">';
    $item_tmpl = '<li><a href="%2$s">%3$s</a> <span class="dt">%1$s</span></li>';
    foreach ($news as $item)
    {
        $html .= sprintf($item_tmpl,
            news_date($item['date'], $locale),
            $item['link'],
            $item['title']
            );
    }
    $html .= '</ul>';
    return $html;
}

/**
 * @param string $dt date in the form ISO 8601 (2015-02-24T15:42:00+01:00)
 * @param string $locale
 *
 * @return string localised date
*/
function news_date($dt, $locale = 'en')
{
    $eng_months       = array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
    $localised_months = array(_r('Jan'), _r('Feb'), _r('Mar'), _r('Apr'), _r('May'), _r('Jun'), _r('Jul'), _r('Aug'), _r('Sep'), _r('Oct'), _r('Nov'), _r('Dec'));

    $date_format = _r('M d Y');
    if ((strpbrk($date_format, 'dj') == false) // check valid day formats
        || (strpbrk($date_format, 'M') == false) // check valid month formats (all are 'FmMn' but we replace them in 3 letter form)
        || (strpbrk($date_format, 'oYy') == false)) // check valid year formats
    {
        $date_format = 'M d Y'; // fallback for invalid date format localisation
    }
    return str_replace($eng_months, $localised_months, date($date_format, strtotime($dt)));
}

/**
 * @param string $locale
 * @param integer $count
 * @param integer $cache_timeout
 *
 * @return array
*/
function get_news($locale = 'en', $count = 5, $cache_timeout = 1)
{
    return get_feed(blog_link($locale), $count, cache_timeout);

}

/**
*/
function get_feed($url, $count = 5, $cache_timeout = 1)
{
    include_once G_APP_ROOT . '/lib/simplepie/autoloader.php';

    $feed = new SimplePie();

    $feed->set_feed_url($url);
    $feed->set_cache_location(realpath(G_APP_ROOT . '/_nav/var/tmp/cache'));
    $feed->set_cache_duration(3600 * $cache_timeout);
    $feed->set_timeout(10);            // second part of a #mga23215 bugfix
    $feed->force_cache_fallback(true); // this should help if rss files are not retrievable
    $feed->enable_order_by_date(true);
    $feed->init();
    $feed->handle_content_type();
    $items = array();

    foreach ($feed->get_items(0, $count) as $item)
    {
        $items[] = array(
            'source' => $item->get_feed()->get_link(),
            'link'   => $item->get_permalink(),
            'title'  => $item->get_title(),
            'date'   => $item->get_date('c'),
            'desc'   => $item->get_description(),
            'author' => $item->get_author()
        );
    }

    unset($feed);

    return $items;
}

/**
 * 
 * @param string $locale locale this feed is expected to be in
 * @param string $news_title feed title
 * @param string $link feed main site title
 * @param string $feed feed url
 * @param integer $count how many items to return
 * @param string $skip url whose element we want to skip (why?)
 * @param boolean split title that has been built by aggregator
 * @param string $discrete_title more discrete title
 * @param array $data if get_feed() is called outside, it's result is passed
 *
 * @return string
*/
function show_feed($locale, $news_title, $link, $feed, $count = 5, $skip = null, $split = false, $discrete_title = null, $data = null) {

    if (!is_null($skip))
        $count += 5;

    if(is_null($data)) {
        $data = get_feed($feed, $count);
        if(0 == count($data)) {
            $feed = rtrim($feed, '10'); // cut 10 as a fallback (type=rss)
            $data = get_feed($feed, $count);
        }
        if(0 == count($data)) {
            $feed = $feed .'10'; // add 10 as a fallback (type=rss10)
            $data = get_feed($feed, $count);
        }
    }
    if(0 == count($data)) {
        return;
    }

    $s = '';
    $header = '';
    $source = null;
    $date_separator = (is_null($discrete_title) ? null : '| ');

    $s .= '<ul id="newslist">';
    foreach ($data as $d) {
        if (!is_null($skip) && strpos($d['link'], $skip) !== false)
            continue;

        if ($split && strpos($d['title'], ') : ') !== false) {
            $title  = explode(') : ', html_entity_decode($d['title']));
            $source = array_shift($title) . '): ';
            $source = (is_null($date_separator) ? $source : null);
            $title  = implode(' : ', $title);
        } else {
            $title  = $d['title'];
            $source = null;
        }

        $s .= sprintf('<li>%s<a href="%s">%s%s</a> %s<span class="dt">%s</span></li>',
            $discrete_title, $d['link'], $source, $title, $date_separator, news_date($d['date'], $locale));
        $discrete_title = null;
    }
    $s .= '</ul>';

    if (is_null($date_separator)) {
        $header = sprintf('<h2><a href="%s">%s</a></h2>', $link, $news_title);
    }

    $s  = $header . $s;
    echo $s;
}


/**
 * @param string $eng_planet_url = 'https://planet.mageia.org/en/'
 * @param string $eng_blog_url = 'https://blog.mageia.org/en/'
 * @param string $loc_planet_url = _r_('https://planet.mageia.org/en/')
 * @param string $loc_blog_url = _r_('https://blog.mageia.org/en/')
 * @param integer $req_quantity number or requested planet/blog titles
 * @param integer $min_num_of_loc_post minimum number of localised posts to return without adding English ones
 *
 * @return array ($loc_posts_title for show_feed() function, $fresh_loc_posts, $num_fresh_loc_posts, $eng_posts_title for show_feed() function, $fresh_eng_posts, $first_source)
 * 
 * $first_source: 0 = none, 1 = localized planet, 2 = localized blog, 3 = English planet, 4 = English blog
*/
function prepare_fresh_blog_post_titles($eng_planet_url, $eng_blog_url, $loc_planet_url, $loc_blog_url, $req_quantity = 9, $min_num_of_loc_post = 4)
{
    $max_posts_age_days = 90;
    $posts_age_limit = time()-($max_posts_age_days * 24*60*60);
    $fresh_loc_posts = array();
    $fresh_eng_posts = array();
    $loc_posts_title = '';
    $eng_posts_title = '';
    $first_source    = 0;

    // prepare fresh enough localised planet posts if they exist
    if ($eng_planet_url != $loc_planet_url) {
        $loc_planet_posts = get_feed($loc_planet_url . '?type=rss10', $req_quantity);
        if (count($loc_planet_posts) > 0) {
            $loc_posts_title = _r('Planet');
            $first_source = 1;
            foreach ($loc_planet_posts as $planet_post) {
                if ($posts_age_limit < strtotime($planet_post["date"])) {
                    $planet_post["desc"] = ''; // not needed (conserving memory)
                    $fresh_loc_posts[] = $planet_post;
                }
            }
        }
    }

    // prepare fresh enough localised blog posts if there's no localised planet
    if(0 == count($fresh_loc_posts) && $eng_blog_url != $loc_blog_url) {
        $loc_blog_posts = get_feed($loc_blog_url . '?type=rss10', $req_quantity);
        if (count($loc_blog_posts) > 0) {
            $loc_posts_title = _r('Blog');
            $first_source = 2;
            foreach ($loc_blog_posts as $blog_post) {
                if ($posts_age_limit < strtotime($blog_post["date"])) {
                    $blog_post["desc"] = ''; // not needed
                    $fresh_loc_posts[] = $blog_post;
                }
            }
        }
    }

    // prepare fresh enough English planet posts if there's only a few or no localised posts
    $num_fresh_loc_posts = count($fresh_loc_posts);
    if ($min_num_of_loc_post > $num_fresh_loc_posts) {
        if (0 < $num_fresh_loc_posts) {
            $req_quantity = $req_quantity - $num_fresh_loc_posts - 1;
        }
        $eng_planet_posts = get_feed($eng_planet_url . '?type=rss10', $req_quantity);
        if (count($eng_planet_posts) > 0) {
            $eng_posts_title = _r('Planet');
            $first_source = 3;
            foreach ($eng_planet_posts as $planet_post) {
                if ($posts_age_limit < strtotime($planet_post["date"])) {
                    $planet_post["desc"] = ''; // not needed
                    $fresh_eng_posts[] = $planet_post;
                }
            }
        }
        // prepare fresh enough English blog posts if there's no English planet posts
        if (0 == count($fresh_eng_posts)) {
            $eng_blog_posts = get_feed($eng_blog_url . '?type=rss10', $req_quantity);
            if (count($eng_blog_posts) >= 1) {
                $eng_posts_title = _r('Blog');
                $first_source = 4;
                foreach ($eng_blog_posts as $blog_post) {
                    if ($posts_age_limit < strtotime($blog_post["date"])) {
                        $blog_post["desc"] = ''; // not needed
                        $fresh_eng_posts[] = $blog_post;
                    }
                }
            }
        }
    }

    return array($loc_posts_title, $fresh_loc_posts, $num_fresh_loc_posts, $eng_posts_title, $fresh_eng_posts, $first_source);
}

/**
*/
function blog_link($locale)
{
    $news = array(
        'en' => 'https://blog.mageia.org/en/',
        'de' => 'https://blog.mageia.org/de/',
        'el' => 'https://blog.mageia.org/el/',
        'es' => 'https://blog.mageia.org/es/',
        'fr' => 'https://blog.mageia.org/fr/',
        'de' => 'https://blog.mageia.org/de/',
        'it' => 'https://blog.mageia.org/it/',
        'nl' => 'https://blog.mageia.org/nl/',
        'pl' => 'https://blog.mageia.org/pl/',
        'pt' => 'https://blog.mageia.org/pt/',
        'pt-br'=>'https://blog.mageia.org/pt/',
        'ro' => 'https://blog.mageia.org/ro/',
        'ru' => 'https://blog.mageia.org/ru/',
        'sv' => 'https://blog.mageia.org/sv/',
        'tr' => 'https://blog.mageia.org/tr/',
        'uk' => 'https://blog.mageia.org/uk/',
        /* missing: et, fi, lv, nb, sl, zh-cn, zh-tw */
    );

    if (!array_key_exists($locale, $news))
        $locale = 'en';

    $source_url = $news[$locale];

    return $source_url;
}

function planet_link($locale)
{
    $planets = array(
    'en',
    'de',
    'es',
    'fr',
    'it',
    'pl',
    'pt',
    'pt-br');
    $locale = in_array($locale, $planets) ? $locale : 'en';

    return sprintf('https://planet.mageia.org/%s/', $locale);
}