<?php

namespace App\Method\ABFL\Response;

use App\ABFLDocuments;
use App\ABFLDrawdownWrapper;
use App\ABFLKYC;
use App\ABFLSanctionWrapper;
use App\APIWrapper\Wrapper;
use App\Method\ABFL\ABFLMethods;
use App\Method\ABFL\Helpers\ABFLHelper;
use App\Slack;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Input;
use Illuminate\Validation\Rules\In;

class Response implements ABFLHelper
{
    public $errorBag;
    public $response;

    public function decisionEngine($res){
        if (!isset($res->responseStatus) || (isset($res->responseStatus) && $res->responseStatus != "SUCCESS")) {
            if (isset($res->error->errors) && $res->error->errors){
                foreach ($res->error->errors as $errorKey => $error) {
                    $this->errorBag[$errorKey.'_'.$error->errorType] = $error->description;
                }
            }
            if (!$this->errorBag && isset($res->error->description))
                $this->errorBag['Error'] = $res->error->description;

            if(isset($res->responseStatus) && $res->responseStatus == 'Error'){
                $this->errorBag['Error'] = 'Failed to run BRE: Mandatory field is empty';
            }

        }

        $this->response = $res;
        return $this;
    }

    public function createToken($res){
        if (!isset($res->data->token))
            $this->errorBag['Error'] = 'Not able to generate token';

        $this->response = $res;
        return $this;
    }

    public function DKYC($res){
        (new Slack(new Request(['title' => 'ABFL KYC Res', 'fields' => ['Res' => json_encode($res)], 'group' => Slack::$STAGE_TESTING])))->send();
        if (isset($res->error->description) || isset($res->Error)) {
            $this->errorBag['Error'] = $res->error->description ?? $res->Error;
            $this->response = $res;
            return $this;
        }


        $ABFLKYC = ABFLKYC::where('application_id', Input::get('id'))->first(['id']);
        if (!isset($ABFLKYC->id)){
            $resArray = (array) $res;

            ABFLKYC::insert([
                'application_id' => Input::get('id'),
                'result' => $resArray['Result'] ? $resArray['Result'] : null,
                'doc_age_check' => $resArray['Doc Age Check Result'] ? $resArray['Doc Age Check Result'] : null,
                'user_id' => Input::get('user_id')
            ]);
        }

        if (isset($res->Result) && $res->Result != 'Approve'){
            $this->errorBag['Error'] = "KYC ".($res->Result ?? '-');
        }
        $this->response = $res;
        return $this;
    }

    public function resolveResponse($func, $res, $request = null){
        if(method_exists($this, $func)){
            return $this->$func($res);
        }
        return array();
    }

    public function createAccountv2($res){
        if (isset($res->error->description))
            $this->errorBag['Error'] = $res->error->description;

        if (!isset($res->data->account_state) && isset($res->data->description)) {
            $this->errorBag['Error'] = $res->data->description;
            $this->response = $res;
            return $this;
        }

        if(isset($res->responseStatus) && $res->responseStatus == 'SUCCESS'){
            $data = [
                'application_id' => Input::get('id'),
                'account_state' => $res->data->account_state,
                'kyc_mode' => $res->data->kyc_mode,
                'approved_offer_limit' => $res->data->approved_offer_limit,
                'account_creation_date' => $res->data->account_creation_date,
                'deal_no' => $res->data->deal_no,
                'deal_id' => $res->data->deal_id,
                'batch_id' => $res->data->batch_id,
                'user_id' => Input::get('user_id')
            ];

            $ABFLSanctionWrapper = new ABFLSanctionWrapper();
            $ABFLSanctionWrapper->fill($data);
            $ABFLSanctionWrapper->save();
        }


        $this->response = $res;
        return $this;
    }

    public function captureChargev2($res){
        if (isset($res->error->description))
            $this->errorBag['Error'] = $res->error->description;

        if(isset($res->responseStatus) && $res->responseStatus == 'SUCCESS'){
            $data = [
                'application_id' => Input::get('id'),
                'loan_no' => $res->data->loan_no,
                'loan_id' => $res->data->loan_id,
                'user_id' => Input::get('user_id')
            ];

            $ABFLSanctionWrapper = new ABFLDrawdownWrapper();
            $ABFLSanctionWrapper->fill($data);
            $ABFLSanctionWrapper->save();
        }

        $this->response = $res;
        return $this;
    }

    public function uploadDocumentBase64($res){
        if (isset($res->error->description))
            $this->errorBag['Error'] = $res->error->description;

        if(isset($res->responseStatus) && $res->responseStatus == 'SUCCESS') {

            $ABFLDocuments = new ABFLDocuments();
            $ABFLDocuments->fill([
                'application_id' => Input::get('id'),
                'consumer_application_file_id' => Input::get('file_id'),
                'response' => json_encode($res),
                'status' => $res->responseStatus,
                'user_id' => Auth::check() ? Auth::user()->id : 107,
            ]);
            $ABFLDocuments->save();
        }

        $this->response = $res;
        return $this;
    }

    public function updateCCC($res){
        if (isset($res->error->description))
            $this->errorBag['Error'] = $res->error->description;

        $this->response = $res;
        return $this;
    }
}