<?php

namespace App\Http\Controllers\Admin;

use App\Avanse\Processes\AvanseCreditPolicy;
use App\Avanse\Processes\AvanseProcesses;
use App\Avanse\Processes\PolicyAttributes;
use App\AvanseCreateCustomer;
use App\AvanseCreateFinance;
use App\AvanseMandate;
use App\ConsumerApplication;
use App\ConsumerApplicationElement;
use App\Http\Controllers\Controller;
use App\Slack;
use App\AvanseBRE;
use Carbon\Carbon;
use Illuminate\Http\Request;
use App\Events\V1\EventPostCreateFinance;

class AvanseController extends Controller{

    private $request;
    private $error;
    private $message;
    public function __construct(Request $request){

        $this->request = $request;
    }

    public function checkWorthiness(){
        //$avanseCreditPolicy = new AvanseCreditPolicy(new PolicyAttributes($this->request));


        if($this->callBRE()){
            return response()->json(['status' => 'OK', 'data' => $this->message]);
        }

        return response()->json(['status' => 'FAIL', 'data' => array_filter($this->error)]);

        /*if($avanseCreditPolicy->isWorthy()){
            return response()->json(['status' => 'OK']);
        }

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

    public function callBRE(){
        $avanseBre = AvanseBRE::where('application_id', $this->request->get('id'))->orderBy('created_at', 'desc')->first();
        if (!isset($avanseBre->id) || ($avanseBre->decision != "Approved" && $avanseBre->decision != "Declined" && $avanseBre->decision != "Hard Declined")) {
            $request = new Request(['id' => $this->request->get('id')]);
            $breResponse = (new AvanseProcesses($request))->callBRE();
            if (is_bool($breResponse)){
                 return true;
            }else{
                $this->error[] = $breResponse;
                return false;
            }
        }elseif(isset($avanseBre->id) && $avanseBre->decision == "Approved"){
            $this->message = 'Approved';
            return true;
        }elseif(isset($avanseBre->id) && $avanseBre->decision == "Declined"){
            $this->message = 'Declined';
            return true;
        }elseif(isset($avanseBre->id) && $avanseBre->decision == "Hard Declined"){
            $this->message = 'Hard Declined';
            return true;
        }else{
            $this->error[] = 'Something went wrong';
            return false;
        }
    }

    public function sendToAvanse(){

        $application = ConsumerApplication::where('id', $this->request->get('id'))->first(['id', 'applicant_id','co_applicant_id']);

        if($this->request->get('payment_transfer_date')){
            ConsumerApplicationElement::where('application_id', $this->request->get('id'))->update(['payment_transfer_date' => $this->request->get('payment_transfer_date')]);
        }

        if ($this->request->has('cif') && $this->request->has('applicant_type') && $this->request->get('cif') && $this->request->get('applicant_type')){
            $this->updateCIFNumber($application);
        }

        $data = [];

        if(isset($application->id)) {
            $request = new Request(['id' => $this->request->get('id'), 'applicant_id' => $application->applicant_id, 'applicant_type' => 1]);
            $createCustomer = (new AvanseProcesses($request))->createCustomer();
            if (!is_array($createCustomer) && is_int($createCustomer)) {

                //Create CIF for co-applicant
                if($application->co_applicant_id) {
                    $request = new Request(['id' => $this->request->get('id'), 'applicant_id' => $application->co_applicant_id, 'applicant_type' => 2]);
                    $createCustomer = (new AvanseProcesses($request))->createCustomer();
                    if (is_array($createCustomer) || !is_int($createCustomer)) {
                        return response()->json(['status' => 'FAIL', 'data' => $createCustomer, 'customersLists' => $this->getCustomerLists($request, 2)]);
                    }
                }

                return $this->createFinance();

                return response()->json(['status' => 'OK', 'avanse_customer_id' => $createCustomer]);
            }

            $data = $createCustomer == false ? 'Merchant is not eligible for avanse' : $createCustomer;
        }

        return response()->json(['status' => 'FAIL', 'data' => $data, 'customersLists' => $this->getCustomerLists($request, 1)]);
    }

    public function updateCIFNumber($application){
        $applicant_id = $this->request->get('applicant_type') == 1 ? $application->applicant_id : ($this->request->get('applicant_type') == 2 ? $application->co_applicant_id : '');

        $avanseCreateCustomer = AvanseCreateCustomer::where('application_id', $this->request->get('id'))->where('applicant_id', $applicant_id)->first(['id']);
        if (isset($avanseCreateCustomer->id)){
            return false;
        }

        if ($applicant_id) {
            return AvanseCreateCustomer::insertGetId([
                "application_id" => $this->request->get('id'),
                "applicant_id" => $applicant_id,
                "cif" => $this->request->get('cif'),
                "primaryRelationOfficer" => 0,
                "dedupReq" => 0,
                "created_at" => Carbon::now()->toDateTimeString(),
            ]);
        }

        return true;
    }

    private function getCustomerLists(Request $request, $type){
        $customersLists = '';
        if ($request->has('customers') && $request->get('customers')) {
            $customersLists = '<div>Please select correct customer from the below list and continue</div><table class="table"><tr><td></td><td>Short Name</td><td>CIF</td></tr>';
            foreach ($request->get('customers') as $customer) {
                $customersLists .= '<tr><td><input type="radio" class="form-control" data-applicant-type="'.$type.'" name="cif-selection" value="'.$customer->cif.'"></td><td>'.$customer->shortName.'</td><td>'.$customer->cif.'</td></tr>';
                }
            $customersLists .= '</table>';
        }

        return $customersLists;
    }

    public function createFinance(){

        $application = ConsumerApplication::where('id', $this->request->get('id'))->first(['id', 'applicant_id']);
        $data = [];

        (new AvanseProcesses(new Request(['id' => $this->request->get('id'), 'applicant_id' => $application->applicant_id, 'applicant_type' => 1])))->updateFinancials();

        $avanseFinance = AvanseCreateFinance::where('application_id', $this->request->get('id'))->first(['finReference']);
        if (isset($avanseFinance->finReference)) {
            return response()->json(['status' => 'OK', 'avanse_finance_id' => $avanseFinance->finReference]);
        }

        if(isset($application->id)) {
            $createFinance = (new AvanseProcesses(new Request(['id' => $this->request->get('id'), 'applicant_id' => $application->applicant_id, 'applicant_type' => 1])))->createFinance();
            if (!is_array($createFinance) && is_int($createFinance)) {
                //event(new EventPostCreateFinance($application->id));
                return response()->json(['status' => 'OK', 'avanse_finance_id' => $createFinance]);
            }

            $data = $createFinance;
        }

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

    public function sendDocumentToAvanse(){
        if ($this->request->get('id') && $this->request->get('file_id')){
            //(new Slack(new Request(['title' => 'Avanse document test - 1', 'fields' => ['id' => $this->request->get('id'), 'file_id' => $this->request->get('file_id')], 'group' => Slack::$STAGE_TESTING])))->send();
            if($message = (new AvanseProcesses($this->request))->sendUploadedDocument()) {
                return response()->json(['status' => 'FAIL', 'message' => $message]);
            }
        }

        return response()->json(['status' => 'FAIL', 'message' => 'Failed to send document']);
    }

    public function createMandate(){
        $application = ConsumerApplication::where('id', $this->request->get('id'))->first(['id', 'applicant_id']);
        $data = [];


        $avanseMandate = AvanseMandate::where('application_id', $this->request->get('id'))->first(['id']);
        if (isset($avanseMandate->id)) {
            return response()->json(['status' => 'OK','message' => 'Mandate already pushed to avanse', 'avanse_mandate_id' => $avanseMandate->id]);
        }

        if(isset($application->id)) {
            $mandateApproval = (new AvanseProcesses(new Request(['id' => $this->request->get('id'), 'applicant_id' => $application->applicant_id, 'applicant_type' => 1])))->mandateApproval();
            if (!is_array($mandateApproval) && is_int($mandateApproval)) {
                return response()->json(['status' => 'OK', 'message' => 'Mandate pushed to avanse', 'avanse_mandate_id' => $mandateApproval]);
            }

            $data = $mandateApproval;
        }

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

}
