<?php

namespace App\Http\Controllers\ConsumerAPI;

use App\ApplicationEMICalculation;
use App\AppRating;
use App\BNPL;
use App\Checklist;
use App\Comments;
use App\Company;
use App\ConsumerApplication;
use App\ConsumerApplicationElement;
use App\ConsumerApplicationFiles;
use App\CreditLine;
use App\Devices;
use App\DigitalSignDetails;
use App\DisbursementLogs;
use App\ekycIntegration;
use App\FCMNotification;
use App\GCMRegistraion;
use App\GPSLogs;
use App\Http\Controllers\Admin\ConsumerApplicationController;
use App\Http\Controllers\Admin\EMICalculation;
use App\Http\Controllers\Admin\MerchantController;
use App\Http\Controllers\ApiController;
use App\Http\Controllers\Controller;
use App\Http\Controllers\FrontController;
use App\Http\Controllers\Grade\GradeController;
use App\Http\Controllers\MerchantApiController;
use App\Http\Controllers\TestingController;
use App\JobProvider;
use App\JWTAccess;
use App\KYCDetails;
use App\Locations;
use App\Merchant;
use App\Http\Controllers\Admin\ConsumerDocument;
use App\MerchantCategory;
use App\MerchantOffers;
use App\OCRRecognition;
use App\OtpManager;
use App\ProductOffers;
use App\Products;
use App\ProFormaInvoice;
use App\PWAApplicationForm;
use App\ScoreCard;
use App\Shortio;
use App\Slack;
use App\StateModel;
use App\StatusLogs;
use App\TelecomDetails;
use App\Templates;
use App\User;
use App\UserAttribution;
use Aws\EKS\Exception\EKSException;
use Carbon\Carbon;
use Dompdf\Exception;
use Hashids\Hashids;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Input;
use Illuminate\Support\Facades\Storage;
use phpDocumentor\Reflection\DocBlock\Tags\Reference\Url;
use App\Events\V1\EventPostFormCompleted;
use App\Imports\TestImport;

class ConsumerApiController extends Controller
{

    private $request;
    public static $OK = 'OK';
    public static $FAIL = 'FAIL';
    public $statusgroup = array('in-process' => array('in-process','form completed', 'incomplete form','waiting for decision'),
        'waiting for documents' => array('waiting for documents'), 'approved' => array('approved','disbursement checklist done',
            'ready for disbursement'), 'disbursed' => array('disbursed'), 'nach registered' => array('nach registered'), 'closed' => array('closed'), 'rejected' => array('rejected'), 'aborted' => array('aborted'), 'pre approved' => array('pre approved'), 'cancelled' => array('cancelled', 'cancellation in-process'));
    public static $reason = ['Repay EMIs', 'Business Loan', 'Buy Car', 'Buy 2W/3W', 'Jewellery', 'Marriage', 'Travel', 'Home renovation', 'Pay Credit Card bill', 'Daily expenses', 'Education', 'School Fees', 'Medical expenses', 'Other'];

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

//    Login and Register
    public function generateOTP(){
        $otp = rand('100000', '999999');
        $data = $this->request->request->get('data');

        if (!isset($data->mobile_number))
            return ['message' => 'You have entered incorrect mobile number.'];


        $mobile_number = $data->mobile_number;
        $user = User::where('mobile_number', $mobile_number)->whereNull('deleted_at')->where('user_type', 1)->first(['id','email']);

        if (!isset($user->id)) {
            $isExist = User::where('mobile_number', $mobile_number)->where('id',922)->where('user_type','!=',1)->first(['id']);
            if (!isset($isExist->id)) {
                return ['message' => 'You have entered incorrect details or your mobile number is not registered with us.'];
            }
        }

        $message = "Your Credit Fair verification code is " . $otp . " <br/>Best Regards,<br/>Team Credit Fair";
        $entity = ['templateid' => '1307161519272825845', 'entityid' => Templates::$entityid];
        OtpManager::where('mobile_number', (string)$mobile_number)->delete();
        $otp_manager = new OtpManager();
        $otp_manager->otp = $otp;
        $noEmail = 1;
        if (isset($isExist->id) && $isExist->id == 922) {
            $otp_manager->otp = 612405;
            $otp_manager->mobile_number = $mobile_number;
            $otp_manager->save();
            return ['message' => 'OTP request is generated successfully.', 'status' => static::$OK];
        }
        $otp_manager->mobile_number = $mobile_number;
        $otp_manager->save();

        $mobile_number = '91' . $mobile_number;
        send_sms($mobile_number, ['message' => $message, 'OTP' => true, 'templateDetails' => $entity], true);

        $email = isset($user) && isset($user->email) ? $user->email : '';
        if($email && $noEmail) {
            send_mail($email, $message, 'Credit Fair: OTP');
        }

        return ['message' => 'OTP request is generated successfully.', 'status' => static::$OK, 'statusCode' => 'CF200'];
    }

    public function verifyOtp(JWTAccess $JWTAccess){
        $request_data = (object)$this->request->request->get('data');
        $request_id = (isset($request_data->request_id)) ? $request_data->request_id : "";
        $application_id = (isset($request_data->application_id)) ? $request_data->application_id : "";

        if(!isset($request_data->otp))
            return ['message' => 'You have entered invalid OTP.', 'statusCode' => 'CF300'];

        if(!isset($request_data->mobile_number))
            return ['message' => 'You have entered incorrect mobile number.', 'statusCode' => 'CF300'];

        $mobile_number = $request_data->mobile_number;
        $otp = $request_data->otp;
        $otpManager = OtpManager::where('mobile_number', (string)$mobile_number)->where('otp', $otp)->first();

        if (!isset($otpManager->id) && !$request_id)
            return ['message' => 'OTP verification failed', 'statusCode' => 'CF300'];

        if ($request_id){
            $teleDetails = new TelecomDetails();
            $response = $teleDetails->verifyOtp($request_id, $otp, $application_id, $mobile_number);
            if ($response == false) {
                $otp = rand('100000', '999999');

                $message = "By validating OTP $otp I agree to Credit Fair's terms and conditions https://bit.ly/2QRVgjd for the loan application and have no objection to them conducting a credit check.<br/>Best Regards,<br/>Team Credit Fair";

                OtpManager::where('mobile_number', (string)$mobile_number)->delete();
                $otp_manager = new OtpManager();
                $otp_manager->otp = $otp;
                $otp_manager->mobile_number = $mobile_number;
                $otp_manager->save();

                $mobile_number = '91' . $mobile_number;
                send_sms($mobile_number, ['message' => $message, 'OTP' => true], true);

                return ['status' => static::$OK, 'message' => 'OTP request is generated successfully.', 'request_id' => '', 'statusCode' => 'CF200'];
            }
        }

        OtpManager::where('mobile_number', (string)$mobile_number)->delete();

        $userData = $this->userData($mobile_number, $JWTAccess);
        if($userData == false){
            return ['status' => static::$FAIL, 'message' => 'Verification Failed', 'data' => null, 'statusCode' => 'CF300'];
        }
        User::where('mobile_number', $mobile_number)->update(['user_verified'=> 1]);
        return ['status' => static::$OK, 'message' => 'OTP successfully verified', 'data' => $userData, 'statusCode' => 'CF200'];

    }

    public function userData($mobile_number, $JWTAccess){
        $user = User::where('mobile_number',$mobile_number)->first();
        if(isset($user->id)){
        $userData['user_id'] = $user->id;
        $userData['name'] = $user->name;
        if ($user->code) {
            $userData['referral_code'] = isset($user->code) ? strtoupper($user->code) : '';
            $referral_link_base = "https://play.google.com/store/apps/details?id=com.consumer.creditfair&referrer=";
            $utm_medium = urlencode("customer_app");
            $referee = urlencode($user->code);
            $utm_campaign = urlencode('registration');
            $referral_link = 'utm_source=' . $referee . '&utm_medium=' . $utm_medium . '&utm_campaign=' . $utm_campaign;
            $referral_link = urlencode($referral_link);
            $referral_link = urlencode($referral_link_base . $referral_link);
            try {
                $userData['referral_link'] = urlencode(Shortio::getUrl(urldecode($referral_link)));
            }catch (\Exception $e){
                $userData['referral_link'] = $referral_link;
            }
        }

        $userData['user_email'] = $user->email;
        $userData['user_mobile'] = $user->mobile_number;
        $userData['is_gps'] = $user->is_gps;
        $userData['session_expiry'] = strtotime("+30 days");

        $session_string = base64_encode($user->id."|".$user->mobile_number."|".$userData['session_expiry']."|1");
        $userObject = new \stdClass();
        $userObject->id = $user->id;
        $userObject->session_string = $session_string;
        $userObject->user_type = $user->user_type;
        $userObject->remember_token = $user->remember_token;
        $userObject->code = $user->code;
        $userObject->email = $user->email;
        $userObject->mobile = $user->mobile;
        $userData['session_string'] = $JWTAccess->generateAccessToken($userObject);

        return $userData;
        }else{
            return false;
        }
    }

