<?php

namespace Blazemedia\Affiliation\API;

use Blazemedia\Affiliation\Utils\HttpRequest;


class CachedApi {

    private static $instance = null;
    
    /**
     * Singleton constructor
     */
    protected function __construct() {}


    /**
     * Undocumented function
     *
     * @param string $url    -- Url della chiamata Api
     * @param integer $hours -- tempo di vita del transient in ore
     * @param string $transient -- se il transient è diverso dalla url, specificarlo qui
     * 
     * @return string result
     */
    public function get( $url, $hours = 1, $transient = null ) {

        $transient = $transient == null ? $url : $transient;
        
        if( BLAZE_AFFILIATION_CACHE ) {

            $data = get_transient( $transient );

            if( $data === false ) {
                
                $data = $this->getContentAttempts( $url );

                if ( $this->isBadResult( $data ) ) {

                    return $data;

                } else {

                    set_transient( $transient , $data, 3600 * $hours );
                }
            }
    
            return $data;
            
        } else {

            return $this->getContentAttempts( $url );
        }        
    }

    /**
     * Prova a capire se c'è un errore nella chiamata
     *
     * @param string $data
     * @return boolean
     */
    private function isBadResult( $data ){

        $result = json_decode( $data );

        $bad = isset( $result->status ) && $result->status == 'error';

        $bad = empty($data) || $bad;

        return $bad;
    }


    /**
     * Effettua la chiamata cercando di ottenere risultati con diversi tentativi 
     *
     * @param string $url
     * @return string
     */
    private function getContentAttempts( $url ) {

        $data = HttpRequest::getContent( $url );

        $timeout = 2;
        
        while( $timeout++ < 6 && $this->isBadResult( $data ) ) {

            //sleep for 0,5 seconds
            usleep( 500000 );

            $curl = (bool)( $timeout % 2 );

            $data = HttpRequest::getContent( $url, $curl, $timeout );
        }

        return $data;
    }


    public static function getInstance() {
      
        if(self::$instance == null) {   
        
            $c = __CLASS__;
            self::$instance = new $c;
        }
        return self::$instance;
    }

    
}
