<?php

namespace App\Classes\External\Payments;

use Illuminate\Support\Arr;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Log;

use App\Classes\External\Payments;

class Ezypay extends Payments
{
	protected function connect(string $url,array $args=[])
	{
		if ($x=$this->mustPause()) {
			Log::error('API Throttle, waiting .',['m'=>__METHOD__]);
			sleep($x);
		}

		$client = $this->getClient(config('services.ezypay.base_uri'));

		$result = $client->request('GET',$url.($args ? '?'.http_build_query($args) : ''),[
			'headers' => [
				'Authorization'=>'Basic '.base64_encode(config('services.ezypay.token_user').':'),
				'Accept'=>'application/json',
			],
		]);

		$api_remain = Arr::get($result->getHeader('X-RateLimit-Remaining'),0);
		$api_reset = Arr::get($result->getHeader('X-RateLimit-Reset'),0);

		if ($api_remain === 0) {
			Log::error('API Throttle.',['m'=>__METHOD__,'api_reset'=>$api_reset]);
			Cache::put('api_throttle',$api_reset,now()->addSeconds($api_reset));
		}

		return json_decode($result->getBody()->getContents());
	}

	public function getCustomer(string $id)
	{
		return Cache::remember(__METHOD__.$id,86400,function() use ($id) {
			return collect($this->connect('accounts/customerid/'.$id));
		});
	}

	/**
	 * Get a list of configured customers
	 *
	 * @return Collection
	 * @todo Hard coded at 100 clients - need to make this more dynamic
	 *
	 * {#1079
	 *  +"TermsAndConditions": true
	 *  +"Account": {#1082
	 *   +"PaymentMethodId": 0
	 *  }
	 *  +"Address1": "1 Road Street "
	 *  +"BillingStatus": "Active"
	 *  +"BusinessAccountReference": "12345"
	 *  +"CountryCode": "AU"
	 *  +"Email": "user@example.com"
	 *  +"EzypayReferenceNumber": 12345678
	 *  +"Firstname": "Bart"
	 *  +"Id": "6219c42b-8e56-4e4e-af3a-76ddf4b0e4e1"
	 *  +"MobilePhone": ""
	 *  +"Postcode": "1234"
	 *  +"ReferenceId": "01nnnn"
	 *  +"State": "VIC"
	 *  +"Suburb": "TOWN"
	 *  +"Towncity": ""
	 *  +"Surname": "Simpson "
	 *  +"PaymentPlanId": "00000000-0000-0000-0000-000000000000"
	 *  +"DateOfBirth": "1970-01-01T00:00:00.000"
	 *  +"Gender": "M"
	 *  +"DebitType": 0
	 *  +"RecurringAmount": 0.0
	 *  +"Frequency": 0
	 *  +"FrequencyType": 0
	 *  +"StartDate": "0001-01-01T00:00:00.000"
	 *  +"RecurringDebitEndType": 0
	 *  +"TotalAmountCollected": 0.0
	 *  +"MinimumNumberOfPayment": 0
	 *  +"RecurringWithDifferentFirstDebitAmount": 0.0
	 *  +"RecurringDebitFirstDebitDate": "0001-01-01T00:00:00.000"
	 *  +"RecurringDebitAmount": 0.0
	 *  +"RecurringDebitFrequency": 0
	 *  +"RecurringDebitFrequencyType": 0
	 *  +"RecurringDebitStartDate": "0001-01-01T00:00:00.000"
	 *  +"RecurringDebitDifferentFirstAmountEndType": 0
	 *  +"RecurringDebitTotalAmountCollected": 0.0
	 *  +"RecurringDebitMinimumNumberOfPayment": 0
	 *  +"OnceOffAmount": 0.0
	 *  +"OnceOffStartDate": "0001-01-01T00:00:00.000"
	 * }
	 */
	public function getCustomers(): Collection
	{
		return Cache::remember(__METHOD__,86400,function() {
			return collect($this->connect('customers?pageSize=100'));
		});
	}

	/**
	 * Get Specific debits for a client.
	 *
	 * @param array $opt
	 * @return Collection
	 *
	 * Illuminate\Support\Collection^ {#1077
	 *  #items: array:4 [
	 *  0 => {#1826
	 *   +"Amount": 99.99
	 *   +"Id": "76666ef1-106c-458c-9162-e77fe746517c"
	 *   +"CustomerId": "6219c42b-8e56-4e4e-af3a-76ddf4b0e4e1"
	 *   +"Date": "2021-10-01T00:00:00.000"
	 *   +"Status": "Pending"
	 *  }
	 *  1 => {#2075
	 *   +"Amount": 99.99
	 *   +"Id": "80ba201d-fb6f-4700-b1b7-2b13fbfa91d5"
	 *   +"CustomerId": "6219c42b-8e56-4e4e-af3a-76ddf4b0e4e1"
	 *   +"Date": "2021-09-01T00:00:00.000"
	 *   +"Status": "Pending"
	 *  }
	 */
	public function getDebits($opt=[]): Collection
	{
		return Cache::remember(__METHOD__.http_build_query($opt),86400,function() use ($opt) {
			return Collect($this->connect('debits'.($opt ? '?'.http_build_query($opt) : '')));
		});
	}

	public function getSettlements($opt=[]): Collection
	{
		return Cache::remember(__METHOD__.http_build_query($opt),86400,function() use ($opt) {
			return Collect($this->connect('settlements/'.config('services.ezypay.guid').($opt ? '?'.http_build_query($opt) : '')));
		});
	}
}