    public function registerUser(){
        $request_data = $this->request->request->get('data');

        if ($request_data != "") {

            $existingUser = User::where('mobile_number', $request_data->mobile_number)->first(['id']);

            if ((!isset($existingUser->id) || $existingUser->id == null) && isset($request_data->email) && !empty($request_data->email)) {
                $existingUser = User::where('email', $request_data->email)->first(['id']);
            }

            if (isset($existingUser->id)) {
                return ['status' => static::$FAIL, 'message' => 'You are already a member'];
            }

            $message = '';
            $firstName = $request_data->first_name;
            $lastName = $request_data->last_name;
            $email_id = isset($request_data->email) ? $request_data->email : '';
            $phone = $request_data->mobile_number;
            $source = isset($request_data->source) ? $request_data->source : 'new signup';

            if ($firstName === '' || $firstName === null) {
                $message = 'Please enter your First Name';
            } else if ($lastName === '' || $lastName === null) {
                $message = 'Please enter your Last Name';
//            } else if ($email_id === '' || $email_id === null) {
//                $message = 'Please enter your Email ID';
            } else if ($phone === '' || $phone === null || strlen($phone) < 10 || strlen($phone) > 10 ) {
                $message = 'Please enter a valid mobile number';
            }

            if ($message !== '') {
                return ['status' => static::$FAIL, 'message' => $message];
            } else {

                $otp = rand('100000', '999999');
                $message = "Your Credit Fair verification code is " . $otp . " <br/>Best Regards,<br/>Team Credit Fair";
                $entity = ['templateid' => '1307161519272825845', 'entityid' => Templates::$entityid];
                OtpManager::where('mobile_number', (string)$phone)->delete();
                $otp_manager = new OtpManager();
                $otp_manager->otp = $otp;
                $otp_manager->mobile_number = $phone;
                $otp_manager->save();
                if ($request_data->user_id > 0) {
                    $userSave = User::find($request_data->user_id);
                }else{
                    $userSave = new User();
                    $code = (new MerchantController())->getReferralCode();
                }

                $userSave->fill([
                    'name' => $firstName." ".$lastName,
                    'email' => $email_id,
                    'mobile_number' => $phone,
                    'user_type' => 1,
                    'source' => $source,
                ]);

                if (isset($code)){
                    $userSave->code = $code;
                }

                $userSave->save();

                //$data= User::where('mobile_number', $request_data->mobile_number)->first(['id']);

                $mobile_number = '91' . $phone;
                send_sms($mobile_number, ['message' => $message, 'OTP' => true, 'templateDetails' => $entity], true);

                if($email_id) {
                    send_mail($email_id, $message, 'Credit Fair: OTP');
                }

                return ['status' => static::$OK, 'message' => 'Registered Successfully', 'user_id' => $userSave->id];
            }
        }

        return ['status' => static::$FAIL, 'message' => 'Something went wrong'];
    }

//    User Details
    public function getDashboardData(){
        try {
            $user = $this->request->request->get('user');

            if($user) {
                $disbursed_cases = ConsumerApplication::with('category','documents','application_element', 'creditReport', 'foir', 'emi', 'mandate','checkmandate')->where('user_id', $user['id'])->whereIn('state', ['disbursed','nach registered'])
                    ->whereNull('is_deleted')->orderBy('updated_at', 'desc')->get();
                $in_process_cases = ConsumerApplication::with('category','documents','application_element', 'creditReport', 'foir', 'emi', 'mandate','checkmandate')->where('user_id', $user['id'])->whereNotIn('state', ['disbursed','nach registered'])
                    ->orderBy('created_at', 'desc')->get();
                $consumer_application = ConsumerApplication::with('creditReport','application_element', 'merchant', 'Checklist','emi')
                    ->where('user_id', $user['id'])->whereNotIn('state', ['disbursed','nach registered','aborted','rejected','closed','cancelled'])
                    ->whereNull('is_deleted')->orderBy('created_at', 'desc')->first();
            } else{
                return ['status' => static::$FAIL, 'message' => 'Something went wrong'];
            }

            $merchantApiController = new MerchantApiController();
            $application_id = 0;
            $status = '';

            if (count($disbursed_cases) || count($in_process_cases)) {
                if (count($disbursed_cases)) {
                    $payment_data = [];
                    foreach ($disbursed_cases as $disb){
                        $frontController = new FrontController();
                        $payment_data[] = $frontController->getPayments($disb->id);
                        foreach ($payment_data as $key=>$value){
                            $progress = ($value['total_emi'] - ($value['remaining_emi']))/$value['total_emi'];
                            $count = count($value['schedule']);
                            $arr = ['progress' => number_format($progress, 2, '.', ''), 'count' => $count];
                            $payment_data[$key] = array_merge($payment_data[$key], $arr);
                        }
                    }

                    $data['payment_applications'] = $payment_data;
                }
                if ($in_process_cases) {

                    $responseData = [];
                    foreach ($in_process_cases as $item){
                        $amount = $item->approved_amount ? $item->approved_amount : $item->loan_amount;
                        $_docLists = (new ConsumerApplicationController())->getOtherRequiredDocument($item);
                        $_docLists = array_map('ucfirst', $_docLists);

                        if(!in_array($item->state, ['aborted', 'rejected', 'closed', 'cancelled', 'cancellation in-process', 'ready for disbursement'])){
                            $application_id = $item->id;
                        }

                        $status = ucfirst($merchantApiController->searchForId($item->state, $this->statusgroup));

                        $app_signing = false;
                        $esignlink = '';
                        $hashids = new Hashids('Creditfair by CS', 20);
                        $signingStatus = DigitalSignDetails::where('application_id', $item->id)->get();
                        try {
                            if (count($signingStatus) > 0) {
                                foreach ($signingStatus as $element) {
                                    if (($element->applicant == 1 || $element->applicant == 2) && ($element->isagreementsigned == 0 || empty($element->isagreementsigned))) {
                                        $app_signing = true;
                                        try {
                                            $esignlink = Shortio::getUrl(asset("esign/id/" . $hashids->encode($item->id)));
                                        }catch (\Exception $e){
                                            $esignlink = asset("esign/id/" . $hashids->encode($item->id));
                                        }
//                                }else if($element->applicant == 2 && ($element->isagreementsigned == 0 || empty($element->isagreementsigned))){
//                                    $co_app_signing = true;
                                    }
                                }
                            } else if (count($signingStatus) == 0 && $status == "Approved") {
                                $app_signing = true;
                                try {
                                    $esignlink = Shortio::getUrl(asset("esign/id/" . $hashids->encode($item->id)));
                                }catch (\Exception $e){
                                    $esignlink = asset("esign/id/" . $hashids->encode($item->id));
                                }
                            }
                        }catch(Exception $e){
                            (new Slack(new Request(['title'=>'Error','fields'=>['exception'=>$e]])))->send();
                        }

                        if($status == "Approved"){
                            try {
                                $creditLine = new CreditLine(new Request(['id' => $application_id]));
                                $creditData = $creditLine->getCreditData();
                                $creditLimit = $creditData['max_loan_amount_to_sanction_basis_ml'] > $item->loan_amount ?
                                    str_replace('.00', '', money_format('%!i', round($creditData['max_loan_amount_to_sanction_basis_ml']))) : 'error';
                            } catch (\Exception $e) {
                                $creditLimit = 'error';
                            }
                        }

                        $approvalMessage = isset($item) ? $this->getApprovalMessage($item) : '';
                        $responseData[] = [
                            'id' => ($item->id) ? $item->id : '',
                            'merchant_name' => ($item->merchant) ? $item->merchant->merchant_name : '',
                            'amount' => $amount,
                            'pending_documents' => str_replace('_', ' ', implode(', ',$_docLists)),
                            'approval_status' => isset($approvalMessage['approval_status']) && ($approvalMessage['approval_status'] != 2 && $approvalMessage['approval_status'] != 6) ?
                                $approvalMessage['approval_status'] : (count($_docLists) > 0 ? 6 : 7),
                            'category_name' => ($item->category) ? $item->category->name : '',
                            'status' => $status,
                            'applicant_signing' => $app_signing,
                            'signing_link' => $esignlink,
                            'credit_limit' => isset($creditLimit) ? $creditLimit : 'error',
                        ];
                    }

                    $data['ongoing_applications'] = $responseData;

                    if(!empty($consumer_application)){
                        $disableName = false;
                        $disablePanNumber = false;
                        $disableCoName = false;
                        $disableCoPanNumber = false;
                        $identification_details = [];
                        if(isset($consumer_application->creditReport)){
                            if(count($consumer_application->creditReport) > 1 || (count($consumer_application->creditReport) == 1 && $consumer_application->creditReport[0]->applicant_type == 1)) {
                                if (!empty($consumer_application->name)) {
                                    $disableName = true;
                                }
                                if (!empty($consumer_application->pan_card)) {
                                    $disablePanNumber = true;
                                }
                            }
                            if(count($consumer_application->creditReport) > 1 || (count($consumer_application->creditReport) == 1 && $consumer_application->creditReport[0]->applicant_type == 2)) {
                                if (!empty($consumer_application->co_applicant_name)) {
                                    $disableCoName = true;
                                }
                                if (!empty($consumer_application->co_applicant_pan_card)) {
                                    $disableCoPanNumber = true;
                                }
                            }
                        }

                        //  Loan details data

                        $identification_details[] = [
                            'disableName' => $disableName,
                            'disablePanNumber' => $disablePanNumber,
                            'disableCoName' => $disableCoName,
                            'disableCoPanNumber' => $disableCoPanNumber,
                        ];
                    }
                }

                $data['no_application'] = false;
                $data['application_id'] = $application_id;
                $data['app_status'] = $status;
                $data['form_disable'] = isset($identification_details) ? $identification_details : '';
                $data['payment'] = count($disbursed_cases) ? true : false;
                $data['applications'] = count($in_process_cases) ? true : false;
                $data['prequalified_amount1'] = '';
                return ['status' => static::$OK, 'message' => 'Success', 'data' => $data];

            } else {

                $data['no_application'] = true;
                $data['payment'] = false;
                $data['applications'] = [];
                $data['prequalified_amount1'] = '';
                return ['status' => static::$OK, 'message' => 'Success', 'data' => $data];
            }
        }catch (\Exception $e){
            return 'Exception occurred while fetching consumer dashboard details';
        }
    }

    public function getApprovalMessage($application){
        $data = [];
        if (isset($application->id)){
            if(in_array($application->state,['approved','ready for disbursement','disbursement checklist done'])){
                $data['message'] = 'Congratulations! Your Easy EMI plan has been ';
                $data['approval_status'] = 1;
                $data['message_1'] = 'Your first EMI date is ';
                $data['date'] = date('d/M/Y',strtotime($application->emi->emi_date));
                $data['message_2'] = 'If you have any queries please call us on +919820810213 or email us on app@creditfair.in.';
            }else if(in_array($application->state,['rejected','aborted'])){
                $data['message'] = 'We regret to inform you that your Easy EMI is';
                $data['approval_status'] = $application->state == 'rejected' ? 3 : 5;
                $data['message_1'] = 'Thanks for showing interest in Credit Fair, we’d be happy to reconsider you after 3 months. ';
                $data['message_2'] = 'If you have any queries please call us on +919820810213 or email us on app@creditfair.in.';
            }else if(in_array($application->state,['pre approved'])){
                $amount = $application->approved ? $application->approved : $application->loan_amount;
                $data['approval_status'] = 4;
                $data['message'] = 'Congratulations! Your Easy EMI plan has been ';
                $data['message_1'] = 'Up to Rs.'.$amount.'subject to additional documents';
                $data['message_2'] = 'If you have any queries please call us on +919820810213 or email us on app@creditfair.in.';
            }else{
                $data['message'] = isset($application->documents) && $application->documents && count($application->documents) ? 'Your documents have been successfully submitted.' : ''; //Your Application for an easy EMI plan is
                $data['approval_status'] = isset($application->documents) && $application->documents && count($application->documents) ? 2 : 6;
                $data['message_1'] = 'Please submit the pending documents for us to process your application.'; //Please submit required documents to get a quick decision.
                $data['message_2'] = 'If you have any queries please call us on +919820810213 or email us on app@creditfair.in.';
            }
        }

        return $data;
    }

    public function getListDetails(){
        $states = StateModel::get(['name', 'id']);
        $category = MerchantCategory::get(['name', 'id']);

        foreach ($category as $key => $val){
            if(isset($category[$key]) && ($category[$key]->id == 26 || $category[$key]->id == 29 || $category[$key]->id == 10)) {
                unset($category[$key]);
            }
        }

        $profession = ScoreCard::$professionTypeCreditFair;
        $address_status = ['RENTED', 'OWNED', 'PARENTS HOUSE', 'Self Owned', 'Parent Owned', 'Rented With Family', 'Rented With Friend', 'Company Allotted'];
        $language = [['name' => 'English','value' => 'ENGLISH'], ['name' => 'हिंदी','value' => 'HINDI'], ['name' => 'मराठी','value' => 'MARATHI'], ['name' => 'ગુજરાતી','value' => 'GUJARATI'], ['name' => 'বাঙালি','value' => 'BENGALI'], ['name' => 'ਪੰਜਾਬੀ','value' => 'PUNJABI'], ['name' => 'தமிழ்','value' => 'TAMIL'], ['name' => 'తెలుగు','value' => 'TELUGU'], ['name' => 'ಕನ್ನಡ','value' => 'KANNADA'], ['name' => 'മലയാളം','value' => 'MALAYALAM'], ['name' => 'اردو','value' => 'URDU'], ['name' => 'ଓଡ଼ିଆ','value' => 'ODIA']];
//        $reason = ['Repay EMIs', 'Business Loan', 'Buy Car', 'Buy 2W/3W', 'Jewellery', 'Marriage', 'Travel', 'Home renovation', 'Pay Credit Card bill', 'Daily expenses', 'Education', 'School Fees', 'Medical expenses', 'Other'];

        $data['states'] = $states;
        $data['merchant_categories'] = $category;
        $data['company_type'] = $profession;
        $data['address_status'] = $address_status;
        $data['language'] = $language;
        $data['reason'] = static::$reason;
        return ['status' => static::$OK, 'message' => 'Success', 'data' => $data];
    }

    function cleanReferralCode($string) {
        $string = str_replace(' ', '-', $string); // Replaces all spaces with hyphens.
        $string = preg_replace('/[^A-Za-z0-9\-]/', '', $string); // Removes special chars.

        return preg_replace('/-+/', '-', $string); // Replaces multiple hyphens with single one.
    }

    public function getMerchantList() {
        $request_data = $this->request->request->get('data');

        if (isset($request_data->code)){
            parse_str(urldecode($request_data->code), $referralData);
            if (isset($referralData['utm_source'])) {
                $code = $this->cleanReferralCode($referralData['utm_source']);
                $bnpl_merchants = BNPL::getMerchants();
                if ($code) {
                    $merchant_data = Merchant::where('code', trim($code))->where('status', 'active')->where('is_guest_active',1)->whereNull('deleted_at')->whereNotIn('id', $bnpl_merchants)->first(['id', 'merchant_name', 'category_id']);
                    if(isset($merchant_data) && !empty($merchant_data) && isset($merchant_data->category_id)){
                        $data['product_data'] = $this->getMerchantAndProducts($merchant_data->category_id);
                        $data['referral_data'] = $merchant_data;
                    }
                }
            }
        }

        if (!isset($data) && isset($request_data->category)) {
            $data = $this->getMerchantAndProducts($request_data->category);
        }
        if(isset($data)) {
            return ['status' => static::$OK, 'message' => 'Success', 'data' => $data];
        }else {
            return ['status' => static::$OK, 'message' => 'Sorry, we don \'t serve in this area'];
        }
    }

    public function getMerchantAndProducts($category){
        $bnpl_merchants = BNPL::getMerchants();
        $data = Merchant::with('products')->where('category_id', $category)->where('slug', 'like', '%DM-%')->whereNotIn('id', $bnpl_merchants)->get(['id', 'merchant_name']);
        $merchants = Merchant::with('products')->where('category_id', $category)->where('status', 'active')->where('is_guest_active',1)->whereNull('deleted_at')->whereNotIn('id', $bnpl_merchants)->get(['id', 'merchant_name']);
        $len = count($data);
        foreach($merchants as $key => $value) {
            $data[$len+$key] = $value;
        }
        foreach ($data as $item){
            if(count($item->products) > 0){
                foreach ($item->products as $key => $prod){
                    $offers = ProductOffers::where('product_id', $prod->id)->whereNull('deleted_at')->get();
                    if (count($offers) < 1) {
                        unset($item->products[$key]);
                    }
                }
            }
        }
        return $data;
    }

    public function getProfile(){
        $user = $this->request->request->get('user');

        $user_id = $user['id'];

        $data = User::where('id', $user_id)->whereNull('deleted_at')->orderBy('updated_at', 'desc')->first();

        return ['status' => static::$OK, 'message' => 'Success', 'data' => $data];
    }

