<?php

namespace App\Http\Controllers\Network\Classes;

use Carbon\Carbon;
use Exception;
use GuzzleHttp\Client;


class ShareASaleApi implements SalesGetterApi
{

    public $api_key;
    public $affiliate_id;
    public $private_key;
    public $client;
    public $sales;
    public $api_url;

    public function __construct($api_url, $api_key, $affiliate_id, $private_key = null)
    {
        $this->api_url = $api_url;
        $this->api_key = $api_key;
        $this->affiliate_id = $affiliate_id;
        $this->private_key = $private_key;
        $this->client = new Client();
        $this->sales = [];
    }

    public function getSales($start_days, $end_days)
    {
        $actionVerb = 'activity';
        $timeStamp = gmdate(DATE_RFC1123);
        $auth = $this->generateToken($actionVerb, $timeStamp);
        $query = [
            'action' => $actionVerb,
            'affiliateId' => $this->affiliate_id,
            'token' => $this->api_key,
            'version' => 2.3,
            'dateStart' => Carbon::today()->subDays($start_days)->format('m/d/Y'),
            'dateEnd' => Carbon::tomorrow()->subDays($end_days)->format('m/d/Y'),
            'format' => 'csv',
        ];

        try {
            $salesResponse = $this->client->request(
                'GET',
                $this->api_url,
                [
                    'query' => $query,
                    'headers' => [
                        'x-ShareASale-Date' => $timeStamp,
                        'x-ShareASale-Authentication' => $auth,
                    ]
                ]
            );
            $sales = [];
            $salesRows = explode("\n", $salesResponse->getBody());
            $header = str_getcsv($salesRows[0]);
            for ($i = 1; $i < count($salesRows) - 1; $i++) {
                $saleOrder = array_combine($header, str_getcsv($salesRows[$i]));
                if ($saleOrder['Voided']) $saleOrder['status'] = 'declined';
                elseif ($saleOrder['Locked']) $saleOrder['status'] = 'confirmed';
                else $saleOrder['status'] = 'pending';
                $sales[] = $saleOrder;
            }
            return $this->sales = $sales;
        } catch (Exception $e) {

        }
        return [];
    }

    private function generateToken($actionVerb, $timeStamp)
    {
        $sig = $this->api_key . ':' . $timeStamp . ':' . $actionVerb . ':' . $this->private_key;
        return hash("sha256", $sig);
    }
}
