<?php

class AutoJMBridge extends BridgeAbstract
{
    const NAME = 'AutoJM';
    const URI = 'https://www.autojm.fr/';
    const DESCRIPTION = 'Suivre les offres de véhicules proposés par AutoJM en fonction des critères de filtrages';
    const MAINTAINER = 'sysadminstory';
    const PARAMETERS = [
        'Afficher les offres de véhicules disponible sur la recheche AutoJM' => [
            'url' => [
                'name' => 'URL de la page de recherche',
                'type' => 'text',
                'required' => true,
                'title' => 'URL d\'une recherche avec filtre de véhicules sans le http://www.autojm.fr/',
                'exampleValue' => 'recherche?brands[]=PEUGEOT&ranges[]=PEUGEOT 308'
            ],
        ]
    ];

    const CACHE_TIMEOUT = 3600;

    const TEST_DETECT_PARAMETERS = [
        'https://www.autojm.fr/recherche?brands%5B%5D=PEUGEOT&ranges%5B%5D=PEUGEOT%20308'
            => ['url' => 'recherche?brands%5B%5D=PEUGEOT&ranges%5B%5D=PEUGEOT%20308',
                'context' => 'Afficher les offres de véhicules disponible sur la recheche AutoJM'
            ]
    ];

    public function getIcon()
    {
        return self::URI . 'favicon.ico';
    }

    public function getName()
    {
        switch ($this->queriedContext) {
            case 'Afficher les offres de véhicules disponible sur la recheche AutoJM':
                return 'AutoJM | Recherche de véhicules';
            break;
            default:
                return parent::getName();
        }
    }

    public function getURI()
    {
        switch ($this->queriedContext) {
            case 'Afficher les offres de véhicules disponible sur la recheche AutoJM':
                return self::URI . $this->getInput('url');
            break;
            default:
                return self::URI;
        }
    }

    public function collectData()
    {
        // Get the number of result for this search
        $search_url = self::URI . $this->getInput('url') . '&open=energy&onlyFilters=false';

        // Set the header 'X-Requested-With' like the website does it
        $header = [
            'X-Requested-With: XMLHttpRequest'
        ];

        // Get the JSON content of the form
        $json = getContents($search_url, $header);

        // Extract the HTML content from the JSON result
        $data = json_decode($json);

        $nb_results = $data->nbResults;
        $total_pages = ceil($nb_results / 14);

        // Limit the number of page to analyse to 10
        for ($page = 1; $page <= $total_pages && $page <= 10; $page++) {
            // Get the result the next page
            $html = $this->getResults($page);

            // Go through every car of the search
            $list = $html->find('div[class*=card-car card-car--listing]');
            foreach ($list as $car) {
                // Get the info about the car offer
                $image = $car->find('div[class=card-car__header__img]', 0)->find('img', 0)->src;
                // Decode HTML attribute JSON data
                $car_data = json_decode(html_entity_decode($car->{'data-layer'}));
                $car_model = $car_data->title;
                $availability = $car->find('div[class*=card-car__modalites]', 0)->find('div[class=col]', 0)->plaintext;
                $warranty = $car->find('div[data-type=WarrantyCard]', 0)->plaintext;
                $discount_html = $car->find('div[class=subtext vehicle_reference_element]', 0);
                // Check if there is any discount info displayed
                if ($discount_html != null) {
                    $reference_price_value = $discount_html->find('span[data-cfg=vehicle__reference_price]', 0)->plaintext;
                    $discount_percent_value = $discount_html->find('span[data-cfg=vehicle__discount_percent]', 0)->plaintext;
                    $reference_price = '<li>Prix de référence : <s>' . $reference_price_value . '</s></li>';
                    $discount_percent = '<li>Réduction : ' . $discount_percent_value . ' %</li>';
                } else {
                    $reference_price = '';
                    $discount_percent = '';
                }
                $price = $car_data->price;
                $kilometer = $car->find('span[data-cfg=vehicle__kilometer]', 0)->plaintext;
                $energy = $car->find('span[data-cfg=vehicle__energy__label]', 0)->plaintext;
                $power = $car->find('span[data-cfg=vehicle__tax_horse_power]', 0)->plaintext;
                $seats = $car->find('span[data-cfg=vehicle__seats]', 0)->plaintext;
                $doors = $car->find('span[data-cfg=vehicle__door__label]', 0)->plaintext;
                $transmission = $car->find('span[data-cfg=vehicle__transmission]', 0)->plaintext;
                $loa_html = $car->find('span[data-cfg=vehicle__loa]', 0);
                // Check if any LOA price is displayed
                if ($loa_html != null) {
                    $loa_value = $car->find('span[data-cfg=vehicle__loa]', 0)->plaintext;
                    $loa = '<li>LOA : à partir de ' . $loa_value . ' / mois </li>';
                } else {
                    $loa = '';
                }

                // Construct the new item
                $item = [];
                $item['title'] = $car_model;
                $item['content'] = '<p><img style="vertical-align:middle ; padding: 10px" src="' . $image . '" />'
                    . $car_model . '</p>';
                $item['content'] .= '<ul><li>Disponibilité : ' . $availability . '</li>';
                $item['content'] .= '<li>Prix : ' . $price . ' €</li>';
                $item['content'] .= $reference_price;
                $item['content'] .= $loa;
                $item['content'] .= $discount_percent;
                $item['content'] .= '<li>Garantie : ' . $warranty . '</li>';
                $item['content'] .= '<li>Kilométrage : ' . $kilometer . ' km</li>';
                $item['content'] .= '<li>Energie : ' . $energy . '</li>';
                $item['content'] .= '<li>Puissance: ' . $power . ' CV Fiscaux</li>';
                $item['content'] .= '<li>Nombre de Places : ' . $seats . ' place(s)</li>';
                $item['content'] .= '<li>Nombre de portes : ' . $doors . '</li>';
                $item['content'] .= '<li>Boite de vitesse : ' . $transmission . '</li></ul>';
                $item['uri'] = $car_data->{'uri'};
                $item['uid'] = hash('md5', $item['content']);
                $this->items[] = $item;
            }
        }
    }

    private function getResults(int $page)
    {
        $user_input = $this->getInput('url');
        $search_data = preg_replace('#(recherche|recherche/[0-9]{1,10})\?#', 'recherche/' . $page . '?', $user_input);

        $search_url = self::URI . $search_data . '&open=energy&onlyFilters=false';

        // Get the HTML content of the page
        $html = getSimpleHTMLDOMCached($search_url);

        return $html;
    }

    public function detectParameters($url)
    {
        $params = [];
        $regex = '/^(https?:\/\/)?(www\.|)autojm.fr\/(recherche\?.*|recherche\/[0-9]{1,10}\?.*)$/m';
        if (preg_match($regex, $url, $matches) > 0) {
            $url = preg_replace('#(recherche|recherche/[0-9]{1,10})#', 'recherche', $matches[3]);

            $params['url'] = $url;
            $params['context'] = 'Afficher les offres de véhicules disponible sur la recheche AutoJM';

            return $params;
        }
    }
}