    public function updateProfile(){
        $request_data = $this->request->request->get('data');
        $user = $this->request->request->get('user');
        $message = '';

        if ($request_data != "") {

            $existingMobile = User::where('mobile_number', $request_data->mobile_number)->first(['id']);
            $existingEmail = User::where('email', $request_data->email_id)->first(['id']);


            if ($request_data->name === '' || $request_data->name === null) {
                $message = 'Please enter your name';
            } else if ($request_data->email_id === '' || $request_data->email_id === null) {
                $message = 'Please enter your email ID';
            } else if ($request_data->mobile_number === '' || $request_data->mobile_number === null || strlen($request_data->mobile_number) < 10 || strlen($request_data->mobile_number) > 10 ) {
                $message = 'Please enter a valid mobile number';
            } else if (isset($existingMobile->id)) {
                $message = 'Mobile Number already exists';
            } else if (isset($existingEmail->id)) {
                $message = 'Email id already exists';
            }

            if ($message !== '') {
                return ['status' => static::$FAIL, 'message' => $message];
            } else {

                User::where('id', $user)->update([
                    'name' => $request_data->name,
                    'email' => $request_data->email_id,
                    'mobile_number' => $request_data->mobile_number,
                ]);

                return ['status' => static::$OK, 'message' => 'Successfully updated'];
            }
        }

        return ['status' => static::$FAIL, 'message' => 'Something went wrong'];
    }

//    EMI Offer Details [total_emi, advance_emi, processing_fee, flat_annual_interest, up_front_from_customer(adv. payable), emi(emi amount)]
    public function getPlans(){
        $request_data = (object)$this->request->request->get('data');
        if(!empty($request_data)){
            if ($request_data->loan_amount > 2000000) {

                return ['status' => static::$FAIL, 'message' => 'Loan Amount cannot be more than Twenty Lacs'];
            } else if ($request_data->loan_amount < 10000) {

                return ['status' => static::$FAIL, 'message' => 'Loan Amount cannot be less than 10000'];

            }

            if($request_data->loan_type == 3){
                if(env('APP_CONNECTION') == 0) {
                    $merchant_id = 21;
                }else{
                    $merchant_id = 21;
                }
            }else{
                $merchant_id = (isset($request_data->merchant_id) && $request_data->merchant_id != "") ? $request_data->merchant_id : '';
            }

            $bnpl_merchants = BNPL::getMerchants();
            $merchant_details = Merchant::where('id', $merchant_id)->where('is_guest_active',1)->where('status', 'active')->whereNotIn('id', $bnpl_merchants)->first();

            if (isset($merchant_details->id)) {
                $request = new Request();
                $request->attributes->add(
                    ['merchant_id' => $merchant_details->id,
                        'loan_amount' => $request_data->loan_amount,
                        'category_id' => $merchant_details->category_id,
                        'product_id' => isset($request_data->product_id) && $request_data->product_id !== 'Other' ? $request_data->product_id : '',
                        'application_id' => 0]
                );
                $calculation = new EMICalculation($request);
                try {

                    $newOfferData = $calculation->prepareCalculation()->getData();
                    return ['status' => static::$OK, 'message' => 'Success', 'data' => $newOfferData];
                } catch (\Exception $e) {

                    return ['status' => static::$FAIL, 'message' => 'Something went wrong'];
                }
            } else {

                return ['status' => static::$FAIL, 'message' => 'Merchant not found'];
            }
        }
    }

//    Application Form Submit
    public function apply(){
        $request_data = $this->request->request->get('data');
        $page_event = (isset($request_data->page_event) ) ? $request_data->page_event : "";
        $response = '';

        try {
            $application_id = $request_data->application_id ?? 0;
            if($application_id != 0){
                $appStatus = ['form completed','incomplete form','in-process','waiting for documents'];
                $decision_given = ConsumerApplication::where('id', $application_id)->whereNotIn('state', $appStatus)->first();
                if(!empty($decision_given)){
                    return ['status' => static::$FAIL, 'message' => 'Please reach out to our customer service executives to make changes to this application'];
//                    return ['status' => static::$FAIL, 'message' => 'Oops! Seems like you can no longer make any change to this application'];
                }
            }
            if ($page_event == 'loan_details') {
                $response = $this->loanDetails($request_data);
            } elseif ($page_event == 'identity_details') {
                $response = $this->identityDetails($request_data);
            } elseif ($page_event == 'income_details') {
                $response = $this->incomeDetails($request_data);
            }

            if ($response === '' || $page_event === '') {
                return ['status' => static::$FAIL, 'message' => 'Something went wrong'];
            } else {
                return $response;
            }
        }catch (\Exception $e){
            (new Slack(new Request(['title' => 'Error Status', 'fields' => ['m' => $e->getMessage(), 'l' => $e->getLine(), 'f' => $e->getFile(), 't' => $e->getTraceAsString()]])))->send();
            return ['status' => static::$FAIL, 'message' => 'Something went wrong'];
        }
    }

    public function documentOcr(){
        $request_data = $this->request->request->get('data');
        $documents = $this->request->has('documents') ? $this->request->get('documents') : $this->request->request->get('documents');

        if($documents) {

            $file = '';
            $filePath = '';

            foreach ($documents as $_file) {
                foreach (json_decode($_file) as $key => $fileData) {
                    $file = $fileData;
                    $fileProperties = $this->getFileName($key, $request_data);
                    $imageInfo = $fileProperties['imageInfo'];

                    if (isset($imageInfo->path) || isset($imageInfo->uri)) {
                        $path = isset($imageInfo->path) ? $imageInfo->path : ($imageInfo->uri ? $imageInfo->uri : '');
                        $filePath = base64_encode(time()) . $fileProperties['files_type'] . $this->getExtension($path);
                    }
                }
            }

            Storage::disk('www')->put($filePath, base64_decode($file));
            $filePath = $this->request->getScheme() . '://' . $this->request->getHttpHost() . '/content/media/' . $filePath;
        }else {
            $data = array();
            $data['status'] = 'FAIL';
            $data['message'] = 'File not found';
            return $data;
        }
        if($filePath) {
            if(env('APP_CONNECTION') == 0) {
                if(isset($request_data->type) && $request_data->type != 'pan_card'){
                    $ocrdata = [
                        'aadhaar' =>  "883559856504",
                        'address' =>  "S/O Bahadur Singh, 14, gram jamuhar, near panchayat bhawan, post jamuhar, Jamuhar, Jamuhar Mirzapur, Uttar Pradesh, 231304 ",
                        'city' =>  "Mirzapur",
                        'dob' =>  "15/01/1984",
                        'document' =>  "aadhar_card",
                        'father' =>  "Bahadur Singh",
                        'gender' =>  "MALE",
                        'name' =>  "Satya Pal Singh",
                        'pin' =>  "231304",
                        'state' =>  "Uttar Pradesh",
                    ];
                }else {
                    $ocrdata = array('date' => '17/08/1987', 'father' => "MILIND RAGHAVENDRA SHIRHATTI", 'name' => "OMKAR MILIND SHIRHATTI", "panNo" => "BVZPS1846R", 'document' => "pan");
                }
            }else {
                $ocrDataSettings = ['file_type' => $filePath, 'link' => true, 'type'=>isset($request_data->type) && $request_data->type != 'pan_card' ? $request_data->type : 'pan_card'];
                if(isset($request_data->id) && $request_data->id > 0){
                    $fetch = ConsumerApplication::where('id', $request_data->id)->first(['purpose']);
                    if($fetch->purpose != 3){
                        if(isset($request_data->id) && $request_data->id > 0){
                            $ocrDataSettings['id'] =  $request_data->id;
                        }
                        $request = new Request($ocrDataSettings);
                        $ocrdata = (new OCRRecognition($request))->get();
                    }else{
                        if($request_data->type == 'pan_card'){
                            $ocrdata = array('date' => '', 'father' => "", 'name' => "", "pan_no" => "", 'document' => "");
                        }else{
                            $ocrdata = [
                                'aadhaar' =>  "",
                                'address' =>  "",
                                'city' =>  "",
                                'dob' =>  "",
                                'document' =>  "",
                                'father' =>  "",
                                'gender' =>  "",
                                'name' =>  "",
                                'pin' =>  "",
                                'state' =>  "",
                            ];
                        }
                    }
                }
            }
            if(isset($ocrdata['date']) && $ocrdata['date'] != ""){
                $dobarray = explode('/',$ocrdata['date']);
                $year = $dobarray[2];
                $month = $dobarray[1];
                $day = $dobarray[0];
                $ocrdata['date'] = date('Y-m-d',strtotime($year.'-'.$month.'-'.$day));
            }
            if(isset($ocrdata) && $ocrdata != "") {
                $data = array();
                $data['status']  = 'OK';
                $data['ocrdata'] = $ocrdata;
                $extension = explode('.', $filePath);
                $ext = '.' . $extension[count($extension) - 1];
                $application_id= isset($request_data->id) ? $request_data->id : 0;
                $data['$filePath'] = $filePath;
                $data['$ext'] = $ext;
                $data['$application_id'] = $application_id;
                $data['$ocrdata[imageUrl]'] = isset($ocrdata['imageUrl']) ? $ocrdata['imageUrl'] : '';



                if (isset($ocrdata['imageUrl'])){
                    if(isset($filePath)){
                        $extension = explode('.', $filePath);
                        $ext = $extension[count($extension) - 1];
                    }else{
                        $ext = '.jpeg';
                    }
                    $masked = true;
                    $document = new ConsumerDocument(new Request());
                    $document->uploadToS3('aadhar_card', $application_id, file_get_contents($ocrdata['imageUrl']), $ext, $masked);
                }else{
                    $this->uploadDocument($this->request);
                }
                return $data;
            }
        }
        $data = array();
        $data['status']  = 'FAIL';
        $data['message'] = 'Unable to read the file';
        return $data;
    }

    public function loanDetails($request_data){
        $user = (object)$this->request->request->get('user');
        $message = '';
        $name = isset($request_data->name) ? $request_data->name : '';
        $mobile_number = isset($request_data->mobile_number) ? $request_data->mobile_number : '';
        $email = isset($request_data->email) ? $request_data->email : '';
        $loan_type = isset($request_data->loan_type) ? $request_data->loan_type : '';
        $unique_id_number = isset($request_data->unique_id_number) ? $request_data->unique_id_number : '';
        $preferred_language = isset($request_data->preferred_language) ? $request_data->preferred_language : '';
        $reason = isset($request_data->reason) ? $request_data->reason : '';
        $other_reason = isset($request_data->other_reason) ? $request_data->other_reason : '';
        $product_name = isset($request_data->product_id) ? $request_data->product_id : '';
        $other_product = isset($request_data->other_product_name) ? $request_data->other_product_name : '';
        $duration_year = isset($request_data->duration_year) ? $request_data->duration_year : '';
        $duration_month = isset($request_data->duration_month) ? $request_data->duration_month : '';

        $duration = $duration_month.'|'.$duration_year;

        if($request_data->loan_type === 3){
            if(env('APP_CONNECTION') == 0) {
                $merchant_id = 21;
            }else{
                $merchant_id = 21;
            }
        }else{
            $merchant_id = (isset($request_data->merchant_id) && $request_data->merchant_id != "") ? $request_data->merchant_id : '';
        }

        $loan_amount = isset($request_data->loan_amount) ? $request_data->loan_amount : '';
        $loan_amount = str_replace('₹', '', $loan_amount);
        $loan_amount = trim(preg_replace('/[^\p{L}\p{N}\s]/u', '', $loan_amount));
        $offer = isset($request_data->offer) ? $request_data->offer : '';

        $application_id = isset($request_data->application_id) ? $request_data->application_id : 0;

        if($loan_type === ''){
            $message = 'Please select your loan type';
        } else if($loan_type !== 3 && $merchant_id === ''){
            $message = 'Please select your Merchant';
        } else if($loan_amount === '' || $loan_amount < 10000 || $loan_amount > 2000000 ){
            $message = 'Please enter your loan amount between 10,000 and 20,00,000';
        } else if($offer === ''){
            $message = 'Please select your choice offer';
        }

        $apiController = new MerchantApiController();

        if($application_id == 0) {
            if ($errorCode = (new ApiController())->checkEligibility(new Request
            (['email' => isset($request_data->email) ? $request_data->email : '', 'mobile_number' => $mobile_number]))) {
                $msg = 'It seems like it has been less than 3 months since you applied to Credit Fair . We\'ll be happy to serve you after ' . $apiController->getRemainingMonths($errorCode) . ' Month';
                return ['status' => static::$FAIL, 'message' => $msg];
            }
        }


        $isCreate = false;
        if($message !== ""){
            return ['status' => static::$FAIL, 'message' => $message];
        } else{

            if($application_id) {
                $loanDetails = ConsumerApplication::find($application_id);
                $consumerElement = ConsumerApplicationElement::where('application_id',$application_id)->first();
            }else{
                $loanDetails = new ConsumerApplication();
                $element = new ConsumerApplicationElement();
                $status = 'incomplete form';
                $isCreate = true;
            }

            $merchant_offer = MerchantOffers::find($offer);

            /*if($merchant_id == 5803){
                $loan_amount = 10000;
            }*/

            $loanDetails->fill([
//                'loan_type' => $loan_type,
                'name' => $name,
                'email' => $email,
                'mobile_number' => $mobile_number,
                'user_id' => $user->id,
                'lender_id' => 2,
                'merchant_id' => $merchant_id,
                'purpose' => $loan_type,
                'loan_amount' => $loan_amount,
                'offer_id' => $offer,
                'tenure' => $merchant_offer->tenure,
                'state' => isset($loanDetails->state) ? $loanDetails->state : (isset($status) ? $status : 'incomplete form'),
                'updated_by' => 'consumer_app',
            ]);
            $loanDetails->save();

            // send communication on incomplete form for new user
            if(!((new ConsumerApplicationController())->isExistingCustomer($loanDetails->id))){
                (new TestingController())->incompleteFormCommunication($loanDetails->id, true);
            }

            if (isset($loanDetails->id)){
                $message = "Dear $name,<br/> We have received your loan application. This is to inform you that we will be doing a Credit Check & will be sending notifications.<br/> Please reach out to us for any issues : 9967235047 - Credit Fair";
                $entity = ['templateid' => '1307166902857989104', 'entityid' => Templates::$entityid];
                if($loanDetails->lender_id == ConsumerApplication::AVANSE_LENDER_ID) {
                    $message = "Dear $name,<br/>We have received your loan application. This is to inform you that a Credit Check will be done by our lending partner, Avanse Financial Services Limited. We will be sending notifications. Please reach out to us for any issues : 9967235047";
                    $entity = ['templateid' => '1207162263328698421', 'entityid' => Templates::$entityid];
                }
                send_sms($mobile_number, [
                    'message' => $message,
                    'templateDetails' => $entity
                ]);
            }

            $reason_for_loan = $other_reason != '' && $reason == 'Other'  ? $other_reason : $reason;
            $selected_product = $other_product != '' && ($product_name == 'Other' || $product_name == '')  ? $other_product : $product_name;

            if(isset($consumerElement)){
                $consumerElement->fill([
                    'application_id' => $application_id,
                    'preferred_language' => $preferred_language,
                    'reason_for_loan' => $reason_for_loan,
                    'product_name' => $selected_product,
                    'unique_id_number' => $unique_id_number,
                    'duration' => $duration,
                ]);
                $consumerElement->save();
            }

            if (isset($element)){

                $customer = $loanDetails->saveCustomer();
                $loanDetails->applicant_id = $customer->applicant_id;
                $loanDetails->co_applicant_id = $customer->co_applicant_id;

                if ($customer->applicant_id) {
                    PWAApplicationForm::sendVerificationEmail($name, $customer->applicant_id);
                }
                if ($customer->co_applicant_id) {
                    PWAApplicationForm::sendVerificationEmail($name, $customer->co_applicant_id);
                }

                $application_id = (isset($loanDetails->id) ? $loanDetails->id : $application_id);

                $consumer_application_controller = new ConsumerApplicationController();
                $is_repeat_applicant = (new ConsumerApplicationController())->isExistingCustomer($application_id, false, ['approved','disbursed','nach registered','closed']) ? 1 : 0;
                if($is_repeat_applicant == 1){
                    $consumer_application_controller->sendslackmessage($application_id, 'form completed', 'Repeat Applicant', '', $user->name);
                }else{
                    $consumer_application_controller->sendslackmessage($application_id, 'form completed', '', '- By Consumer App', $user->name);

                }

                $element->fill([
                    'application_id' => $application_id,
                    'preferred_language' => $preferred_language,
                    'reason_for_loan' => $reason_for_loan,
                    'product_name' => $selected_product,
                    'unique_id_number' => $unique_id_number,
                    'duration' => $duration,
                ]);
                $element->save();

                StatusLogs::insert([
                    'application_id' => $application_id,
                    'user_id' => $user->id,
                    'status' => $status,
                    'created_at' => Carbon::now()->toDateTimeString()
                ]);


                $merchant = Merchant::where('id', $merchant_id)->first();
                $type = 7;
                if($merchant_id == 5026){
                    $type = 8;
                }
                if (strlen($application_id) < $type) {
                    $diff = $type - strlen($application_id);
                    $concatstring = "";
                    for ($i = 0; $i < $diff; $i++) {
                        $concatstring = $concatstring . "0";
                    }
                }
                $consumer_application_id = $merchant->slug . $concatstring . $application_id;
                $proforma = ProFormaInvoice::where('application_id', $application_id)->first();
                if (!isset($proforma->id)) {
                    $consumer_application_controller = new ConsumerApplicationController();
                    $consumer_application_controller->updateProforma($application_id);
                }else{
                    $proformaObj = ProFormaInvoice::find($proforma->id);
                    $proformaObj->loan_application_no = $consumer_application_id;
                    $proformaObj->save();
                }


                $loanDetails->save();
            }

            $_application_id = isset($loanDetails->id) ? $loanDetails->id : $application_id;

            $this->userAttributionUpdate($user, $_application_id);
            if(isset($isCreate) && $isCreate){
                $consumer_application_controller = isset($consumer_application_controller) ? $consumer_application_controller : new ConsumerApplicationController();
                $consumer_application_controller->sendMessageOnWhatsApp($_application_id, 'customer');
            }
            //$data = ConsumerApplication::where('user_id', $user->id)->orderBy('created_at','desc')->first(['id']);

            return ['status' => static::$OK, 'message' => 'Step-1 Application Successful', 'data' => ['id' => $_application_id]];
        }
    }

