<?php

class HeiseBridge extends FeedExpander
{
    const MAINTAINER = 'Dreckiger-Dan';
    const NAME = 'Heise Online Bridge';
    const URI = 'https://heise.de/';
    const CACHE_TIMEOUT = 1800; // 30min
    const DESCRIPTION = 'Returns the full articles instead of only the intro';
    const PARAMETERS = [[
        'category' => [
            'name' => 'Category',
            'type' => 'list',
            'values' => [
                // source: https://www.heise.de/news-extern/news.html
                'heise online News'
                => 'https://www.heise.de/rss/heise-atom.xml',
                'heise online IT'
                => 'https://www.heise.de/rss/heise-Rubrik-IT-atom.xml',
                'heise online Wissen'
                => 'https://www.heise.de/rss/heise-Rubrik-Wissen-atom.xml',
                'heise online Mobiles'
                => 'https://www.heise.de/rss/heise-Rubrik-Mobiles-atom.xml',
                'heise online Entertainment'
                => 'https://www.heise.de/rss/heise-Rubrik-Entertainment-atom.xml',
                'heise online Netzpolitik'
                => 'https://www.heise.de/rss/heise-Rubrik-Netzpolitik-atom.xml',
                'heise online Wirtschaft'
                => 'https://www.heise.de/rss/heise-Rubrik-Wirtschaft-atom.xml',
                'heise online Journal'
                => 'https://www.heise.de/rss/heise-Rubrik-Journal-atom.xml',
                'heise online Top-News'
                => 'https://www.heise.de/rss/heise-top-atom.xml',
                //'iMonitor – Internet-Störungen'
                //=> 'https://www.heise.de/netze/netzwerk-tools/imonitor-internet-stoerungen/feed/aktuelle-meldungen/',
                //'heise tipps+tricks 🦄💻📱'
                //=> 'https://www.heise.de/rss/tipps-und-tricks-atom.xml',
                'Alle Inhalte von heise+'
                => 'https://www.heise.de/rss/heiseplus-atom.xml',
                'heise Autos News'
                => 'https://www.heise.de/autos/rss/news-atom.xml',
                'heise Developer - Neueste Meldungen'
                => 'https://www.heise.de/developer/rss/news-atom.xml',
                'Der Dotnet-Doktor'
                => 'https://www.heise.de/developer/rss/dotnet-doktor-blog-atom.xml',
                'the next big thing'
                => 'https://www.heise.de/developer/rss/next-big-thing-blog-atom.xml',
                'Tales from the Web side'
                => 'https://www.heise.de/developer/rss/tales-from-the-web-side-blog-atom.xml',
                'Continuous Architecture'
                => 'https://www.heise.de/developer/rss/continuous-architecture-blog-atom.xml',
                'Der Pragmatische Architekt'
                => 'https://www.heise.de/developer/rss/der-pragmatische-architekt-blog-atom.xml',
                'Modernes C++'
                => 'https://www.heise.de/developer/rss/modernes-cplusplus-blog-atom.xml',
                'colspan'
                => 'https://www.heise.de/developer/rss/colspan-dev-blog-atom.xml',
                '"Ich roll\' dann mal aus"'
                => 'https://www.heise.de/developer/rss/ich-roll-dann-mal-aus-atom.xml',
                'Well Organized'
                => 'https://www.heise.de/developer/rss/well-organized-blog-atom.xml',
                'Neuigkeiten von der Insel'
                => 'https://www.heise.de/developer/rss/neuigkeiten-von-der-insel-blog-atom.xml',
                'Von Menschen und Maschinen'
                => 'https://www.heise.de/developer/rss/von-menschen-und-maschinen-blog-atom.xml',
                'heise Foto'
                => 'https://www.heise.de/foto/rss/news-atom.xml',
                //'Top-Programme bei heise Download'
                //=> 'https://www.heise.de/download/feed/top',
                'heise Security'
                => 'https://www.heise.de/security/rss/news-atom.xml',
                'Security-Alert Meldungen'
                => 'https://www.heise.de/security/rss/alert-news-atom.xml',
                'c\'t-Blog'
                => 'https://www.heise.de/ct/blog/blog-atom.xml',
                'c\'t-Blog Labs'
                => 'https://www.heise.de/ct/blog/blog-ctlabs-atom.xml',
                'c\'t-Blog Fair & Green IT'
                => 'https://www.heise.de/ct/blog/blog-fgit-atom.xml',
                'c\'t-Blog RTFM'
                => 'https://www.heise.de/ct/blog/blog-rtfm-atom.xml',
                'c\'t-Themen'
                => 'https://www.heise.de/ct/rss/artikel-atom.xml',
                'Make - Neueste Meldungen'
                => 'https://www.heise.de/make/rss/hardware-hacks-atom.xml',
                'iX News'
                => 'https://www.heise.de/ix/rss/news-atom.xml',
                'Mac & i'
                => 'https://www.heise.de/mac-and-i/news-atom.xml',
                'MIT Technology Review'
                => 'https://www.heise.de/tr/rss/news-atom.xml',
                'MIT Technology Review Blog'
                => 'https://www.heise.de/tr/rss/blog-atom.xml',
                //'Telepolis'
                //=> 'https://www.heise.de/tp/news-atom.xml',
                //'Aktuelle News von TechStage'
                //=> 'https://www.techstage.de/rss.xml',
            ]
        ],
        'limit' => [
            'name' => 'Limit',
            'type' => 'number',
            'required' => false,
            'title' => 'Specify number of full articles to return',
            'defaultValue' => 5
        ],
        'sessioncookie' => [
            'name' => 'Session Cookie',
            'required' => false,
            'title' => <<<'TITLE'
                If you have a heise+ subscription,
                you can enter your cookie (ssohls) here to
                have heise+ articles displayed in full.
                By default the cookie is 1 year valid.
                TITLE,
        ]
    ]];
    const LIMIT = 5;

