<?php

namespace model;

use DAL\ArticleGateway;
use DAL\Connection;
use DAL\FluxGateway;
use DOMDocument;
use Exception;
use metier\Article;
use metier\Flux;

class Parser
{
    private FluxGateway $fluxGateway;
    private ArticleGateway $articleGateway;

    public function __construct(FluxGateway $fluxGateway, ArticleGateway $articleGateway){
        $this->fluxGateway = $fluxGateway;
        $this->articleGateway = $articleGateway;
    }
    public function parseArticles(Flux $flux): array
    {
        $dom = new DOMDocument();
        $tabArticle = array();
        if ($dom->load($flux->getFlux())){
            $items = $dom->getElementsByTagName('item');
            foreach ($items as $item) {
                $title = $item->getElementsByTagName('title')[0]->nodeValue;
                $date = $item->getElementsByTagName('pubDate')[0]->nodeValue;
                $guid = $item->getElementsByTagName('guid')[0]->nodeValue;
                $link = $item->getElementsByTagName('link')[0]->nodeValue;
                $description = $item->getElementsByTagName('description')[0]->nodeValue;
                $media = $item->getElementsByTagName('media:content');
                $mediaUrl = null;
                if ($media->length > 0){
                    $mediaUrl = $media->item(0)->getAttribute('url');
                }

                $tabArticle[] = new Article(
                    (int)null,
                    $title,
                    $date,
                    $description,
                    $guid,
                    $link,
                    ($mediaUrl !== null) ? (string)$mediaUrl : '',
                    $flux->getId());
            }
            return $tabArticle;
        } else {
            // En cas d'erreur lors du chargement du flux RSS, lever une exception
            throw new Exception("Erreur lors du chargement du flux RSS");
        }
    }


    /**
     * @throws Exception
     */
    public function parseAll($fluxes){
        $tabArticles = [];
        foreach ($fluxes as $flux){
            $fluxx = new Flux($flux[0],$flux[1]);
            $tabArticles[] = $this->parseArticles($fluxx);

        }
        return $tabArticles;
    }

    /**
     * @throws Exception
     */
    public function addAllArticles()
    {
        $tabFluxes = [];
        $this->articleGateway->removeAllArticleForParser();

        $allItemFlux = $this->fluxGateway->findAllFlux();
        foreach ($allItemFlux as $ItemFlux){
            $tabFluxes[] = $ItemFlux[1];
        }
        $allTabArticles = $this->parseAll($allItemFlux);

        foreach ($allTabArticles as $tabArticle) {
            foreach ($tabArticle as $item) {
                $this->articleGateway->addArticle($item);
            }

        }
    }

}






