<?php

namespace App\Http\Controllers\Network\Classes;

use Exception;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;
use Illuminate\Support\Facades\Log;
use Yajny\Member\Models\Sale;

class LinkshareApi implements SalesGetterApi
{
    private $networkId;
    private $publisherId;
    private $client;
    private $clientId;
    private $clientSecret;

    public function __construct($networkId, $publisherId, $clientId, $clientSecret)
    {
        $this->networkId = $networkId;
        $this->publisherId = $publisherId;
        $this->clientId = $clientId;
        $this->clientSecret = $clientSecret;
        $this->client = new Client();
    }

    public function getSales($start_days, $end_days)
    {
        $token = $this->getToken();
        if (!$token) die;
        $url = "https://api.linksynergy.com/events/1.0/transactions";
        $startDate = date('Y-m-d H:i:s', strtotime("today - {$start_days} days"));
        $endDate = date('Y-m-d H:i:s', strtotime("today - {$end_days} days"));
        $query = [
            'transaction_date_start' => $startDate,
            'transaction_date_end' => $endDate,
        ];
        try {
            $response = $this->client->get(
                $url,
                [
                    'query' => $query,
                    'headers' => [
                        'Authorization' => 'Bearer ' . $token,
                        'Content-Type' => 'application/json'
                    ],
                ]
            );
            $salesOrders = json_decode($response->getBody());
            $sales = [];
            foreach ($salesOrders as $saleItem) {
                $saleItem->status = $saleItem->is_event;
                if (isset($sales[$saleItem->order_id])) {
                    if (isset($sales[$saleItem->order_id]->items[$saleItem->sku_number])) {
                        $sales[$saleItem->order_id]->items[$saleItem->sku_number]->status = $saleItem->is_event;
                        $sales[$saleItem->order_id]->items[$saleItem->sku_number]->sale_amount = $saleItem->sale_amount;
                        $sales[$saleItem->order_id]->items[$saleItem->sku_number]->commissions = $saleItem->commissions;
                    } else {
                        $sales[$saleItem->order_id]->items[$saleItem->sku] = $saleItem;
                    }
                } else {
                    if (Sale::where('network_id', $this->networkId)->where('network_transaction_id', $saleItem->etransaction_id)->count()) {
                        $saleItem->isNew = false;
                        $sales[] = $saleItem;
                    } else {
                        $items = [];
                        $existingSale = Sale::where('network_id', $this->networkId)->where('network_transaction_id', $saleItem->etransaction_id)->first();
                        if ($existingSale) {
                            $items = $existingSale->items->mapWithKeys(function ($item) {
                                return [
                                    $item->sku => (object)[
                                        'sku_number' => $item->sku,
                                        'sale_amount' => $item->unit_price,
                                        'commissions' => $item->commission,
                                        'status' => $item->status,
                                    ]
                                ];
                            });
                        }
                        $sales[$saleItem->order_id] = $saleItem;
                        $sales[$saleItem->order_id]->isNew = true;
                        if (isset($items[$saleItem->sku_number])) {
                            $items[$saleItem->sku_number]->sale_amount = $saleItem->sale_amount;
                            $items[$saleItem->sku_number]->commissions = $saleItem->commissions;
                            $items[$saleItem->sku_number]->status = $saleItem->is_event;
                        } else {
                            $items[$saleItem->sku_number] = $saleItem;
                        }
                        $sales[$saleItem->order_id]->items = $items;
                    }
                }
            }
            return $sales;
        } catch (Exception $e) {
            return [];
        }
    }

    private function getToken()
    {
        $token = false;
        try {
            $response = $this->client->request('POST', 'https://api.linksynergy.com/token', [
                'headers' => ['Authorization' => 'Bearer ' . base64_encode($this->clientId . ':' . $this->clientSecret)],
                'form_params' => [
                    'scope' => $this->publisherId,
                ]
            ]);
            $res = json_decode($response->getBody());
            if ($res)
                $token = $res->access_token;
        } catch (GuzzleException $exception) {
            Log::error('TradeTracker Authenticate Error', ['exception' => $exception]);
        } finally {
            return $token;
        }
    }
}