    public function identityDetails($request_data){
        if ($request_data != "") {
            $message = '';
            $current_addr = $current_state = $current_city = $current_landmark = $current_pincode =
            $permanent_addr = $permanent_state = $permanent_city = $permanent_landmark = $permanent_pincode = '';

            $application_id = isset($request_data->application_id) ? $request_data->application_id : 0;
            $name = isset($request_data->name) ? $request_data->name : '';
            $email = isset($request_data->email) ? $request_data->email : '';
            $gender = isset($request_data->gender) ? $request_data->gender : '';

            $pan_card = isset($request_data->pan) ? trim(strtoupper($request_data->pan)) : '';
            $deleted_app = ConsumerApplication::where('id', $application_id)->first();
            $dob = '';
            if(empty($deleted_app->pan_card) || $deleted_app->pan_card !== $pan_card){
                if ($errorCode = (new ApiController())->checkEligibility(new Request(['pan' => $pan_card]))) {
                    $msg = 'Cannot process your loan application as it has been less than 3 months since you last applied.';
                    if($deleted_app && $deleted_app->is_deleted != 1){
                        ConsumerApplication::with('merchant')->where('id', $application_id)->update(['is_deleted' => 1]);
                    (new Slack(new Request(['title' => 'Duplicate Loan application deleted (Less than 3 months)', 'fields' => ['Customer name' => $name, 'Merchant name' => $deleted_app->merchant->merchant_name, 'Loan Amount' => $deleted_app->loan_amount ], 'group' => Slack::$APPLICATIONS_THROUGH_CONSUMER_APP])))->send();
                    }

                    return ['status' => static::$FAIL, 'message' => $msg];
                }
            }

            if (isset($request_data->dob) && strpos($request_data->dob, 'NaN') === false){
                try {
                    $dob = isset($request_data->dob) ? Carbon::createFromFormat('d/m/Y', $request_data->dob)->toDateString() : '';
                    $age = $today->diffInYears($dob);
                    if ($age > 65) {
                        $message = 'Applicants over 65 years are ineligible for loans. Please change the applicant.';
                    }
                }catch (\Exception $e){
                    $dob = isset($request_data->dob) ? Carbon::parse($request_data->dob)->toDateString() : '';
                }
            }else{
                $message = 'Please check your Date of birth';
            }

            $flat = isset($request_data->flat_building) ? $request_data->flat_building : '';
            $landmark = isset($request_data->landmark) ? $request_data->landmark : '';
            $city = isset($request_data->city) ? $request_data->city : '';
            $state = isset($request_data->state_name) ? $request_data->state_name : '';
            $pincode = isset($request_data->pincode) ? $request_data->pincode : '';
            $addr_type = isset($request_data->addr_type) ? $request_data->addr_type : '';
            $addr = isset($request_data->current_addr) ? $request_data->current_addr : '';
            $curr_flat = isset($request_data->curr_flat) ? $request_data->curr_flat : '';
            $curr_landmark = isset($request_data->curr_landmark) ? $request_data->curr_landmark : '';
            $curr_city = isset($request_data->curr_city) ? $request_data->curr_city : '';
            $curr_state = isset($request_data->curr_state_name) ? $request_data->curr_state_name : '';
            $curr_pincode = isset($request_data->curr_pincode) ? $request_data->curr_pincode : '';
            $curr_addr_type = isset($request_data->curr_addr_type) ? $request_data->curr_addr_type : '';


            if( $application_id === ''){
                $message = 'Oops! Something went wrong';
            }else if( $name === ''){
                $message = 'Please enter your first name';
//            } else if( $email === ''){
//                $message = 'Please enter your email';
            } elseif($gender === ''){
                $message = 'Please select your gender';
            } else if($pan_card === '' || PWAApplicationForm::pan_format_validation($pan_card) != "Valid"){
                $message = 'Please enter a valid PAN Card details';
            } else if($dob === ''){
                $message = 'Please enter your Date of Birth';
            } else if($flat === ''){
                $message = 'Please enter your Flat and Building name';
            } else if($landmark === ''){
                $message = 'Please enter a Landmark to your address';
            } else if($city === ''){
                $message = 'Please enter the city you live in';
            } else if($state === ''){
                $message = 'Please enter the your State';
            } else if($pincode === '' ||  strlen($pincode) < 6 || strlen($pincode) > 6 ){
                $message = 'Please enter a valid pincode';
            } else if($addr_type === ''){
                $message = 'Please select your Address type';
            } else if($addr === ''){
                $message = 'Is this where you currently live?';
            }

            if($message !== ''){
                return ['status' => static::$FAIL, 'message' => $message];
            } else{
                if($addr === 'yes'){
//                    $permanent_addr = $current_addr = $flat.', '.$landmark.', '.$city.', '.$state.', '.$pincode;
                    $permanent_addr = $current_addr = $flat;
                    $permanent_state = $current_state = $state;
                    $permanent_city = $current_city = $city;
                    $permanent_landmark = $current_landmark = $landmark;
                    $permanent_pincode = $current_pincode = $pincode;
                    $permanent_addrType = $current_addrType = $addr_type;
                } else{
//                    $permanent_addr = $flat.', '.$landmark.', '.$city.', '.$state.', '.$pincode;
                    $permanent_addr = $flat;
                    $permanent_state = $state;
                    $permanent_city = $city;
                    $permanent_landmark = $landmark;
                    $permanent_pincode = $pincode;
                    $permanent_addrType = $addr_type;
                    $current_addr = $curr_flat;
                    $current_state = $curr_state;
                    $current_city = $curr_city;
                    $current_landmark = $curr_landmark;
                    $current_pincode = $curr_pincode;
                    $current_addrType = $curr_addr_type;
                }

                $identityDetails = [
                    'name' => $name,
//                    'email' => $email,
                    'gender' => $gender,
                    'pan_card' => wall_encrypt($pan_card),
                    'dob' => $dob,
                    'updated_by' => 'consumer_app',
                    'permanent_address_line_1' => $permanent_addr,
                    'permanent_address_state' => $permanent_state,
                    'permanent_address_city' => $permanent_city,
                    'permanent_address_landmark' => $permanent_landmark,
                    'permanent_address_pincode' => $permanent_pincode,
                    'permanent_address_status' => $permanent_addrType,
                    'current_address_line_1' => $current_addr,
                    'current_address_state' => $current_state,
                    'current_address_city' => $current_city,
                    'current_address_landmark' => $current_landmark,
                    'current_address_pincode' => $current_pincode,
                    'current_address_status' => $current_addrType,
                    'is_deleted' => null,
                ];

                ConsumerApplication::where('id', $application_id)->update($identityDetails);

                $nonServiceable = false;
                if(isset($deleted_app->purpose) && $deleted_app->purpose == 3){
                    $dataLists = (new ConsumerApplicationController())->getUnapprovedPincodes($application_id);
                    if ($dataLists['unapproved_pin_codes'] && (!isset($dataLists['approver_data_exist']->id))) {
                        $nonServiceable = true;
                    }
                }

                $data['nonServiceable'] = $nonServiceable;
                $data['approval_status'] = $nonServiceable ? 5 : '';
                $data['message']  = 'Your application was';
                $data['message_1'] = 'as you are not in a serviceable area. We shall inform you when we will be able to service you. You may, however, apply for a loan through our merchant partners.';
                $data['message_2'] = 'If you have any queries please call us on +919967235047 or email us on app@creditfair.in.';

                return ['status' => static::$OK, 'message' => 'Step-2 Application Successful', 'data' => $data ];
            }
        }

        return ['status' => static::$FAIL, 'message' => 'Something went wrong'];
    }

