<?php

namespace App\Http\Controllers\Network\Classes;

use Exception;
use GuzzleHttp\Client;
use Yajny\Member\Models\Sale;

class FlexOffersApi implements SalesGetterApi
{

    public $api_key;
    public $network_id;
    public $client;
    public $sales;

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

    public function getSales($start_days, $end_days)
    {
        $query = [
            'status' => 'all',
            'reportType' => 'details',
            'startDate' => date('c', strtotime("today - {$start_days} days")),
            'endDate' => date('c', strtotime("today - {$end_days} days")),
            'page' => 1,
            'pageSize' => 500,
        ];
        $salesRows = [];
        do {
            $sales_json = $this->callApi($query);
            $salesRows = array_merge($salesRows, $sales_json);
            $query['page']++;
        } while (sizeof($sales_json) == 500);
        $sales = [];
        foreach ($salesRows as $salesRow) {
            if (isset($sales[$salesRow->orderNumber])) {
                if (isset($sales[$salesRow->orderNumber]['items'][$salesRow->FLX_SalesId])) {
                    $sales[$salesRow->orderNumber]['items'][$salesRow->FLX_SalesId]['status'] = $salesRow->orderStatus;
                    $sales[$salesRow->orderNumber]['items'][$salesRow->FLX_SalesId]['saleAmount'] = $salesRow->saleAmount;
                    $sales[$salesRow->orderNumber]['items'][$salesRow->FLX_SalesId]['commission'] = $salesRow->commission;
                } else {
                    $sales[$salesRow->orderNumber]['items'][$salesRow->FLX_SalesId] = (array)$salesRow;
                }
            } else {
                if (Sale::where('network_id', $this->network_id)->where('order_id', $salesRow->orderNumber)->count()) {
                    $salesRow->isNew = false;
                    if (!isset($sales[$salesRow->orderNumber]))
                        $sales[$salesRow->orderNumber] = (array)$salesRow;
                    $sales[$salesRow->orderNumber]['items'][$salesRow->FLX_SalesId] = (array)$salesRow;

                } else {
                    $items = [];
                    $existingSale = Sale::where('network_id', $this->network_id)->where('order_id', $salesRow->orderNumber)->first();
                    if ($existingSale) {
                        $items = $existingSale->items->mapWithKeys(function ($item) {
                            return [
                                $item->sku => [
                                    'FLX_SalesId' => $item->sku,
                                    'saleAmount' => $item->unit_price,
                                    'commission' => $item->commission,
                                    'orderStatus' => $item->status
                                ]
                            ];
                        })->toArray();
                    }
                    $sales[$salesRow->orderNumber] = (array)$salesRow;
                    $sales[$salesRow->orderNumber]['isNew'] = true;
                    if (isset($items[$salesRow->FLX_SalesId])) {
                        $items[$salesRow->FLX_SalesId]['status'] = $salesRow->orderStatus;
                        $items[$salesRow->FLX_SalesId]['saleAmount'] = $salesRow->saleAmount;
                        $items[$salesRow->FLX_SalesId]['commission'] = $salesRow->commission;
                    } else {
                        $items[$salesRow->FLX_SalesId] = (array)$salesRow;
                    }
                    $sales[$salesRow->orderNumber]['items'] = $items;
                }
            }
        }
        $this->sales = $sales;
        return $this->sales;
    }

    private function callApi($query)
    {
        try {
            $response = $this->client->request(
                'GET',
                'https://api.flexoffers.com/allsales',
                [
                    'headers' => [
                        'apiKey' => $this->api_key,
                        'Accept' => 'application/json'
                    ],
                    'query' => $query,
                ]);
            if ($response->getStatusCode() == 200) {
                return json_decode($response->getBody()) ?? [];
            } else return [];
        } catch (Exception $e) {

        }
        return [];
    }
}