    public function collectData()
    {
        $this->collectExpandableDatas(
            $this->getInput('category'),
            $this->getInput('limit') ?: static::LIMIT
        );
    }

    protected function parseItem(array $item)
    {
        $sessioncookie = $this->getInput('sessioncookie');

        // strip rss parameter
        $item['uri'] = explode('?', $item['uri'])[0];

        // ignore TechStage articles
        if (strpos($item['uri'], 'https://www.heise.de') !== 0) {
            return $item;
        }
        // abort on heise+ articles
        if ($sessioncookie == '' && str_starts_with($item['title'], 'heise+ |')) {
            return $item;
        }

        $item['uri'] .= '?seite=all';
        $article = getSimpleHTMLDOM($item['uri'], [
            'cookie: ssohls=' . $sessioncookie
        ]);

        if ($article) {
            $article = defaultLinkTo($article, $item['uri']);
            $item = $this->addArticleToItem($item, $article);
        }

        return $item;
    }

    private function addArticleToItem($item, $article)
    {
        // relink URIs, as the previous a-img tags weren't recognized by this function
        $article = defaultLinkTo($article, $item['uri']);

        // remove unwanted stuff
        foreach ($article->find('figure.branding, a-ad, div.ho-text, a-img, .a-toc__list, a-collapse, .opt-in__description, .opt-in__footnote') as $element) {
            $element->remove();
        }
        // reload html, as remove() is buggy
        $article = str_get_html($article->outertext);

        $header = $article->find('header.a-article-header', 0);
        if ($header) {
            $headerElements = $header->find('p, figure img, noscript img');
            $item['content'] = implode('', $headerElements);

            $authors = $header->find('.creator__names .creator__name');
            if ($authors) {
                $item['author'] = implode(', ', array_map(function ($e) {
                    return $e->plaintext;
                }, $authors));
            }
        }

        //fix for embbedded youtube-videos
        $oldlink = '';
        foreach ($article->find('div.video__yt-container') as &$ytvideo) {
            if (preg_match('/www.youtube.*?\"/', $ytvideo->innertext, $link) && $link[0] != $oldlink) {
                //save link to prevent duplicates
                $oldlink = $link[0];
                $ytiframe = <<<EOT
                    <iframe width="560" height="315" src="https://$link[0] title="YouTube video player" frameborder="0"
                    allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
                    referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
                EOT;
                //check if video is in header or article for correct possitioning
                if (strpos($header->innertext, $link[0])) {
                    $item['content'] .= $ytiframe;
                } else {
                    $ytvideo->innertext .= $ytiframe;
                    $reloadneeded = 1;
                }
            }
        }
        if (isset($reloadneeded)) {
            $article = str_get_html($article->outertext);
        }

        $categories = $article->find('.article-footer__topics ul.topics li.topics__item a-topic a');
        foreach ($categories as $category) {
            $item['categories'][] = trim($category->plaintext);
        }

        $content = $article->find('.article-content', 0);
        if ($content) {
            $contentElements = $content->find(
                'p, h3, ul, table, pre, noscript img, a-bilderstrecke h2, a-bilderstrecke figure, a-bilderstrecke figcaption'
            );
            $item['content'] .= implode('', $contentElements);
        }

        return $item;
    }
}