
<?php

	

	define('DEBUG_MODE', false);
	
	$blacklist_ips = '[
				"194.39.218.10"
			]';

	define('BLACKLIST_IPS', $blacklist_ips );

	$redirect_urls = '[
		
	  		{
	"countryCode": "CH",
	"defaultRedirectUrl" : "https://www.bosch.ch",
	"languages": [
			
			{
	"language": "it", 
	"url": "http://www.bosch.ch/it/" 
},
			
			{
	"language": "fr", 
	"url": "http://www.bosch.ch/fr" 
}
		
	]
},
	  	
	  		{
	"countryCode": "DE",
	"defaultRedirectUrl" : "http://www.bosch.de",
	"languages": [
		
	]
},
	  	
	  		{
	"countryCode": "US",
	"defaultRedirectUrl" : "https://www.bosch.us",
	"languages": [
		
	]
},
	  	
	  		{
	"countryCode": "IN",
	"defaultRedirectUrl" : "http://www.bosch.in",
	"languages": [
		
	]
}
	  	
	]';

	define('REDIRECT_URLS', $redirect_urls);

	// fallback constants
	define( 'FALLBACK_IP', '8.8.8.8' ); // just set an ip for a fallback ip
	define( 'FALLBACK_COUNTRY', 'US' ); // like above
	define( 'FALLBACK_LANGUAGE', 'en' ); // like above
	define( 'FALLBACK_REDIRECT_URL', 'https://www.bosch.com/de/' ); // like above
	define( 'TIMEOUT', 60);
	
	// config constants
	define( 'COUNTRY_API', 'https://ews-emea.api.bosch.com/it/ip-geolocator/v1/geolocation/' ); 
	
	// business logic
	if(!DEBUG_MODE) {
    redirect(getRedirectUrl(getRequestData()));
} else {
    getRedirectUrl(getRequestData());
}
// helper methods
//

/**
 * Command to get the redirect url
 *
 * @param $request_data
 * @return string
 */
function getRedirectUrl($request_data)
{
    $blacklist_ips = null !== BLACKLIST_IPS ? BLACKLIST_IPS : array();

    if (strpos($blacklist_ips, $request_data->ip)) {
    
       	if(DEBUG_MODE) {
        	echo '<br><b>Access denied, IP on blacklist!!!</b><br>'; 
        }
		
		$redirect_link = FALLBACK_REDIRECT_URL;

    }
	else {

		$request_data->country = getDataFromApi(
			COUNTRY_API . $request_data->ip
		);
		
		$redirect_link = getRedirectLink( $request_data );

	}

    if(DEBUG_MODE) {
        echo "<ul><li><b>Redirect url</b>: " . $redirect_link . "</li></ul>";
    }

    return $redirect_link;
}

/**
 * @return \stdClass
 */
function getRequestData()
{
    $request_data = new stdClass();
    $request_data->ip = isValidIp( $_SERVER['REMOTE_ADDR'] ) ? $_SERVER['REMOTE_ADDR'] : FALLBACK_IP;
    $request_data->language = array_key_exists( 'HTTP_ACCEPT_LANGUAGE', $_SERVER )
        ? explode( ',', $_SERVER['HTTP_ACCEPT_LANGUAGE'] )[0] : FALLBACK_LANGUAGE;
	
	if(DEBUG_MODE) {
	    echo "<b>request data</b>:<ul>";
	    foreach ($request_data as $key => $value) {
	        echo "<li>" . $key . ": " . $value . "</li>";
	    }
    	echo "</ul>";
    }

    return $request_data;
}

/**
 * @param $api_url
 * @return string
 */
function getDataFromApi($api_url)
{
    $message = '';
    $response = getApiResponseObject( $api_url );

    $message = !isValidResponse( $response->content ) 
        ? FALLBACK_COUNTRY : json_decode( $response->content )->countryCode;

    if(DEBUG_MODE) {
        echo 'API response: <ul><li>' . $message . '</li></ul>'; 
    }

    return $message;
}

/**
 * @param $response
 * @return bool
 */
function isValidResponse($response)
{
    return $response->content
        || $response->code == 200
        || !json_decode( $response->content )->code;
}

/**
 * @param $api_url
 * @return \stdClass
 */
function getApiResponseObject($api_url)
{
	    $result = new stdClass();
	    $options = array(
	        CURLOPT_RETURNTRANSFER => true,
	        CURLOPT_SSL_VERIFYPEER => false,
	        CURLOPT_HEADER         => false,
	        CURLOPT_CONNECTTIMEOUT => TIMEOUT,
	        CURLOPT_TIMEOUT        => TIMEOUT,
	        CURLOPT_HTTPGET        => true,
	        CURLOPT_HTTPHEADER     => array(
	            "cache-control: no-cache",
	            "keyid: 51656bd7-5d89-4d62-ac28-aff1b6a50965"
    	    )
    	);

    	 $ch = curl_init( $api_url );
    curl_setopt_array( $ch, $options );

    $result->content = curl_exec( $ch );
    $result->get_info = curl_getinfo($ch);
    $result->code = curl_getinfo( $ch, CURLINFO_HTTP_CODE );

    if(DEBUG_MODE) {
        echo '<br>raw getinfo: <ul>';
        echo "<li>result code: " . $response->code . "</li>";
        $get_info = curl_getinfo($ch);
        foreach ($get_info as $key => $value) {
            echo '<li>' . $key . ' : ' . $value . '</li>';
        }
        echo '</ul>raw error: <ul>';
        $curl_error = curl_error($ch);
        echo '<li>' . $curl_error . '</li>';
        echo '</ul><br>';
        curl_close( $ch );
    }

    curl_close( $ch );

    return $result;
}

/**
 * @param string $path_to_file
 * @param bool   $assoc
 * @return mixed
 */
function loadData($list , $assoc = false)
{
    return json_decode($list, $assoc);
}

/**
 * @param $country
 * @param $language
 * @return string
 */
function getRedirectLink($request_data)
{
    foreach (loadData(REDIRECT_URLS) as $item) {
        if (strcasecmp( $item->countryCode, $request_data->country ) == 0) {
            if($item->languages) {
                foreach ($item->languages as $lang) {
                    if (strcasecmp( $lang->language, $request_data->language ) == 0) {
                        return $lang->url;
                    }
                }
            }
            if($item->defaultRedirectUrl){
                return $item->defaultRedirectUrl;
            }
        }
    }

    return FALLBACK_REDIRECT_URL;
}

/**
 * Command to redirect to specified url.
 *
 * @param $url
 */
function redirect($url)
{
    ob_start();
    header( sprintf( 'Location: %s', $url ), true, 302 );
    ob_end_flush();
    exit();
}

/**
 * Command to validate ip
 *
 * @param $ip
 * @return bool
 */
function isValidIp($ip)
{
    return inet_pton( $ip ) !== false
        && !in_array( $ip, [ '0.0.0.0', '::1', '127.0.0.1' ] );
}

?>