<?php
    #==========================================================================#
    # CONSTANTS FOR CONFIGURATION                                              #
    #==========================================================================#
    define("DATABASE_NAME"  , "sewing_so");
    define("MYSQL_USERNAME" , "sewing_so");
    define("MYSQL_PASSWORD" , "YL1IC9bQEyN");
    define("APP_ID"         , "defd4fdl2r7uhwx8lp2k00d7t7szdljj");
    define("SHARED_SECRET"  , "hJ1av2CgcEO4y8BFFYUv2w");
    define("REFRESH_TOKEN"  , "WWxsfV7u1pnx_Y95XbTTI5ULyjQw2slA0EoVv6R1vDo");
    define("ACCOUNT_NAME"   , "General Merchandise International Limited - UK");
    #==========================================================================#

    #==========================================================================#
    # FUNCTIONS FOR CHANNEL ADVISOR API CALLS                                  #
    #==========================================================================#
    function ca_REST ($url,$application_id,$shared_secret,$fields=false) { 
        $encoded_secret=base64_encode($application_id.':'.$shared_secret);
        $headers = [
            'Content-Type: application/x-www-form-urlencoded',
            'Authorization: Basic '.$encoded_secret
        ];
        $ch=curl_init();

        curl_setopt($ch,CURLOPT_URL,trim($url));
        curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
        curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
        curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
        curl_setopt($ch,CURLOPT_POST,count($fields));
        curl_setopt($ch,CURLOPT_POSTFIELDS,http_build_query($fields));
        curl_setopt($ch,CURLOPT_TIMEOUT,5);
        curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);
        curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
        curl_setopt($ch,CURLOPT_HTTPGET,false);
        curl_setopt($ch,CURLOPT_HEADER,false);
        curl_setopt($ch,CURLINFO_HEADER_OUT,true);
        curl_setopt($ch,CURLOPT_VERBOSE,true);
        curl_setopt($ch,CURLOPT_STDERR,$verbose=fopen('php://temp','rw+'));
        $result=curl_exec($ch);
        $error=curl_error($ch);
        curl_close($ch);
        if ($error) { var_dump($error); return false; }
        return $result;
    }


    function ca_REST_PATCH ($url,$access_token,$fields=false) { 

	$data = json_encode( $fields, JSON_FORCE_OBJECT );

	//$data = http_build_query( $fields );
	
	?><pre><? print_r($data) ?></pre><?

	$context = array(
		'http' => array(
				'method'    =>  'PATCH',
				'header'    =>  "Authorization: bearer ".$access_token."\r\nContent-Length: " . strlen( $data ) . "\r\nContent-Type: application/json\r\nAccept: application/json",
				'content'   =>  $data
			)                             
		);
	
	?><pre><? print_r($context) ?></pre><?

	$context = stream_context_create( $context );
	
	?><pre><? print_r($context) ?></pre><?

	?><pre><? print_r($url) ?></pre><?

	return file_get_contents( $url, false, $context );

    }


    function ca_api_CALL               ($url,$options) { 
        return json_decode(
            file_get_contents(
                $url,
                false,
                stream_context_create($options)
            )
        );
    }
    function ca_api_GET                ($url,$access_token) { 
        return ca_api_CALL(
            $url,
            array(
              'http' => array(
                'method'=>'GET',
                'header'=>"Authorization: bearer ".$access_token."\r\n"
                )
            )
        );
    }
    function ca_api_POST               ($url,$data,$access_token) { 
        return ca_api_CALL(
            $url,
            array(
                'http' => array(
                    'method' =>'POST',
                    'content'=>json_encode($data),
                    'header' =>"Authorization: bearer ".$access_token."\r\n".
                               "Content-Type: application/json\r\n".
                               "Accept: application/json\r\n"
                )
            )
        );
    }
    function ca_api_get_token          ($application_id,$shared_secret,$refresh_token) { 
        $fields = [
            'grant_type'    => 'refresh_token',
            'refresh_token' => $refresh_token 
        ];
        $url="https://api.channeladvisor.com/oauth2/token";
        $access_token=ca_REST($url,$application_id,$shared_secret,$fields);
        if($access_token===false) return false;
        return json_decode($access_token,true)["access_token"];
    }
    function ca_api_get_profile_id     ($account_name,$access_token) { 
        $url="https://api.channeladvisor.com/v1/Profiles";
        $result=ca_api_GET($url,$access_token);
        foreach($result->value AS $profile) { 
            if($profile->AccountName==$account_name)
                return $profile->ID;
        }
        return null;
    }

    #==========================================================================#
    # CONNECT TO DATABASE                                                      #
    #==========================================================================#
    if (!($db_link=mysql_connect('localhost',MYSQL_USERNAME,MYSQL_PASSWORD))) { die(MYSQL_USERNAME.'/'.MYSQL_PASSWORD.' Not connected : '.mysql_error()); }
    if (!(mysql_select_db(DATABASE_NAME,$db_link))) { die('Can\'t use '.DATABASE_NAME.' : '.mysql_error()); }
    #==========================================================================#

    #==========================================================================#
    # CHANNEL ADVISOR API SETUP                                                #
    #==========================================================================#
    $access_token = ca_api_get_token      (APP_ID,SHARED_SECRET,REFRESH_TOKEN);
    $profile_id   = ca_api_get_profile_id (ACCOUNT_NAME,$access_token);
    #==========================================================================#

	$date            = new DateTime();
	$FlagDescription = 'Printed '.$date->format('Y-m-d H:i');
	$data            = array('FlagID' => '6', 'FlagDescription' => $FlagDescription);

	$order_sql  = "SELECT CAO.*, CACC1.country_name AS ShippingCountryName, CACC1.flag AS ShippingCountryFlag, CACC2.country_name AS BillingCountryName, CACC2.flag AS BillingCountryFlag FROM __ca_orders AS CAO LEFT JOIN __ca_country_codes AS CACC1 ON CAO.ShippingCountry = CACC1.country_code LEFT JOIN __ca_country_codes AS CACC2 ON CAO.BillingCountry  = CACC2.country_code ";
	$order_sql .= "WHERE CAO.ID IN (".$_GET['orderIDs'].") ";
	$order_sql .= "ORDER BY CAO.ShippingCountry, CAO.SiteName, CAO.PaymentDateUtc ASC ";

	$orders=@mysql_query($order_sql,$db_link);
	while($order=@mysql_fetch_array($orders,MYSQL_ASSOC))
	{
		$update_flag_url="https://api.channeladvisor.com/v1/Orders(".urlencode($order['ID']).")?access_token=".urlencode($access_token);
		$response = ca_REST_PATCH($update_flag_url,$access_token,$data);
		?><pre style="color:blue;"><? print_r($response); ?></pre><?

		$update_flag_sql="UPDATE __ca_orders SET FlagDescription='".$FlagDescription."' WHERE ID=".$order['ID'];
		@mysql_query($update_flag_sql,$db_link);
		?><pre style="color:blue;"><? print_r($update_flag_sql); ?></pre><?
		?><pre style="color:red;" ><? print_r(mysql_error()   ); ?></pre><?
	}
?>