<?php

namespace App\Http\Controllers\Admin;


use App\APIWrapper\Wrapper;
use App\DigitalSignDetails;
use App\Http\Controllers\Controller;
use App\Mandate;
use App\Method\Utkarsh\UtkarshMethods;
use App\UtkarshLoans;
use Illuminate\Http\Request;
use App\StatusLogs;

class UtkarshController extends Controller{

    private $request;
    public static $client_name = 'credit';

    public function __construct(Request $request){

        $this->request = $request;
    }

    public function checkWorthiness(){

        $wrapper = new Wrapper();
        $wrapperMethods = $wrapper->register(UtkarshMethods::class);
        $wrapper->payload->addPayload(new Request(['id' => $this->request->get('id'), 'client_name' => self::$client_name]));

        $UtkarshLoans = UtkarshLoans::where('application_id', $this->request->get('id'))->first(['id', 'status']);
        if (!isset($UtkarshLoans->id)) {
            $wrapperRes = $wrapperMethods->createLoan($wrapper);
            if (!$wrapperRes->errorBag) {
                if (isset($wrapperRes->status) && $wrapperRes->status == 'new')
                    return response()->json(['status' => 'FAIL', 'data' => ['Message' => 'Loan application sent to Utkarsh. Please wait for the approval.']]);
                return response()->json(['status' => 'FAIL', 'data' => ['Message' => 'Loan application sent to Utkarsh']]);
            }

            if (isset($wrapperRes->status) && $wrapperRes->status == 'rejected')
                return response()->json(['status' => 'FAIL', 'data' => ['Message' => 'Loan Status: Rejected. Please process with different lender']]);

            return response()->json(['status' => 'FAIL', 'data' => array_filter($wrapperRes->errorBag)]);
        }

        if (isset($UtkarshLoans->status) && $UtkarshLoans->status == 'new'){
            return response()->json(['status' => 'FAIL', 'data' => ['Message' => 'Loan application already sent to Utkarsh. Please wait for the approval.']]);
        }


        $digitalSign = DigitalSignDetails::where('application_id', $this->request->get('id'))->first(['id']);

        if (!isset($digitalSign->id)){
            return response()->json(['status' => 'FAIL', 'data' => array_filter(['Error'=>'Signing is pending'])]);
        }

        $mandate = Mandate::where('consumer_application_id', $this->request->get('id'))->first(['id']);

        if (!isset($mandate->id)){
            return response()->json(['status' => 'FAIL', 'data' => array_filter(['Error'=>'Mandate is pending'])]);
        }

        $status = StatusLogs::where('application_id', $this->request->get('id'))->where('status', 'disbursement checklist done')->first(['id']);
        if(isset($status->id)){

            $UtkarshLoans = UtkarshLoans::where('application_id', $this->request->get('id'))->first(['id', 'loan_id']);
            if (isset($UtkarshLoans->loan_id)) {
                $wrapper->payload->addPayload(new Request(['id' => $this->request->get('id'), 'loan_id' => $UtkarshLoans->loan_id, 'client_name' => self::$client_name]));
            }else{
                return response()->json(['status' => 'FAIL', 'data' => array_filter(['Error'=>'Loan ID not generated'])]);
            }

            return $this->sendSingingDetails($wrapperMethods, $wrapper);
        }else{
            return response()->json(['status' => 'FAIL', 'data' => array_filter(['Error'=>'Running Api on Wrong stage'])]);
        }
    }

    private function sendSingingDetails($wrapperMethods, $wrapper){


        $wrapperRes = $wrapperMethods->agreementSigned($wrapper);
        if ($wrapperRes->errorBag || (isset($wrapperRes->response->status) && $wrapperRes->response->status == 'rejected'))
            return response()->json(['status' => 'FAIL', 'data' => array_filter($wrapperRes->errorBag ?? ['Message' => 'Agreement Signed Status: '.$wrapperRes->response->status])]);

        $wrapperRes = $wrapperMethods->getLoan($wrapper);
        if (!$wrapperRes->errorBag)
            $wrapperRes = $wrapperMethods->updateLoan($wrapper);

        if ($wrapperRes->errorBag)
            return response()->json(['status' => 'FAIL', 'data' => array_filter($wrapperRes->errorBag)]);

        return response()->json(['status' => 'OK', 'data' => ['Message' => 'Loan application sent to Utkarsh']]);
    }

    public function generateAadhaarOTP(){

        $wrapper = new Wrapper();
        $wrapperMethods = $wrapper->register(UtkarshMethods::class);
        $wrapper->payload->addPayload(new Request(['id' => $this->request->get('id'), 'client_name' => self::$client_name]));

        $wrapperRes = $wrapperMethods->getLoan($wrapper);
        if (!$wrapperRes->errorBag)
            $wrapperRes = $wrapperMethods->updateLoan($wrapper);

        if ($wrapperRes->errorBag)
            return response()->json(['status' => 'FAIL', 'data' => array_filter($wrapperRes->errorBag)]);

        return response()->json(['status' => 'OK', 'data' => ['Message' => 'Loan application sent to Utkarsh']]);
    }
}
