<?php

declare(strict_types=1);

/**
 * Retourne les dons d'une recherche filtrée sur le site Donnons.org
 * Example: https://donnons.org/Sport/Ile-de-France
 */
class DonnonsBridge extends BridgeAbstract
{
    const MAINTAINER = 'Binnette';
    const NAME = 'Donnons.org';
    const URI = 'https://donnons.org';
    const CACHE_TIMEOUT = 1800; // 30min
    const DESCRIPTION = 'Retourne les dons depuis le site Donnons.org.';

    const PARAMETERS = [
        [
            'q' => [
                'name' => 'Url de recherche',
                'required' => true,
                'exampleValue' => '/Sport/Ile-de-France',
                'pattern' => '\/.*',
                'title' => 'Faites une recherche sur le site. Puis copiez ici la fin de l’url. Doit commencer par /',
            ],
            'p' => [
                'name' => 'Nombre de pages à scanner',
                'type' => 'number',
                'required' => true,
                'defaultValue' => 5,
                'title' => 'Indique le nombre de pages de donnons.org qui seront scannées'
            ]
        ]
    ];

    public function collectData()
    {
        $pages = $this->getInput('p');

        for ($i = 1; $i <= $pages; $i++) {
            $this->collectDataByPage($i);
        }
    }

    private function collectDataByPage($page)
    {
        $uri = $this->getPageURI($page);

        $dom = getSimpleHTMLDOM($uri);

        $searchDiv = $dom->find('div[id=search]', 0);

        if (! $searchDiv) {
            return;
        }

        $elements = $searchDiv->find('a.lst-annonce');
        foreach ($elements as $element) {
            $item = [];

            // Lien vers le don
            $item['uri'] = self::URI . $element->href;
            // Id de l'objet
            $item['uid'] = $element->getAttribute('data-id');

            // Grab info from json
            $jsonString = $element->find('script', 0)->innertext;
            $json = json_decode($jsonString, true);

            $name = $json['name'];
            $category = $json['category'];
            $date = $json['availabilityStarts'];
            $description = $json['description'];
            $city = $json['availableAtOrFrom']['address']['addressLocality'];
            $region = $json['availableAtOrFrom']['address']['addressRegion'];

            // Grab info from HTML
            $imageSrc = $element->find('img.ima-center', 0)->getAttribute('src');
            // Use large image instead of small one
            $imageSrc = str_replace('/xs/', '/lg/', $imageSrc);
            $image = self::URI . $imageSrc;
            $author = $element->find('div.avatar-holder', 0)->plaintext;

            $content = '
                <img style="margin-right:1em;" src="' . $image . '">
                <div>
                    <h1>' . $name . '</h1>
                    <p>' . $description . '</p>
                    <p>Lieu : <b>' . $city . '</b> - ' . $region . '</p>
                    <p>Par : ' . $author . '</p>
                    <p>Date : ' . $date . '</p>
                </div>
            ';

            // Titre du don
            $item['title'] = '[' . $category . '] ' . $name;
            $item['timestamp'] = $date;
            $item['author'] = $author;
            $item['content'] = $content;
            $item['enclosures'] = [$image];

            $this->items[] = $item;
        }
    }

    private function getPageURI($page)
    {
        $uri = $this->getURI();
        $haveQueryParams = strpos($uri, '?') !== false;

        if ($haveQueryParams) {
            return $uri . '&page=' . $page;
        } else {
            return $uri . '?page=' . $page;
        }
    }

    public function getURI()
    {
        if (!is_null($this->getInput('q'))) {
            return self::URI . $this->getInput('q');
        }

        return parent::getURI();
    }

    public function getName()
    {
        if (!is_null($this->getInput('q'))) {
            return 'Donnons.org - ' . $this->getInput('q');
        }

        return parent::getName();
    }
}