<?php

namespace Blazemedia\Affiliation\Rendering\LinkParser\Patterns;

use Blazemedia\Affiliation\Utils\HttpRequest;

/**
 * Un pattern è il testo del link che deve essere
 * sostituito, specifico per ogni marketplace
 * da esso estraiamo la url del link da costruire
 * oltre che il marketplace
 */
class Impact extends Pattern {

    /// il pattern da riconoscere nel testo da ridefinire
    protected $pattern = '';

    /// il nome del marketplace di cui parsare i link
    public $name = 'Impact';

    /** 
     * Il Parser di Impact non recupera l'url attraverso un pattern
     * ma controlla se le url, fanno parte della lista fornita dall'API di "Impact"
     */
    protected function Match() {     
        $impactDomains = $this->getCachedDomains();

        $links = [];

        foreach ($impactDomains as $domain) {
            $domain = str_replace(['.', '/' ],['\.','\/'], $domain);
            $pattern = '/<a[^>]*href="(https?:\/\/(?:[\w.-]+)?' . $domain . '[^"]*?)".*?>/';
            preg_match_all($pattern, $this->content, $matches);

            if(count($matches) && count($matches[0]) && count($matches[1])){
                [$tags,$ulrs] = $matches;

                $links = [ ...$links, ...$this->getLinks($tags, $ulrs)];

            }
        }
        return $links;
    }

    /**
     * Ottiene i domini dall'API e li memorizza in un transient per 1 ora.
     *
     * @return array Impact Domains
     */
    protected function getCachedDomains() {

        $transientKey = 'impact_api_domain';

        $cachedData = get_transient($transientKey);

        if (false === $cachedData) {
            $apiData = $this->fetchDataFromApi();

            set_transient($transientKey, $apiData, 3600);

            $cachedData = $apiData;
        }

        return $cachedData;
    }

    /**
     * @return array
     */
    private function fetchDataFromApi() {
        $apicall = BLZ_API_RENDERING_MANAGER . 'programby/impact_domains/';
        return json_decode(HttpRequest::getContent($apicall));
    }
}