    public function incomeDetails($request_data){
        $message = '';
        $user = (object)$this->request->request->get('user');
        $application_id = isset($request_data->application_id) ? $request_data->application_id : '';
        if(!$application_id || empty($application_id))
        {
            $application = ConsumerApplication::where('user_id', $user->id)->orderBy('id', 'desc')->first(['id']);
            $application_id = $application->id;
        }
        $profession_type = isset($request_data->profession_type) ? $request_data->profession_type : '';
        $monthly_income = isset($request_data->monthly_income) && !empty($request_data->monthly_income) ? $request_data->monthly_income : 0;
        $company_name = isset($request_data->company_name) ? $request_data->company_name : '';
        $company_search_key = isset($request_data->company_search_key) ? $request_data->company_search_key : '';
        $company_type = isset($request_data->company_type) ? $request_data->company_type : null;
        $company_pincode = isset($request_data->company_pincode) ? $request_data->company_pincode : '';

        if($profession_type === ''){
            $message = 'Please select your Profession type';
        } else if($profession_type !== 'UNEMPLOYED' && $monthly_income === ''){
            $message = 'Please enter your Monthly Income';
        } else if($profession_type !== 'UNEMPLOYED' && $company_name === ''){
            $message = 'Please enter the name of your Company';
        } else if($profession_type !== 'UNEMPLOYED' && $company_type === ''){
            $message = 'Please select your Company Type';
        } else if($profession_type !== 'UNEMPLOYED' && ($company_pincode === '' || strlen($company_pincode) > 6 || strlen($company_pincode) < 6)){
            $message = 'Please enter a valid pincode';
//        } else if($profession_type !== 'UNEMPLOYED' && $doi === ''){
//            $message = 'Please select the date of incorporation';
        }

        if($message !== ''){
            return ['status' => static::$FAIL, 'message' => $message];
        } else{

            $isExisting = Company::where('company',$company_search_key)->first(['id']);
            if (isset($isExisting->id)){
                $company_name = $isExisting->id;
            }else{
                if(empty($company_name) && !empty($company_search_key)){
                    $CompanyID = Company::insertGetId([
                        'category' => 'CAT D',
                        'company' => $company_search_key,
                    ]);
                    $company_name = $CompanyID;
                }
            }

            $monthly_income = str_replace(',', '', $monthly_income);
            $monthly_income = trim(preg_replace('/[^\p{L}\p{N}\s]/u', '', $monthly_income));

            $incomeDetails = [
                'employee_status' => $profession_type,
                'monthly_income' => $monthly_income,
                'updated_by' => 'consumer_app',
                'work_address_pincode' => $company_pincode,
                'company_name' => $company_name,
            ];

            ConsumerApplication::where('id', $application_id)->update($incomeDetails);

//            $Checklist = Checklist::where('application_id', $application_id)->first(['id']);
//            if (!isset($Checklist->id)){
//                $Checklist = new Checklist();
//                $Checklist->application_id = $application_id;
//            }
//
//            $Checklist->joining_date = $doi;
//            $Checklist->save();

            $consumer_application = ConsumerApplication::find($application_id);

            $elementDetails = [
//                'industry' => $company_type,
                'profession_type' => $company_type !== '' ? $company_type : null ,
            ];
            ConsumerApplicationElement::where('application_id', $application_id)->update($elementDetails);

            $startDate = strtotime(date('Y-m-d',strtotime('now + 15 days')));
            $endDate = strtotime(date('Y-m-d',strtotime('now + 45 days')));

            $i = 1;
            $arraydate = [5,18];
            $available_dates = array();
            do {
                $newTime = strtotime('+'.$i++.' days',$startDate);
                if(in_array(date('d',$newTime),$arraydate)){
                    array_push($available_dates,date('Y-m-d',$newTime));
                }
            } while ($newTime < $endDate);


            $consumer_application_elements = ConsumerApplicationElement::where('application_id',$application_id)->first();
            if(!isset($consumer_application_elements->id)){
                $consumer_application_elements = new ConsumerApplicationElement();
                $consumer_application_elements->application_id = $application_id;
            }

            $consumer_application_elements->profession_type = $company_type !== '' ? $company_type : null;
            $consumer_application_elements->save();

            try {
                $consumer_application->approved_amount = isset($consumer_application->loan_amount) && $consumer_application->loan_amount ? $consumer_application->loan_amount : 0;
            }catch (\Exception $e){
                $consumer_application->approved_amount = 0;

            }
            $consumer_application->save();
            $request = new Request();
            $application = ConsumerApplication::with('category', 'merchant')->where('id',$application_id)->first();
            $app_id = $application->offer_id;
            $offer = MerchantOffers::where('id',$app_id)->first(['interest_type_id']);
            $emi_date = date('d/m/Y',strtotime($available_dates[0]));
            $testImport = new TestImport(new Request());
            $requestID = $testImport->random_strings(8);
            $request->request->add(
                [
                    'first_emi_date' =>$emi_date,
                    'loan_amount' => $application->approved_amount,
                    'merchant_id' => $application->merchant_id,
                    'category_id' =>$application->category->id,
                    'interest_type_id' => $offer->interest_type_id,
                    'merchant_offer_id' =>$application->offer_id,
                    'request_ap_id' => $requestID
                ]
            );

            $consumerApplicationController = (new ConsumerApplicationController());
            $consumerApplicationController->generateEMI($request, $application, $application_id);
            PWAApplicationForm::generate_score_card($application_id);
            $grade = new GradeController($request);

            if($consumer_application->state == 'incomplete form') {
                $consumer_application->state = "form completed";
                $consumer_application->save();
                try {
                    event(new EventPostFormCompleted($consumer_application->id));
                }catch (\Exception $e){

                }
            }

            if($consumer_application->state == 'incomplete form') {
                StatusLogs::insert([
                    'application_id' => $application_id,
                    'user_id' => $user->id,
                    'status' => 'form completed',
                    'created_at' => Carbon::now()->toDateTimeString()
                ]);
            }



//            $check_approval = $_grade->getOutput();

//            PWAApplicationForm::approvalLog($check_approval, $request_data->application_id, $requestID);

            if($profession_type == "UNEMPLOYED"){

                $grade->initAutoDocumentation($grade, $application_id);

                $data['message'] = 'Your Application for an easy EMI plan is';
                $data['approval_status'] = 2;
                $data['message_1'] = 'Please submit required documents to get a quick decision.';
                $data['message_2'] = 'If you have any queries please call us on +919967235047 or email us on app@creditfair.in.';
                $data['application_id'] = $application_id;
                return ['status' => static::$OK, 'message' => 'Success', 'data' => $data];
            }


            if($grade->autoReject($grade, $application_id, 'consumer')) {
                $data['message'] = 'We regret to inform you that your Easy EMI is';
                $data['approval_status'] = 3;
                $data['message_1'] = 'Thanks for showing interest in Credit Fair, we’d be happy to reconsider you after 3 months. ';
                $data['message_2'] = 'If you have any queries please call us on +919967235047 or email us on app@creditfair.in.';
                $data['application_id'] = $application_id;
                PWAApplicationForm::resetEMIs($application_id);

                return ['status' => static::$OK, 'message' => 'Success', 'data' => $data];
            }

            $_grade = $grade->ApprovalCheck($application_id);

            if ($_grade) {
                $consumer_application->approved_amount = 0;
                $consumer_application->save();
                $consumer_application_elements->is_auto_approved = 1;
                $consumer_application_elements->save();

                $data['message'] = 'Congratulations! Your Easy EMI plan has been ';
                $data['approval_status'] = 1;
                $data['message_1'] = 'Your first EMI date is ';
                $data['date'] = date('d/M/Y',strtotime($available_dates[0]));;
                $data['message_2'] = 'If you have any queries please call us on +919967235047 or email us on app@creditfair.in.';
                $grade->initAutoDocumentation($_grade, $application_id);
                $data['application_id'] = $application_id;

                return ['status' => static::$OK, 'message' => 'Success', 'data' => $data];
            }else if($preApprovalID = $grade->pre_approvalCheck($_grade, $application_id)){

                $docList = ConsumerApplicationElement::where('application_id', $request_data->application_id)->first(['pre_approval_id']);

                $data['approval_status'] = 4;
                $data['message'] = 'Congratulations! Your Easy EMI plan has been ';
                $return_message = 'Congratulations! Your Easy EMI plan has been ';
                $data['message_1'] = 'Up to Rs.'.$consumer_application->loan_amount.'subject to additional documents';
                $data['message_2'] = 'If you have any queries please call us on +919967235047 or email us on app@creditfair.in.';
//                $return_message = 'We are very happy to inform you that your application for an Easy EMI plan has been pre-approved up
//                to Rs.'.$consumer_application->loan_amount.'subject to a few documents';
                $data['application_id'] = $application_id;
                $data['docList'] = $docList->pre_approval_id !==null && $docList->pre_approval_id > 0 ? true : false;
                return ['status' => static::$OK, 'message' => 'Success', 'data' => $data];

            } else{
                $data['approval_status'] = 2;
                $data['message']  = 'Your Application for an easy EMI plan is';
                $data['message_1'] = 'Please submit required documents to get a quick decision.';
                $data['message_2'] = 'If you have any queries please call us on +919967235047 or email us on app@creditfair.in.';
                $data['application_id'] = $application_id;
                $consumer_application = ConsumerApplication::find($request_data->application_id);
                $elementData = ConsumerApplicationElement::where('application_id', $request_data->application_id)->first(['auto_document_rule_id']);
                if(!$elementData || !$elementData->auto_document_rule_id){
                    $grade->initAutoDocumentation($_grade, $request_data->application_id);
                }
                $consumer_application->approved_amount = 0;
                $consumer_application->save();
                $docList = ConsumerApplicationElement::where('application_id', $request_data->application_id)->first(['auto_document_rule_id']);
                PWAApplicationForm::resetEMIs($application_id);
                $data['docList'] = $docList->auto_document_rule_id !==null && $docList->auto_document_rule_id > 0 ? true : false;

                return ['status' => static::$OK, 'message' => 'Success', 'data' => $data];
            }


            return ['status' => static::$OK, 'message' => 'Step-3 Application Successful'];
        }
        return ['status' => static::$FAIL, 'message' => 'Something went wrong'];
    }

//    Application Form Edit
    public function edit(){
        $user = $this->request->request->get('user');
        if ($user != "") {
            $consumer_application = ConsumerApplication::with('creditReport','application_element', 'merchant', 'Checklist','emi', 'products', 'documents')
                ->where('user_id', $user['id'])->whereNotIn('state', ['disbursed','nach registered','aborted','rejected','closed','cancelled'])
                ->orderBy('created_at', 'desc')->first();

            $old_consumer_application = ConsumerApplication::with('application_element', 'merchant', 'Checklist','emi', 'products')
                ->where('user_id', $user['id'])->whereIn('state', ['disbursed','nach registered','aborted','rejected','closed','cancelled'])
                ->whereNull('is_deleted')->orderBy('created_at', 'desc')->first();


            $consumer_application_files = ConsumerApplicationFiles::where('consumer_application_id', isset($consumer_application->id) ? $consumer_application->id : '')
                ->whereIn('file_type', ['bank_statement', 'utility_bill'])->whereNull('deleted_at')->orderBy('created_at', 'asc')->get();

            $old_consumer_application_files = ConsumerApplicationFiles::where('consumer_application_id', isset($old_consumer_application->id) ? $old_consumer_application->id : '')
                ->whereIn('file_type', ['bank_statement', 'utility_bill'])->whereNull('deleted_at')->orderBy('created_at', 'asc')->get();

            $reason = '';
            $other_reason = '';
            if(isset($consumer_application->application_element->reason_for_loan)){
                if(in_array($consumer_application->application_element->reason_for_loan, static::$reason)){
                    $reason = $consumer_application->application_element->reason_for_loan;
                } else{
                    $other_reason = $consumer_application->application_element->reason_for_loan;
                    $reason = 'Other';
                }
            }

            $product = '';
            $other_product_name = '';
            $products = [];
            if(isset($consumer_application->products) && $consumer_application->products) {
                foreach ($consumer_application->products as $prod) {
                    $products[] = $prod->id;
                }
            }
            if(isset($consumer_application->application_element->product_name)){
                if(in_array($consumer_application->application_element->product_name, $products)){
                    $product = $consumer_application->application_element->product_name;
                } else{
                    $other_product_name = $consumer_application->application_element->product_name;
                    $product = 'Other';
                }
            }

            if(isset($consumer_application) || isset($old_consumer_application)){
                if(
                    (
                        (isset($consumer_application->permanent_address_line_1) && isset($consumer_application->current_address_line_1) && $consumer_application->permanent_address_line_1 === $consumer_application->current_address_line_1) ||
                        (isset($old_consumer_application->permanent_address_line_1) && isset($old_consumer_application->current_address_line_1) && $old_consumer_application->permanent_address_line_1 === $old_consumer_application->current_address_line_1)
                    ) || (
                        (isset($old_consumer_application->permanent_address_landmark) && isset($old_consumer_application->current_address_landmark) && $old_consumer_application->permanent_address_landmark === $old_consumer_application->current_address_landmark) ||
                        (isset($old_consumer_application->permanent_address_landmark) && isset($old_consumer_application->current_address_landmark) && $old_consumer_application->permanent_address_landmark === $old_consumer_application->current_address_landmark)
                    )
                ) {
                    $currentAddress = true;
                }
            }


            $disableName = false;
            $disablePanNumber = false;
            $disableCoName = false;
            $disableCoPanNumber = false;
            if(isset($consumer_application->creditReport)){
                if(count($consumer_application->creditReport) > 1 || (count($consumer_application->creditReport) == 1 && $consumer_application->creditReport[0]->applicant_type == 1)) {
                    if (!empty($consumer_application->name)) {
                        $disableName = true;
                    }
                    if (!empty($consumer_application->pan_card)) {
                        $disablePanNumber = true;
                    }
                }
                if(count($consumer_application->creditReport) > 1 || (count($consumer_application->creditReport) == 1 && $consumer_application->creditReport[0]->applicant_type == 2)) {
                    if (!empty($consumer_application->co_applicant_name)) {
                        $disableCoName = true;
                    }
                    if (!empty($consumer_application->co_applicant_pan_card)) {
                        $disableCoPanNumber = true;
                    }
                }
            }

        //  Loan details data

            $identification_details['disableName'] = $disableName;
            $identification_details['disablePanNumber'] = $disablePanNumber;
            $identification_details['disableCoName'] = $disableCoName;
            $identification_details['disableCoPanNumber'] = $disableCoPanNumber;

            if(isset($consumer_application->application_element->duration)){
                $duration = explode('|', $consumer_application->application_element->duration);
            }

            if (isset($consumer_application->merchant_id) && $consumer_application->merchant_id) {
                $products = Products::where('merchant_id', $consumer_application->merchant_id)->whereNull('deleted_at')->get();
                foreach ($products as $prod) {
                    $offers = ProductOffers::where('product_id', $prod->id)->whereNull('deleted_at')->get();
                    if (count($offers) > 0) {
                        $product_list[] = $prod;
                    }
                }
            }

            $loanDetails['name'] = isset($consumer_application->name) ? $consumer_application->name : (isset($old_consumer_application->name) ? $old_consumer_application->name : '');
            $loanDetails['mobile_number'] = isset($consumer_application->mobile_number) ? $consumer_application->mobile_number : (isset($old_consumer_application->mobile_number) ? $old_consumer_application->mobile_number : '');
            $loanDetails['email'] = isset($consumer_application->email) ? $consumer_application->email : (isset($old_consumer_application->email) ? $old_consumer_application->email : '');
            $loanDetails['loan_type'] = isset($consumer_application->purpose) ? $consumer_application->purpose : '';
            $loanDetails['loan_amount'] = isset($consumer_application->loan_amount) ? preg_replace('/[^\p{L}\p{N}\s]/u', '', $consumer_application->loan_amount) : '';
            $loanDetails['merchant_id'] = isset($consumer_application->merchant_id) ? $consumer_application->merchant_id : '';
            $loanDetails['preferred_language'] = isset($consumer_application->application_element->preferred_language) ? $consumer_application->application_element->preferred_language : (isset($old_consumer_application->application_element->preferred_language) ? $old_consumer_application->application_element->preferred_language : '');
            $loanDetails['unique_id_number'] = isset($consumer_application->application_element->unique_id_number) ? $consumer_application->application_element->unique_id_number : '';
            $loanDetails['reason'] = $reason;
            $loanDetails['product_id'] = $product;
            $loanDetails['other_reason'] = $other_reason;
            $loanDetails['other_product_name'] = $other_product_name;
            $loanDetails['duration_year'] =  isset($duration[1]) ? $duration[1] : '';
            $loanDetails['duration_month'] = isset($duration[0]) ? $duration[0] : '';
            $loanDetails['merchant_name'] = (isset($consumer_application->merchant->merchant_name)) ? $consumer_application->merchant->merchant_name : "";
            $loanDetails['offer'] = isset($consumer_application->offer_id) ? $consumer_application->offer_id : '';
            $loanDetails['merchant_list'] = $this->getMerchantAndProducts($loanDetails['loan_type']);
            $loanDetails['product_list'] = isset($product_list) ? $product_list : '';


        //  Identity details data
            $identityDetails['name'] = isset($consumer_application->name) ? $consumer_application->name : (isset($old_consumer_application->name) ? $old_consumer_application->name : '');
            $identityDetails['pan'] = isset($consumer_application->pan_card) ? $consumer_application->pan_card : (isset($old_consumer_application->pan_card) ? $old_consumer_application->pan_card : '');
            $identityDetails['dob'] = isset($consumer_application->dob) ? date('d/m/Y', strtotime($consumer_application->dob)) : (isset($old_consumer_application->dob) ? date('d/m/Y', strtotime($old_consumer_application->dob)) : '');
            $identityDetails['gender'] = isset($consumer_application->gender) ? $consumer_application->gender : (isset($old_consumer_application->gender) ? $old_consumer_application->gender : '');
            $identityDetails['flat_building'] = isset($consumer_application->permanent_address_line_1) ? $consumer_application->permanent_address_line_1 : (isset($old_consumer_application->permanent_address_line_1) ? $old_consumer_application->permanent_address_line_1 : '');
            $identityDetails['landmark'] = isset($consumer_application->permanent_address_landmark) ? $consumer_application->permanent_address_landmark : (isset($old_consumer_application->permanent_address_landmark) ? $old_consumer_application->permanent_address_landmark : '');
            $identityDetails['city'] = isset($consumer_application->permanent_address_city) ? $consumer_application->permanent_address_city : (isset($old_consumer_application->permanent_address_city) ? $old_consumer_application->permanent_address_city : '');
            $identityDetails['state_name'] = isset($consumer_application->permanent_address_state) ? $consumer_application->permanent_address_state : (isset($old_consumer_application->permanent_address_state) ? $old_consumer_application->permanent_address_state : '');
            $identityDetails['pincode'] = isset($consumer_application->permanent_address_pincode) ? $consumer_application->permanent_address_pincode : (isset($old_consumer_application->permanent_address_pincode) ? $old_consumer_application->permanent_address_pincode : '');
            $identityDetails['addr_type'] = isset($consumer_application->permanent_address_status) ? $consumer_application->permanent_address_status : (isset($old_consumer_application->permanent_address_status) ? $old_consumer_application->permanent_address_status : '');
            $identityDetails['current_addr'] = isset($currentAddress) && $currentAddress ? 'yes' : 'no';
            $identityDetails['curr_flat'] = isset($consumer_application->current_address_line_1) ? $consumer_application->current_address_line_1 : (isset($old_consumer_application->current_address_line_1) ? $old_consumer_application->current_address_line_1 : '');
            $identityDetails['curr_landmark'] = isset($consumer_application->current_address_landmark) ? $consumer_application->current_address_landmark : (isset($old_consumer_application->current_address_landmark) ? $old_consumer_application->current_address_landmark : '');
            $identityDetails['curr_city'] = isset($consumer_application->current_address_city) ? $consumer_application->current_address_city : (isset($old_consumer_application->current_address_city) ? $old_consumer_application->current_address_city : '');
            $identityDetails['curr_state_name'] = isset($consumer_application->current_address_state) ? $consumer_application->current_address_state : (isset($old_consumer_application->current_address_state) ? $old_consumer_application->current_address_state : '');
            $identityDetails['curr_pincode'] = isset($consumer_application->current_address_pincode) ? $consumer_application->current_address_pincode : (isset($old_consumer_application->current_address_pincode) ? $old_consumer_application->current_address_pincode : '');
            $identityDetails['curr_addr_type'] = isset($consumer_application->current_address_status) ? $consumer_application->current_address_status : (isset($old_consumer_application->current_address_status) ? $old_consumer_application->current_address_status : '');

        //  Income details data
            if(isset($consumer_application->company_name) || isset($old_consumer_application->company_name)){
                $company = Company::where('id', isset($consumer_application->company_name) ? $consumer_application->company_name : $old_consumer_application->company_name)->first();
                if (isset($company->company)) {
                    $company_details = $company->company;
                }else{
                    $company_details = isset($consumer_application->company_name) ? $consumer_application->company_name : $old_consumer_application->company_name;
                }
            }

            $incomeDetails['profession_type'] = isset($consumer_application->employee_status) ? $consumer_application->employee_status : (isset($old_consumer_application->employee_status) ? $old_consumer_application->employee_status : '');
            $incomeDetails['monthly_income'] = isset($consumer_application->monthly_income) ? $consumer_application->monthly_income : (isset($old_consumer_application->monthly_income) ? $old_consumer_application->monthly_income : '');
            $incomeDetails['company_search_key'] = isset($company_details) ? $company_details : '';
            $incomeDetails['company_type'] = isset($consumer_application->application_element->profession_type) ? $consumer_application->application_element->profession_type : (isset($old_consumer_application->application_element->profession_type) ? $old_consumer_application->application_element->profession_type : '');
            $incomeDetails['company_pincode'] = isset($consumer_application->work_address_pincode) ? $consumer_application->work_address_pincode : (isset($old_consumer_application->work_address_pincode) ? $old_consumer_application->work_address_pincode : '');
            $incomeDetails['date_of_incorporation'] = (isset($consumer_application->Checklist->joining_date) && $consumer_application->Checklist->joining_date) ? date('d/m/Y', strtotime($consumer_application->Checklist->joining_date)) : ((isset($old_consumer_application->Checklist->joining_date) && $old_consumer_application->Checklist->joining_date) ? date('d/m/Y', strtotime($old_consumer_application->Checklist->joining_date)): '');

//            $approval_status = $consumer_application->state;date('d/m/Y', strtotime($consumer_application->dob));
//            if($approval_status == 'incomplete form'){
//                if(($consumer_application->pan_card != null || $consumer_application->pan_card != '') && ($consumer_application->permanent_address_state != null || $consumer_application->permanent_address_state != '')){
//                    $page = '2/4';
//                }else{
//                    $page = '1/4';
//                }
//            } else{
//                if (isset($consumer_application_files[0]) && isset($consumer_application_files[0]->id)) {
//                    $page = '4/4';
//                }else{
//                    $page = '3/4';
//                }
//            }

            if(isset($consumer_application)) {
                if (isset($consumer_application_files[0]) && isset($consumer_application_files[0]->id) && empty($consumer_application->is_deleted)) {
                    $page = '4/4';
                } else if ($consumer_application->employee_status != null && empty($consumer_application->is_deleted)) {
                    $page = '3/4';
                } else if (($consumer_application->pan_card != null || $consumer_application->pan_card != '') && ($consumer_application->permanent_address_state != null || $consumer_application->permanent_address_state != '') && empty($consumer_application->is_deleted)) {
                    $page = '2/4';
                } else {
                    $page = '1/4';
                }
            }

            $approvalMessage = isset($item) ? $this->getApprovalMessage($consumer_application) : '';
            $application_data = array(
                'id' => isset($consumer_application->id) ? $consumer_application->id : '',
                'application_state'=> isset($page) ? $page : null,
                'loan_details' => $loanDetails,
                'identity_details' =>  $identityDetails,
                'income_details' => $incomeDetails,
                'current_status' => isset($consumer_application->state) ? $consumer_application->state : '',
                'approval_status' => isset($approvalMessage['approval_status']) ? $approvalMessage['approval_status'] : '',
            );

            return ['status' => static::$OK, 'message' => 'Success', 'data' => $application_data];
        }

        return ['status' => static::$FAIL, 'message' => 'No Data Found'];
    }

