<?php

namespace App\Method\ABFL;

use App\APIWrapper\Helper\WrapperHelper;
use App\Method\ABFL\Helpers\ABFLHelper;
use App\Method\ABFL\Payload\Payload;
use App\Method\ABFL\Response\Response;
use Illuminate\Support\Facades\Config;

class ABFLMethods implements WrapperHelper, ABFLHelper
{
    public static $createToken = 'abfl_token';
    public $errorBag = null;

    public function decisionEngine($wrapper){

        $response = $this->createToken($wrapper);
        if (!$response->errorBag) {
            return $wrapper->initiate(__FUNCTION__);
        }
        return $response;
    }

    public function createAccountv2($wrapper){
        $response = $this->createToken($wrapper);
        if (!$response->errorBag) {
            return $wrapper->initiate(__FUNCTION__);
        }
        return $response;
    }

    public function DKYC($wrapper){

        $response = $this->createToken($wrapper);
        if (!$response->errorBag) {
            $payload = $wrapper->payload->getPayload(__FUNCTION__);
            if (is_array($payload['payload']) && isset($payload['payload']['XML Doc'])){
                $wrapper->methods['headers']['x-api-key'] = _env('ABFL_OKYC');
                unset($wrapper->methods['headers']['X-AUTH-TOKEN']);
            }
            return $wrapper->initiate(__FUNCTION__);
        }
        return $response;
    }

    public function createToken($wrapper)
    {
        $payload = $wrapper->payload->getPayload(__FUNCTION__);
        if (!isset($payload['payload']['token'])) {
            $wrapperRes = $wrapper->initiate(__FUNCTION__);
            $token = $wrapper->response->response->data->token;
        }else {
            $token = $payload['payload']['token'];
            $tokenObj = new \stdClass();
            $tokenObjSegment = new \stdClass();
            $tokenObjSegment->token = $token;
            $tokenObj->data = $tokenObjSegment;
            $wrapperRes = $wrapper->response->resolveResponse(__FUNCTION__, $tokenObj);
        }
        $wrapper->methods['headers']['X-AUTH-TOKEN'] = $token;
        return $wrapperRes;
    }

    public function captureChargev2($wrapper)
    {
        $response = $this->createToken($wrapper);
        if (!$response->errorBag) {
            return $wrapper->initiate(__FUNCTION__);
        }
        return $response;
    }

    public function uploadDocumentBase64($wrapper){
        $response = $this->createToken($wrapper);
        if (!$response->errorBag) {
            return $wrapper->initiate(__FUNCTION__);
        }
        return $response;
    }

    public function handle(){
        return Config::get('wrapper.abfl');
    }

    public function payload(): Payload
    {
        return new Payload();
    }

    public function response(): Response
    {
        return new Response();
    }

    public function updateCCC($wrapper)
    {
        $response = $this->createToken($wrapper);
        if (!$response->errorBag) {
            return $wrapper->initiate(__FUNCTION__);
        }
        return $response;
    }
}