<?php

namespace Blazemedia\Affiliation\Rendering\LinkParser\Patterns;

use Blazemedia\Affiliation\Rendering\LinkParser\Link;


/**
 * Un pattern è il una espressione regolare che generalizza 
 * 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
 */
abstract class Pattern {

    /// array di oggetti di tipo Link 
    /// - link da sostituire
    /// - marketplace
    /// - altri dati 
    public array $links;

    /// il nome del marketplace di cui parsare i link
    public $name = '';
    
    /// il pattern da riconoscere nel testo da specializzare nelle classi derivate
    protected $pattern = '';
    
    protected string $content;
    
    /// prende in ingresso un pattern
    public function __construct( string $content ) {

        $this->content = $content;
        
        $this->links = $this->Match();
    }
    
    /**
     * Rileva tutte le occorrenze le pattern, 
     * che viene specializzato nella property 'pattern' per ogni tipologia di link
     *
     * @return array - array vuoto se non trova nessun link corrispondente 
     *                 al markerplace, altrimenti ritorna un'array 
     *                 di oggetti di tipo Link { tag, url, marketplace };
     * 
     */
    protected function Match() {

        preg_match_all( $this->pattern, $this->content, $matches );

        [ $tags, $ulrs ] = $matches;

        return $this->getLinks( $tags, $ulrs );
    
    }


    protected function getLinks( array $tags, array $urls ) {

        $stored_tags = [];

        return array_reduce( array_keys( $tags ), function( $links, $key ) use ( $tags, $urls, &$stored_tags ) {

            if( in_array( $tags[ $key ], $stored_tags ) ) return $links;

            $stored_tags[] = $tags[ $key ];

            return [ ...$links, new Link ( $tags[ $key ], $urls[ $key ], $this->name) ];

        }, []);
    }

}