    public function getAccountStatement($id){
        $frontController = new FrontController();
        return $frontController->getStatement($id, 2);
    }

//    Payments Page -
// disbursement date, category name, paid emis in words, foreclosuer amoutn, last paymetn [amount, mode, payment_date]
    public function getPaymentsDetails(){
        $user = $this->request->request->get('user');

        if($user) {
            $applications = ConsumerApplication::where('user_id', $user['id'])->whereIn('state',['disbursed','nach registered'])->whereNull('is_deleted')->orderBy('updated_at', 'desc')->get();
            $payment_data = [];

            if(count($applications)) {
                foreach ($applications as $appl) {
                    $frontController = new FrontController();
                    $payment_data[] = $frontController->getPayments($appl->id);
                }
                $data['app_exist'] = true;
                $data['payment_details'] = $payment_data;
                return ['status' => static::$OK, 'message' => 'Success', 'data' => $data, 'statusCode' => 'CF200'];

            } else {
                $data['app_exist'] = false;
                $data['payment_details'] = $payment_data;
                return ['status' => static::$OK, 'message' => 'Success', 'data' => $data, 'statusCode' => 'CF200'];
            }
        }


        return ['status' => static::$FAIL, 'message' => 'Something went wrong', 'statusCode' => 'CF300'];
    }

    public function generateEquifax(){
        $request_data = $this->request->request->get('data');

        if(env('APP_CONNECTION') != 0) {
            $applicationId = $request_data->application_id;
            if(!$applicationId || empty($applicationId)) {
                $user = (object)$this->request->request->get('user');
                $consumer_application = ConsumerApplication::where('user_id', $user->id)->orderBy('id', 'desc')->first(['id']);
                $applicationId = $consumer_application->id;
            }
            $applicationController = new ConsumerApplicationController();
            if ((new MerchantApiController())->setTestEquifaxReport($applicationId) && $this->isEquifaxRequired($applicationId, $applicationController)) {
                $applicationController->isRoot = false;
                $report = $applicationController->generateSoftBureauReport($applicationId);
                return $report;
            }
        }

        return ['status' => static::$OK, 'message' => 'Staging Application'];
    }

    public function isEquifaxRequired($id, ConsumerApplicationController $applicationController){
        $application = ConsumerApplication::where('id',$id)->where('merchant_id', 21)->first();
        if(isset($application->id)) {
            $dataLists = $applicationController->getUnapprovedPincodes($application);
            if ($dataLists['unapproved_pin_codes'] && !isset($dataLists['approver_data_exist']->id)) {
                return false;
            }
        }

        return true;
    }

    public function payNow(){
        $request_data = $this->request;

        $hashids = new Hashids('Creditfair by CS', 20);
        $id =  $hashids->decode($request_data->application_id);
        $application_id = $id[0];

        $application = ConsumerApplication::where('id', $application_id)->first(['id','lender_id']);
        $data = (new FrontController())->getPaymentData($application_id);

        $razorpaydata['amount'] = $data['total_pending_til_date'];
        $razorpaydata['email'] = "";
        $razorpaydata['lender_id'] = isset($data['lender_id']) ? $data['lender_id'] : (isset($application->lender_id) ? $application->lender_id : '');
        $razorpaydata['id'] = $application_id;
        $razorpaydata['purpose'] = 'emi';
        $razorpaydata['emi_date'] = $data['emi_date'];
        $razorpaydata['custom_date'] = Carbon::now()->toDateString();
        try{
            $rajorpay_link = (new ConsumerApplicationController())->getrazorpaylink($razorpaydata);

            $data['pay_now_link'] = $rajorpay_link;
            return ['status' => static::$OK, 'message' => 'Sucess', 'data' => $data, 'statusCode' => 'CF200'];
        } catch (\Exception $exception){
            return ['status' => static::$FAIL, 'message' => 'No Dues Pending!', 'statusCode' => 'CF300'];
        }
    }

//    Application Decision Status
    public function getDecision(){

    }

    public function getExtension($name){
        $paths = explode('.',$name);
        try {
            return isset($paths[count($paths) - 1]) ? '.'.$paths[count($paths) - 1] : '.jpeg';;
        }catch (\Exception $e){
            return isset(explode('.',$name)[1]) ? '.'.explode('.',$name)[1] : '.jpeg';
        }
    }

    public function getFileName($key, $request_data){
        $file_type_array = explode("|", $key);
        $files_type = str_replace("|0", " ", $key);
        $files_type = explode("|", $files_type);
        if (isset($files_type[1])) {
            $imageInfo = json_decode(urldecode($files_type[1]));
        }
        $files_type = isset($files_type[0]) ? $files_type[0] : str_replace("|", " ", $files_type);
        $password_label = $file_type_array[0] . "_password";
        $password = isset($request_data->$password_label) ? $request_data->$password_label : "";
        if (strtolower(trim($files_type)) == 'document') {
            $files_type = 'aadhar_card';
        }

        if (isset($imageInfo->doc_name)){
            $files_type = $imageInfo->doc_name;
        }
        return ['files_type' => $files_type, 'password' => $password, 'imageInfo' => isset($imageInfo) ? $imageInfo : ''];
    }

