<?php

namespace App\Http\Controllers\EMICheckout;

use App\Avanse\Processes\AvanseProcesses;
use App\Capri;
use App\ConsumerApplication;
use App\Events\V1\EventPostCreateCustomer;
use App\Http\Controllers\Admin\ConsumerApplicationController;
use App\Http\Controllers\Admin\ConsumerDocument;
use App\LendBox;
use App\LendBoxLSP;
use App\Merchant;
use App\ConsumerApplicationElement;
use App\LoanManagement;
use App\Avanse\Services\AvanseServices;
use App\ABFL\Services\Services;
use App\Events\V1\EventPostCreateFinance;
use App\Http\Controllers\Controller;
use App\KMGP2P;
use App\Singularity\Singularity;
use App\Slack;
use App\Vivriti;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Redirect;


class EMICheckoutController extends Controller
{

    /**
     * @var Request
     */
    private $request;
    private $current_status;

    // public function __construct(Request $request){
    //     $consumerAppController->request = $request;
    // }

    public function generateDocuments(Request $request)
        {
            $application_id = $request->has('id') ? $request->get('id') : '';
            $application_status = ConsumerApplication::with('emi','category', 'merchant','disbursementOfferDisbursed', 'activeOffer')->where('id', $application_id)->first(['id', 'lender_id','user_id','merchant_id','state', 'name', 'mobile_number', 'email', 'approved_amount', 'loan_amount','pan_card','aadhaar_card','co_applicant_pan_card','co_applicant_aadhaar_card','merchant_id','co_applicant_mobile_number','co_applicant_name','co_applicant_email','applicant_id','offer_id','purpose', 'updated_by']);
            $old_status = (isset($application_status->state)) ? $application_status->state : "";
            $mode = (isset($application_status->updated_by)) ? $application_status->updated_by : "";


            $previous_status = ($request->has('state') && $request->get('previous_state')) ? $request->get('previous_state') : ($request->has('previous_status') ? $request->get('previous_status') : $this->current_status);

            $status = ($request->has('status') && $request->get('status')) ? $request->get('status') : ($request->has('state') ? $request->get('state') : $this->current_status);

            $consumerAppController = new ConsumerApplicationController();

            if (($mode != 'EMI CHECKOUT' && strtolower($old_status) == strtolower($status) || $mode == 'EMI CHECKOUT') && ($status == 'rejected' || $status == 'aborted' || in_array($previous_status, $consumerAppController->statusreversearray[$status]))) {


                if ($status == 'rejected') {
                    $consumerAppController->applicationReject($application_id);
                    $consumerAppController->insertIntoJob($application_id, 'referral_communication', $status);
                }

                if ($status == 'rejected' || $status == 'aborted') {
                    $consumerAppController->sendMessageToMerchant($status, $application_id, $request->has('auth_user_id'));
                }

                $blackListData = $consumerAppController->getBlacklistData($application_status);
                if ($status == 'in-process') {
                    if($blackListData['status'] == true) {
                        (new Slack(new Request(['title' => 'Blacklisted by RBI', 'fields' => ['Customer Name' => $application_status->name, 'application_id' => $application_status->id, 'flag' => $blackListData['flag']]])))->send();
                    }

                    $consumerAppController->updateProforma($application_id);
                    $consumerAppController->updateAdvisor($application_id);
                    $consumerAppController->checkApprovedPinCode($application_id);
                    if($application_status->merchant_id != 6543) {
                        $consumerAppController->sendInProcessWhatsAppMessage($application_id);
                        $consumerAppController->startEscalation($application_id, $status);
                    }
                }

                if ($status == 'cancelled') {
                    $consumerAppController->sendClosureLetter($application_id);
                }

                if ($old_status != "cancelled") {
                    if ($status == "waiting for decision" || $status == "disbursement checklist done" || $status == "approved" || $status == "disbursed") {
                        $consumerAppController->sendslackmessage($application_id, $status);
                        if($status == 'disbursement checklist done' && isset($application_status->merchant_id)){
                            $merchatData = Merchant::where('id',$application_status->merchant_id)->first(['send_da_on_checklist']);
                            if(isset($merchatData->send_da_on_checklist) && $merchatData->send_da_on_checklist){
                                $consumerAppController->sendProForma($application_id, false, true);
                            }
                            if ($application_status->lender_id == AvanseServices::$lender_id ) { // && $application_status->approved_amount <= 300000
                                $consumerAppController->reviseDocumentOnEmiChange($application_status,$application_id);
                            }
                            if($application_status->activeOffer->subvention_type_id == 1 && $application_status->lender_id != AvanseServices::$lender_id){
                                $consumerAppController->reviseDocumentOnEmiChange($application_status,$application_id);
                            }
                        }
                    }

                    if($status == 'disbursed' || $status == 'nach registered'){
                        $consumerAppController->updateAppDataInfo(new Request(['application_id' => $application_id, 'user_id' => $application_status->user_id, 'status' => 'disbursed']));
                    }

                    if($status == 'nach registered'){
                        $request = new Request();
                        $request->request->add([
                            'type' => 'Pro Forma Invoice',
                            'test_bot' => false,
                            'bot' => true
                        ]);
                        $document = (new ConsumerDocument($request));
                        $consumerDocument = $document->getDocument($application_id);
                        if(isset($consumerDocument['user']['phase_cycle']) && $consumerDocument['user']['phase_cycle'] > 1){
                            $consumerAppController->invokeCommunication($application_id);
                            $applicationElement = ConsumerApplicationElement::where('application_id', $application_id)->where('is_payout', 1)->first(['id']);
                            if(isset($applicationElement->id)){
                                $consumerAppController->disbursementThrough = true;
                            }
                            $consumerAppController->disburseViaMultiStage($application_id, $consumerDocument);
                        }
                    }

                    if ($status == 'disbursed') {
                        (new LoanManagement())->paymentCalculate($application_id);
                        $consumerAppController->generateInvoice($application_id);
                        $consumerAppController->updatePreviousNach($application_id);
                        $consumerAppController->processingFeeNotification($application_id);

                        if(isset($application_status->lender_id) && !in_array($application_status->lender_id, [Singularity::$lender_id, Capri::$lender_id, Vivriti::$lender_id])) {
                            $consumerDocument = $consumerAppController->sendWelcomeLetter($application_id);
                        }
                        $consumerAppController->invokeCommunication($application_id);
                        $consumerAppController->updatestatustonachregister($application_id);
                        $consumerAppController->updateProcessFeesPayment($application_id);
                        $consumerAppController->updateLegalChargesPayment($application_id);
                        $consumerAppController->updateInsuranceFeesPayment($application_id);
                        $applicationElement = ConsumerApplicationElement::where('application_id', $application_id)->where('is_payout', 1)->first(['id']);
                        if(isset($applicationElement->id)){
                            $consumerAppController->disbursementThrough = true;
                        }
                        $consumerAppController->disburseViaMultiStage($application_id, $consumerDocument);
                        $consumerAppController->whatsAppCommunication($application_status);
                    }elseif($status == 'ready for disbursement'){
                        if ($application_status->lender_id == AvanseServices::$lender_id) {
                            $consumerAppController->setDisbursementStatusJobs($application_status);
                        }
                        if ($application_status->lender_id == AvanseServices::$lender_id ) { // && $application_status->approved_amount <= 300000
                            $consumerAppController->reviseDocumentOnEmiChange($application_status,$application_id);
                        }
                        if($application_status->activeOffer->subvention_type_id == 1 && $application_status->lender_id != AvanseServices::$lender_id){
                            $consumerAppController->reviseDocumentOnEmiChange($application_status,$application_id);
                        }
                    } elseif ($status == 'cf approved') {
                        if($application_status->lender_id == Services::$lender_id){
                            return false;
                        }
                        if(in_array($application_status->merchant_id, LendBox::activatedMerchants()) && (!$request->has('lender_id') || ($request->has('lender_id') && $request->get('lender_id') == LendBox::$lender_id))) {
                            ConsumerApplication::where('id', $application_id)->update(['lender_id' => LendBox::$lender_id]);
                        }
                        else if(in_array($application_status->merchant_id, LendBoxLSP::activatedMerchants()) && (!$request->has('lender_id') || ($request->has('lender_id') && $request->get('lender_id') == LendBoxLSP::$lender_id))) {
                            ConsumerApplication::where('id', $application_id)->update(['lender_id' => LendBoxLSP::$lender_id]);
                        }
                        else if(in_array($application_status->merchant_id, AvanseProcesses::activatedMerchants()) && (!$request->has('lender_id') || ($request->has('lender_id') && $request->get('lender_id') == AvanseServices::$lender_id))) {
                            ConsumerApplication::where('id', $application_id)->update(['lender_id' => AvanseServices::$lender_id]);
                            event(new EventPostCreateCustomer($application_status->id));
                            $consumerAppController->sendCFApprovedCommunication($application_status);

                            // New Loan Application
                            event(new EventPostCreateFinance($application_status->id));
                        }else if(in_array($application_status->merchant_id, KMGP2P::activatedMerchants()) && (!$request->has('lender_id') || ($request->has('lender_id') && $request->get('lender_id') == KMGP2P::$lender_id))) {
                            ConsumerApplication::where('id', $application_id)->update(['lender_id' => KMGP2P::$lender_id]);
                        }
                    } elseif ($status == 'approved') {
                        if ($application_status->lender_id == AvanseServices::$lender_id ) { // && $application_status->approved_amount > 300000

                            /* Re-generate documents if avanse changed the approved amount*/
                            $consumerAppController->regenerateDocuments($application_id);

                            /*
                                on application approval if application is tagged to avanse,
                                then only send the VKYC notifications
                                post VKYC if KYC results to approval then sanction letter
                                and other formalities will be done
                             */

                            /*$return = $consumerAppController->requestHypervergeKYC($application_id, 'arr');

                            if(!empty($return['status']) && $return['status'] === 'OK') {
                                if(!empty($return['customer_link'])) {
                                    $reqObj = new Request(['customer_link' => $return['customer_link'], 'applicant_type' => 1]);
                                    $out = $consumerAppController->sendHypervergeKYC($reqObj, $application_id);
                                }
                                if(!empty($return['co_customer_link'])) {
                                    $reqObj = new Request(['co_customer_link' => $return['co_customer_link'], 'applicant_type' => 2]);
                                    $out = $consumerAppController->sendHypervergeKYC($reqObj, $application_id);
                                }
                            }*/
                            /*
                                below code is added for safety purpose to generate the ananse payment links in advance.
                                As it is taking time to generate, code halted because of the same
                                First applicant and co-applicant do the hyperverge KYC. If kYC approved then sanction letter email would be sent immediately without any problem as payment links has already been generated
                            */
                            $request = new Request();
                            $request->request->add([
                                'type' => 'Sanction Letter',
                                'bot' => true,
                                'from_mail' => _env('CENTRALOPS')
                            ]);

                            $document = (new ConsumerDocument($request));
                            $document->getDocument($application_id);
                        } else {
                            $consumerAppController->saveLiabilityPercent($application_status, $application_id, 'job');
                            $consumerAppController->checkApprovedPinCode($application_id);
                            $consumerAppController->ApprovalInit($application_status, $application_id);
                            $consumerAppController->disbursementOffers($application_id);
                            $isError = $consumerAppController->sendSanctionLetter($application_id);
                            $consumerAppController->sendProForma($application_id);
                            if($application_status->merchant_id != 6543){
                                $consumerAppController->initiateForLatestBankStatement($application_id);
                                $consumerAppController->sendemandate($application_id);
                                $consumerAppController->proformaSigningNotification($application_id);
                                $consumerAppController->creditLimitNotification($application_id);
                                $consumerAppController->insertIntoJob($application_id, 'referral_communication', $status);
                                $consumerAppController->whatsAppCommunication($application_status, $status);
                            }
                            if ($isError instanceof RedirectResponse || $isError instanceof Redirect) {
                                if ($error = $isError->getSession()->get('error')) {
                                    return response()->json(['status' => 'FAIL', 'message' => $error], 200);
                                }
                            }
                        }
                    } elseif ($status == 'waiting for documents') {
                        if($application_status->merchant_id != 6543) {
                            $consumerAppController->waitingForDocumentNotification($application_id);
                            $consumerAppController->startEscalation($application_id, $status);
                        }
                    } elseif ($status == 'waiting for decision') {
                        if($application_status->merchant_id != 6543) {
                            $consumerAppController->startEscalation($application_id, $status);
                        }
                    } else if ($status == 'closed') {
                        $consumerAppController->sendWithHoldCommunication($application_id);
                        $consumerAppController->sendClosureLetter($application_id);
                        if($request->get('cancel_nach')){
                            $consumerAppController->cancelNachs($application_id);
                        }
                    }
                    else if ($status == 'pre approved') {
                        $consumerAppController->checkApprovedPinCode($application_id);
                        if($application_status->merchant_id != 6543) {
                            $consumerAppController->sendPreApprovalCommunication($application_id);
                        }
                    }
                }
                $consumerAppController->rollbackJobChanges(['application_id' => $application_id], $status);
            }
            return response()->json(['status' => 'OK'], 200);
        }


}