    public function uploadDocument(Request $request){

        try {
            $request_data = $request->request->get('data');
            $documents = $request->has('documents') ? $request->get('documents') : $request->request->get('documents');

            $application_id = $request_data && isset($request_data->application_id) ? $request_data->application_id : (isset($request_data->id) ? $request_data->id : '');

            $nameLists = [];
            $response_array = [];
            if(isset($documents) && $documents) {
                foreach ($documents as $_file) {
                    foreach (json_decode($_file) as $key => $file) {

                        $fileProperties = $this->getFileName($key, $request_data);
                        $password = $fileProperties['password'];
                        $imageInfo = $fileProperties['imageInfo'];

                        $_files_type = $files_type = $fileProperties['files_type'];
                        if ($nameLists) {
                            if (in_array($files_type, $nameLists)) {
                                $_nameLists = array_count_values($nameLists);
                                if ($_nameLists[$files_type]) {
                                    $files_type = $files_type . ' ' . $_nameLists[$files_type];
                                }
                            }
                        }

                        $nameLists[] = $_files_type;
                        if ($imageInfo) {
                            $path = isset($imageInfo->path) ? $imageInfo->path : ($imageInfo->uri ? $imageInfo->uri : '');
                            $response = PWAApplicationForm::uploadToS3Consumer(strtolower(trim($files_type)), $application_id, base64_decode($file), $this->getExtension($path), $password);
                            $response_array[] = ['filetype' => $files_type, 'status' => $response['status']];
                        }
                    }
                }
            }
            return ['status' => static::$OK, 'message' => 'Documents Upload Successfully', 'doc_response' => $response_array];
        }catch (\Exception $exception){
            return ['status' => static::$FAIL, 'message' => 'Exception occurred while File uploading'];
        }
    }

//    Document Submission
    public function docSubmission(){
        $request_data = (object)$this->request->request->get('data');

        if(isset($request_data)) {
            $message = '';
            $submission_type = isset($request_data->submission_type) ? $request_data->submission_type : '';
            $courier_company = isset($request_data->courier_company) ? $request_data->courier_company : '';
            $tracking_id = isset($request_data->tracking_id) ? $request_data->tracking_id : '';
            $pick_up_date = isset($request_data->pick_up_date) ? $request_data->pick_up_date : '';
            $pick_up_time = isset($request_data->pick_up_time) ? $request_data->pick_up_time : '';

            if ($submission_type === 'Courier') {
                if ($courier_company === '') {
                    $message = 'Please select your Merchant';
                } else if ($tracking_id === '') {
                    $message = 'Please enter your courier\'s tracking ID';
                }
            } else if ($submission_type === 'Pick_up') {
                if ($pick_up_date === '') {
                    $message = 'Please select a convenient date for pick-up';
                } else if ($pick_up_time === '') {
                    $message = 'Please select a convenient time for pick-up';
                }
            }

            if ($message !== "") {
                return ['status' => static::$FAIL, 'message' => $message];
            } else {

                $courier_details = '';

                if ($submission_type == 'Courier') {
                    $courier_details->fill([
                        'courier_company' => $courier_company,
                        'tracking_id' => $tracking_id
                    ]);
                } else if ($submission_type == 'Pick_up') {
                    $courier_details->fill([
                        'pick_up_date' => $pick_up_date,
                        'pick_up_time' => $pick_up_time
                    ]);
                }

                $courier_details->save();

                return ['status' => static::$OK, 'message' => 'Successful'];
            }
        }

        return ['status' => static::$FAIL, 'message' => 'Something went wrong'];
    }

    public function updateApprovalDetails(Request $request){
        $request_data = $this->request->request->get('data');
        $user = (object)$this->request->request->get('user');

        $consumer_application = ConsumerApplication::find($request_data->application_id);
        if(!$request_data->application_id || empty($request_data->application_id)) {
            $consumer_application = ConsumerApplication::where('user_id', $user->id)->orderBy('id', 'desc')->first();
        }

        if ($request_data->approval_status == 1) {
            if ($request_data != "") {

                $application = StatusLogs::where('application_id', $consumer_application->id)->where('status', 'approved')->first(['id']);
                if (!isset($application->id)) {
                    $consumer_application_controller = new ConsumerApplicationController();
                    $consumer_application_controller->sendslackmessage($consumer_application->id, 'approved', '', '- By Mobile App', $user->name);
//                    if (1) { //env('APP_CONNECTION') != 0
                        $consumer_application->approved_amount = $consumer_application->loan_amount;
                        $consumer_application->save();

                        $isMultiLenderWhitelisted = $consumer_application_controller->isMultiLender($consumer_application->merchant_id);

                        $currentStatus = 'approved';
                        if ($isMultiLenderWhitelisted > 1){
                            $currentStatus = 'cf approved';
                        }else{
                            $consumer_application_controller->sendSanctionLetter($consumer_application->id);
                            $consumer_application_controller->sendProForma($consumer_application->id);
                            $consumer_application_controller->creditLimitNotification($consumer_application->id);
                            $consumer_application_controller->whatsAppCommunication($consumer_application, 'approved');
                            $consumer_application_controller->ApprovalInit(null, $consumer_application->id, true);
                        }

                        ConsumerApplication::where('id', $consumer_application->id)->update(['state' => $currentStatus]);

                        StatusLogs::insert([
                            'application_id' => $consumer_application->id,
                            'user_id' => 107,
                            'status' => $currentStatus,
                            'created_at' => Carbon::now()->toDateTimeString()
                        ]);

//                    }
                }
                return ['status' => static::$OK, 'message' => 'Successful'];
            }
        }else if ($request_data->approval_status == 3) {
            $application = StatusLogs::where('application_id', $consumer_application->id)->where('status', 'rejected')->first(['id']);
            if (!isset($application->id)) {
                $consumer_application->state = "rejected";
                $consumer_application->approved_amount = 0;
                $consumer_application->save();
                $status = 'rejected';
                StatusLogs::insert([
                    'application_id' => $consumer_application->id,
                    'user_id' => 107,
                    'status' => $status,
                    'created_at' => Carbon::now()->toDateTimeString()
                ]);
            }
            return ['status' => static::$OK, 'message' => 'Successful'];
        }else if ($request_data->approval_status == 5) {
//            $application = StatusLogs::where('application_id', $request_data->application_id)->where('status', 'aborted')->first(['id']);
//            if (!isset($application->id)) {
                $consumer_application->state = "aborted";
                $consumer_application->approved_amount = 0;
                $consumer_application->save();
                $status = 'aborted';
                StatusLogs::insert([
                    'application_id' => $consumer_application->id,
                    'user_id' => 107,
                    'status' => $status,
                    'created_at' => Carbon::now()->toDateTimeString()
                ]);
//            }
            return ['status' => static::$OK, 'message' => 'Successful'];
        }else if ($request_data->approval_status == 4) {
            $application = StatusLogs::where('application_id', $consumer_application->id)->where('status', 'pre approved')->first(['id']);
            if (!isset($application->id)) {
                $grade = new GradeController($request);
//                $_grade = $grade->ApprovalCheck($consumer_application->id);
                $document_rule_id = $grade->initAutoDocumentation($grade, $consumer_application->id, false);
                $consumerApplication = new ConsumerApplicationController();
                $consumerApplication->sendPreApprovalCommunication($consumer_application->id, $document_rule_id);
                $consumer_application->state = "pre approved";
                $consumer_application->save();
                StatusLogs::insert([
                    'application_id' => $consumer_application->id,
                    'user_id' => 107,
                    'status' => 'pre approved',
                    'created_at' => Carbon::now()->toDateTimeString()
                ]);
            }
            return ['status' => static::$OK, 'message' => 'Successful'];
        } else if($request_data->approval_status == ''){
            return ['status' => static::$OK, 'message' => 'Successful'];
        }
        return ['status' => static::$FAIL, 'message' => 'Something went wrong'];
    }


    public function getPendingDocument(Request $request){
        try {
            $user = $this->request->request->get('user');

            $consumer_application = ConsumerApplication::with('application_element', 'merchant', 'Checklist','emi')->where('user_id', $user['id'])
                ->whereNotIn('state', ['disbursed','nach register'])->whereNull('is_deleted')->orderBy('created_at', 'desc')->first();

            $application = ConsumerApplication::with('documents','application_element', 'creditReport', 'foir', 'emi', 'mandate','checkmandate')->where('id', $consumer_application->id)->first();
            $consumerApplicationController = new ConsumerApplicationController();
            $consumerApplicationController->isInternal = true;
            $_docLists = $consumerApplicationController->getOtherRequiredDocument($application);
//            $_docLists = array_map('ucfirst', $_docLists);

            $data = array();
            $data['status'] = 'OK';
            $data['message'] = 'Document list fetched successfully';
            $data['pending'] = count($_docLists) ? true : false;
            $approvalMessage = isset($consumer_application) ? $this->getApprovalMessage( $consumer_application) : '';
            $data['approval_status'] = count($_docLists) > 0 ? 6 : (isset($approvalMessage['approval_status']) ? $approvalMessage['approval_status'] : 7);
            $data['documents'] = $_docLists;
        }catch (\Exception $e){
            $data = array();
            $data['status'] = 'FAIL';
            $data['message'] = 'Please try again later';
        }
        return $data;
    }

    public function checkDocUploaded(){
        try {
            $user = $this->request->request->get('user');

            $consumer_application = ConsumerApplication::with('application_element', 'merchant', 'Checklist','emi')->where('user_id', $user['id'])
                ->whereNotIn('state', ['disbursed','nach register'])->whereNull('is_deleted')->orderBy('created_at', 'desc')->first();

            $consumer_application_files = ConsumerApplicationFiles::where('consumer_application_id', $consumer_application->id)
                ->whereIn('file_type', ['bank_statement', 'utility_bill'])->whereNull('deleted_at')->orderBy('created_at', 'asc')->get();

            $data = array();
            $data['status'] = 'OK';
            $data['message'] = 'Document uploaded';
            $data['doc_uploaded'] = count($consumer_application_files) ? true : false;
        }catch (\Exception $e){

            $data = array();
            $data['status'] = 'FAIL';
            $data['message'] = 'Please try again later';
        }
        return $data;
    }

//  ANDROID API
    public function saveDevice(Request $request){
        $request_data = (object)$this->request->request->get('data');
        if ($request_data != "") {
            $session_string = (isset($request_data->session_string)) ? explode("|", base64_decode($request_data->session_string)) : explode("|", base64_decode($request->get('session_string')));

            $user_id = (isset($session_string[0])) ? $session_string[0] : 0;


            $deviceStatus = Devices::where('user_id',$user_id)
                ->where('manufacturer', $request->get('manufacturer'))
                ->where('app_version', $request->get('version_name'))
                ->where('model', $request->get('model'))
                ->where('product', $request->get('product'))
                ->first(['id']);

            if (!isset($deviceStatus->id)) {
                $device = new Devices();
                $device->user_id = $user_id;
                $device->manufacturer = $request->get('manufacturer');
                $device->app_version = $request->get('version_name');
                $device->version_code = $request->get('version_code');
                $device->sdk_version = $request->get('sdk_version');
                $device->model = $request->get('model');
                $device->brand = $request->get('brand');
                $device->device = $request->get('device');
                $device->product = $request->get('product');
                $device->fingerprint = $request->get('fingerprint');
                $device->imei = $request->get('imei');
                $device->build_type = $request->get('build_type');
                $device->time = $request->get('time');
                $device->created_at = Carbon::now()->toDateTimeString();
                $device->save();
            }


            $data = array();
            $data['status'] = 'OK';
            $data['message'] = 'Data saved';
            return $data;
        }

        $data = array();
        $data['status'] = 'FAIL';
        $data['message'] = 'Please check request data';
        return $data;
    }

    public function savePowerMode(Request $request){
        $request_data = (object)$this->request->request->get('data');
        if ($request_data != '') {
            $request_data = json_decode(base64_decode($request_data));
            $session_string = (isset($request_data->session_string)) ? explode('|', base64_decode($request_data->session_string)) : explode('|', base64_decode($request->get('session_string')));

            $user_id = (isset($session_string[0])) ? $session_string[0] : 0;

            $mode = $request->get('power_mode') ? $request->get('power_mode') : 0;
            $mode= (int)$mode;

            User::where('id', $user_id)->update(['battery_saver_mode' => $mode]);

            $data = array();
            $data['status'] = 'OK';
            $data['message'] = 'Data saved';
            return $data;
        }

        $data = array();
        $data['status'] = 'FAIL';
        $data['message'] = 'Please check request data';
        return $data;
    }

    public function saveUserInfo(Request $request){

        $request_data = (object)$this->request->request->get('data');
        if ($request_data != "") {
            $session_string = (isset($request_data->session_string)) ? explode("|", base64_decode($request_data->session_string)) : explode("|", base64_decode($request->get('session_string')));

            $user_id = (isset($session_string[0])) ? $session_string[0] : 0;

            $s3 = Storage::disk('s3');
            /*if (!file_exists(storage_path().'/info')) {
                mkdir(storage_path().'/info', 0777, true);
            }

            if (!file_exists(storage_path().'/info/'.$user_id)) {
                mkdir(storage_path().'/info/'.$user_id, 0777, true);
            }

            if (!file_exists(storage_path().'/info/'.$user_id.'/'.Carbon::now()->toDateString())) {
                mkdir(storage_path().'/info/'.$user_id.'/'.Carbon::now()->toDateString(), 0777, true);
            }*/

            /*$myfile = fopen(storage_path().'/info/'.$user_id.'/'.Carbon::now()->toDateString().'/'.time().'.json', "w") or die("Unable to open file!");
            $txt = json_encode($request->all());
            $encrypted_file = wall_encrypt($txt);
            $encrypted_file = $encrypted_file ? $encrypted_file : $txt;
            fwrite($myfile, $encrypted_file);
            fclose($myfile);*/

            $txt = json_encode($request->all());
            $encrypted_file = wall_encrypt($txt);

            $s3->put('/info/'.$user_id.'/'.Carbon::now()->toDateString().'/'.time().'.json', $encrypted_file);

            $this->updateAppDataInfo($user_id);
            $data = array();
            $data['status'] = 'OK';
            $data['message'] = 'Data saved';
            return $data;
        }

        $data = array();
        $data['status'] = 'FAIL';
        $data['message'] = 'Please check request data';
        return $data;
    }

    public function updateAppDataInfo($user_id){
        try {
            if (!empty($user_id)){
                $jobProvider = JobProvider::where('application_id', $user_id)->where('from', 'updateAppDataInfo')->first(['id']);
                if (!isset($jobProvider->id)) {
                    $payload = [
                        'payload' => json_encode(['date' => Carbon::now()->toDateString(), 'user_id' => $user_id]),
                        'from' => 'updateAppDataInfo',
                        'application_id' => $user_id,
                        'available_at' => Carbon::now()->addDays(10)->toDateTimeString(),
                        'created_at' => Carbon::now()->toDateTimeString()
                    ];
                    JobProvider::insert($payload);
                } else {
                    JobProvider::where('application_id', $user_id)->where('from', 'updateAppDataInfo')->update(['is_available' => 0, 'available_at' => Carbon::now()->addDays(10)->toDateTimeString()]);
                }
            }
        }catch (\Exception $e){
            (new Slack(new Request(['title' => 'updateAppDataInfo Exception', 'fields' => ['Message' => $e->getMessage(), 'Line' => $e->getLine(), 'File' =>$e->getFile(), 'Trace' => $e->getTraceAsString()]])))->send();
        }
    }

    public function fcmRegistration(Request $request){
        $ref = ($request->has('referee')) ? $request->get('referee') : "Mobile App";
        $request_data = (object)$this->request->request->get('data');
        if ($request_data != "" ||  $ref == 'android') {
            if($ref != 'android') {
                $device_id = (isset($request_data->device_id)) ? $request_data->device_id : "Mobile App";
                $fcm_id = (isset($request_data->token)) ? $request_data->token : "";
                $device_type = (isset($request_data->device_type)) ? $request_data->device_type : "Mobile App";
            }else{
                $device_id = 'android-customer';
                $fcm_id = ($request->has('token')) ? $request->get('token') : "";
                $device_type = 'android-customer';
            }
            $session_string = (isset($request_data->session_string)) ? explode("|", base64_decode($request_data->session_string)) :  explode("|", base64_decode(($request->has('session_string')) ? $request->get('session_string') : ""));

            $user_id = (isset($session_string[0])) ? $session_string[0] : 0;

            $fcmRegistration = GCMRegistraion::where('user_id',$user_id)->where('device_id',$device_id)->first();

            if(!isset($fcmRegistration->id)) {
                $fcm = new GCMRegistraion();
            }else{
                if($fcmRegistration->status == 'Inactive'){
                    $fcm = GCMRegistraion::find($fcmRegistration->id);
                }else if($fcmRegistration->fcm_id != $fcm_id){
                    $fcm = GCMRegistraion::find($fcmRegistration->id);
                }
            }
            if(isset($fcm)) {
                $fcm->user_id = $user_id;
                $fcm->device_id = $device_id;
                $fcm->fcm_id = $fcm_id;
                $fcm->device_type = $device_type;
                $fcm->status = "active";
                $fcm->save();
                $data = array();
                $data['status'] = 'OK';
                $data['message'] = 'GCM Registration Successfully';
                return $data;
            }
        }
        $data = array();
        $data['status'] = 'FAIL';
        $data['message'] = 'No Data Found';
        return $data;
    }

    public function locationGathering(Request $request){
        return response()->json(['status'=>'OK'], 200);
        $ref = ($request->has('referee')) ? $request->get('referee') : '';
        $latitude = ($request->has('latitude')) ? $request->get('latitude') :'';
        $longitude = ($request->has('longitude')) ? $request->get('longitude') : '';
        $request_data = ($request->request->get('data')) ? $request->request->get('data') : ($request->get('data') ? $request->get('data') : '');
        $session_string = (isset($request_data->session_string)) ? explode("|", base64_decode($request_data->session_string)) :  explode("|", base64_decode(($request->has('session_string')) ? $request->get('session_string') : ""));
        if ($request_data != "" ||  $ref == 'android') {
            $user_id = (isset($session_string[0])) ? $session_string[0] : 0;
            if($user_id > 0) {
                $time = Carbon::now()->toDateTimeString();
                $existLocation = Locations::where('user_id',$user_id)->where('latitude',$latitude)
                    ->where('longitude',$longitude)
                    ->where('created_at',$time)->first(['id']);
                if(!isset($existLocation->id)) {
                    Locations::insert([
                        'user_id' => $user_id,
                        'latitude' => $latitude,
                        'longitude' => $longitude,
                        'created_at' => $time
                    ]);
                }
            }
        }

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

    public function appRating(Request $request){
        $rating = $request->get('rating');
        $feedback = $request->get('feedback');
        $session_string = $request->get('session_string');
        $session_string = ($session_string) ? explode("|",base64_decode($session_string)) : "";
        $user_id = isset($session_string[0]) ? $session_string[0] : 0;
        if($user_id) {
            AppRating::insert([
                'rating' => $rating,
                'feedback' => $feedback,
                'user_id' => $user_id,
                'created_at' => Carbon::now()->toDateTimeString()
            ]);
        }

        $data = array();
        $data['status'] = 'FAIL';
        $data['message'] = 'Please check request data';
        return response()->json($data, 200);
    }

    public function userUpdate(Request $request){
        $gpsStatus = $request->get('gps');
        $session_string = $request->get('session_string');
        $session_string = ($session_string) ? explode("|",base64_decode($session_string)) : "";
        $user_id = isset($session_string[0]) ? $session_string[0] : 0;
        if($user_id) {
            try {
                $gps = $gpsStatus == 'disabled' ? 0 : 1;

                User::where('id', $user_id)->update([
                    'is_gps_on' => $gps
                ]);

                $gpsState = 'GPS ' . $gpsStatus;

                $user = User::find($user_id);

                if (!$request->has('latitude') || ($request->has('latitude') && !empty($request->get('latitude')))) {
                    $locations = Locations::where('user_id', $user_id)
                        ->orderBy('created_at', 'desc')
                        ->first();
                    $latitude = isset($locations->latitude) ? $locations->latitude : '';
                    $longitude = isset($locations->longitude) ? $locations->longitude : '';
                } else {
                    $latitude = $request->get('latitude');
                    $longitude = $request->get('longitude');
                }

                $gpsLogs = new GPSLogs();
                $gpsLogs->user_id = $user_id;
                $gpsLogs->gps_status = $gps;
                $gpsLogs->latitude = $latitude;
                $gpsLogs->longitude = $longitude;
                $gpsLogs->created_at = Carbon::now()->toDateTimeString();
                $gpsLogs->save();

                $application = new ConsumerApplicationController();

                $address_line = 'Unknown';
                if (isset($locations->latitude)) {
                    $address = $application->Get_Address_From_Google_Maps($latitude, $longitude);
                    $address_line = isset($address['formatted_address']) ? $address['formatted_address'] : '';
                    $address_line .= isset($address['street']) ? $address['street'] : '';
                    $address_line .= isset($address['city']) ? $address['city'] : '';
                }
                (new Slack(new Request(['title' => 'GPS Status', 'fields' => ['Advisor' => $user->name, 'GPS Status' => $gpsState, 'Last Seen' => $address_line], 'group' => Slack::$DAILY_TASK])))->send();

                $data = array();
                $data['status'] = 'OK';
                $data['message'] = 'Updated';
            }catch (\Exception $exception){
                (new Slack(new Request(['title' => 'Tech Bug', 'fields' => ['line' => $exception->getLine(), 'trace' => $exception->getTraceAsString(), 'file' => $exception->getFile(), 'message' => $exception->getMessage()]])))->send();
            }
        }else {
            $data = array();
            $data['status'] = 'FAIL';
            $data['message'] = 'Please check request data';
        }
        return response()->json($data, 200);
    }

    public function referral(Request $request){
        (new Slack(new Request(['title' => 'Referral Data', 'fields' => ['Data' => json_encode($request->input())]])))->send();
        try {
            $ref = ($request->has('referee')) ? $request->get('referee') : '';
            $referrer_data = ($request->has('referrer_data')) ? $request->get('referrer_data') : '';
            $request_data = ($request->request->get('data')) ? $request->request->get('data') : ($request->get('data') ? $request->get('data') : '');
            $session_string = (isset($request_data->session_string)) ? explode("|", base64_decode($request_data->session_string)) : explode("|", base64_decode(($request->has('session_string')) ? $request->get('session_string') : ($request->get('user') ? $request->get('user')['session_string'] : '')));

            if ($request_data != "" || $ref == 'android') {
                $user_id = (isset($session_string[0])) ? $session_string[0] : 0;
                if ($user_id > 0) {
                    $referrer_data = urldecode($referrer_data);
                    $referrer_data = str_replace('\u201d', '', $referrer_data);
                    $referrer_data = str_replace('”', '', $referrer_data);
                    parse_str($referrer_data, $query);
                    $this->userAttribution($query, $user_id);
                    if ($query) {
                        if (isset($query['utm_source']) && strlen(trim($query['utm_source'])) == 5) {
                            $user = User::where('code', strtolower(trim($query['utm_source'])))->first(['id']);
                            $bnpl_merchants = BNPL::getMerchants();
                            if (!isset($user->id))
                                $user = Merchant::where('code', strtolower(trim($query['utm_source'])))->whereNotIn('id', $bnpl_merchants)->first(['id']);

                            if (isset($user->id) && isset($session_string[0])) {
                                User::where('id', $session_string[0])->update(['referred_by' => trim(strtolower($query['utm_source']))]);
                            }
                        }
                    }
                }
            }

        }catch (\Exception $e){
            (new Slack(new Request(['title' => 'Referral Exception', 'fields' => ['Data' => json_encode($request->input()), 'Message' => $e->getMessage(), 'Line' => $e->getLine(), 'File' =>$e->getFile(), 'Trace' => $e->getTraceAsString()]])))->send();
        }
        return response()->json(['status'=>'OK'], 200);
    }

    public function userAttribution($user, $user_id){
        $utm_source = isset($user['utm_source']) ? $user['utm_source'] : '';
        $utm_medium = isset($user['utm_medium']) ? $user['utm_medium'] : '';
        $utm_campaign = isset($user['utm_campaign']) ? $user['utm_campaign'] : '';

        if($user_id){
            $attribution = [
                'utm_source' => $utm_source,
                'utm_medium' => $utm_medium,
                'utm_campaign' => $utm_campaign,
                'user_id' => $user_id,
                'created_at' => Carbon::now()->toDateTimeString()
            ];

            UserAttribution::insert($attribution);
        }
    }

    public function UserAttributionUpdate($userData, $application_id){
        $user_id = isset($userData->id) ? $userData->id : 0;
        if($user_id){
            $user = UserAttribution::where('user_id', $user_id)->where('application_id','>',0)->first(['id']);
            if (!isset($user->id)){
                $user = UserAttribution::where('user_id', $user_id)->orderBy('created_at','asc')->first();
                if(isset($user->id) && !$user->application_id){
                    UserAttribution::where('id', $user->id)->update(['application_id' => $application_id]);
                }
            }
        }
    }

    public function getPrivacy(){
        return view('admin.pwa_privacy',['type'=> 'consumer']);
    }

    public function getKYCSetup($app_id){
        $user_details = ConsumerApplication::where('id', $app_id)->first(['name', 'mobile_number', 'email']);

        $identifier = !empty($user_details->mobile_number) ? $user_details->mobile_number : (!empty($user_details->email) ? $user_details->email : '');

        $ekc_integration = new ekycIntegration();
        $request_id = $ekc_integration->requestKYC($identifier, $app_id);
//        $request_id = $ekc_integration->requestKYC(9920820531, $app_id);

        if($request_id){
            $data['application_id'] = $app_id;
            $data['request_id'] = $request_id;
            $data['identifier'] = $identifier;
//            $data['identifier'] = 9920820531;
            $data['source'] = 'consumer_app';
            return view('admin.e-kyc_integration', $data);
        }
        return "Something went wrong!";
    }

    public function getKYCInfo(){
        $request_data = $this->request->request->get('data');
        $r_id = KYCDetails::where('application_id', $request_data->id)->orderBy('id', 'desc')->first(['request_id']);

        $ekycIntegration =  new ekycIntegration();
        $status = $ekycIntegration->requestStatus($r_id['request_id'], $request_data->id);

        if(!isset($status['doc_type']) || $status['doc_type'] == ''){
            $status = $ekycIntegration->requestStatus($r_id['request_id'], $request_data->id);
            (new Slack(new Request(['title' => 'Digio request error', 'fields' => $status])))->send();
        }

        if(!isset($status['doc_type']) || $status['doc_type'] == ''){
            return ['status' => static::$FAIL, 'message' => 'KYC failed'];
        }else {
            $info = [];
            foreach($status['doc_type'] as $document){
                $info[$document] = $ekycIntegration->getParsedInfo($r_id->request_id, $request_data->id, $document);
            }
//            if(!empty($info) && $info != []){
//                $ekc_integration->generateReport($r_id->request_id, $request_data->id);
//            }
            $data['application_id'] = $request_data->id;
            $data['response'] = $status;
            $data['info'] = $info;
            return ['status' => static::$OK, 'message' => 'KYC successful', 'data' => $data];
        }
    }

    public function checkUpdate(){

        $version = _env('CONSUMER_APP_VERSION');
        $isForceUpdate = _env('CONSUMER_APP_FORCE_UPDATE');

        $data = array();
        $data['status'] = 'OK';
        $data['message'] = 'Version fetched';
        $data['data'] = ['version' => $version,'isForceUpdate' => $isForceUpdate];
        return $data;
    }

    public function checkLoanEligibility(){
        $request_data = $this->request;
        $eligibleAmount = 0;

        for($i = 1; $i <= $request_data->tenure; $i++){
            $eligibleAmount += ($request_data->monthly_income * 0.7 - $request_data->monthly_expense)/pow((1 + $request_data->interest_rate/1200), $i);
        }

        $data = array();
        $data['status'] = 'OK';
        $data['message'] = 'Success';
        $data['statusCode'] = 'CF200';
        $data['data'] = ['eligible_amount' => $eligibleAmount > 0 ? round($eligibleAmount, 0) : 0];
        return $data;
    }
}
