<?php

namespace App\Http\Controllers;


use App\AdviserService;
use App\ApplicationEMICalculation;
use App\ApplicationRating;
use App\AppRating;
use App\BasicAccess;
use App\BNPL;
use App\Centers;
use App\Comments;
use App\Company;
use App\ConsumerApplication;
use App\ConsumerApplicationElement;
use App\ConsumerApplicationFiles;
use App\CreditLine;
use App\CreditReport;
use App\Customers;
use App\Devices;
use App\DisbursementLogs;
use App\DisbursementOffers;
use App\EMICalculation;
use App\FOIR;
use App\GCMRegistraion;
use App\GPSLogs;
use App\Http\Controllers\Admin\ConsumerApplicationController;
use App\Http\Controllers\Admin\ConsumerDocument;
use App\Http\Controllers\Admin\Dashboard;
use App\Http\Controllers\Admin\MerchantController;
use App\Http\Controllers\ConsumerAPI\ConsumerApiController;
use App\Http\Requests\AddMerchantRequest;
use App\Jobs;
use App\JWTAccess;
use App\KarzaAPI;
use App\Leads;
use App\Locations;
use App\Merchant;
use App\MerchantCategory;
use App\MerchantFiles;
use App\MerchantLocation;
use App\MerchantOffers;
use App\MerchantUserRequest;
use App\MultiStageDisbursement;
use App\OCRRecognition;
use App\ProductOffers;
use App\Products;
use App\PWAApplicationForm;
use App\Rating;
use App\Reminders;
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\UserGeolocation;
use Dompdf\Exception;
use Hashids\Hashids;
use Illuminate\Http\Request;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Input;
use Illuminate\Support\Facades\Storage;

class MerchantApiController extends Controller
{

    public $sessionMerchant = null;

    public function __construct()
    {
        setlocale(LC_MONETARY, 'en_IN.UTF-8');
        $this->statusgroup = array('in-process' => array('in-process','form completed', 'incomplete form','waiting for decision'), 'waiting for documents' => array('waiting for documents'), 'approved' => array('cf approved','approved','disbursement checklist done', 'ready for disbursement', 'disbursement query'), 'disbursed' => array('disbursed', 'nach registered'), 'rejected' => array('rejected'), 'aborted' => array('aborted'), 'pre approved' => array('pre approved'), 'cancellation in-process' => array('cancellation in-process'));
        $this->statuscolor = array('in-process' => '#bebe45', 'waiting for documents' => '#bebe45', 'approved' => '#44bc44', 'disbursed' => '#42d9e4', 'rejected' => '#da0707', 'aborted' => '#ff9191','pre approved' => '#4bed66');
    }

    public function validate_session($session_string){
        $session_string = is_array($session_string) ? $session_string : explode("|", base64_decode($session_string));
        if(isset($session_string[2])) {
            $user = User::where('id', $session_string[2])->whereNull('deleted_at')->first(['id']);
            $merchant_id = (isset($session_string[0])) ? $session_string[0] : 0;
            $merchant_details = Merchant::where('id',$merchant_id)->whereNull('deleted_at')->where('status','active')->first();
            $this->sessionMerchant = $merchant_id;

            if (!isset($user->id) || ($merchant_id && !isset($merchant_details->id))) {
                $data = array();
                $data['status'] = 'FAIL';
                $data['message'] = 'Invalid Session data';$data['c'] = Input::all();
                $data['s'] = $session_string;
                return $data;
            } else {
                if (isset($session_string[0]) && isset($session_string[5])) {
                    if (strtolower($session_string[5]) == "executive") {
                        $session_type = "center_executive";
                    } elseif (strtolower($session_string[5]) == "center") {
                        $session_type = "center_head";
                    } else {
                        $session_type = strtolower($session_string[5]);
                    }
                    /*if (($user->merchant_id != $session_string[0]) || (strtolower($session_type) != strtolower($user->user_type))) {
                        $data = array();
                        $data['status'] = 'FAIL';
                        $data['message'] = 'Invalid Session data';
                        return $data;
                    }*/
                } else {
                    $data = array();
                    $data['status'] = 'FAIL';
                    $data['message'] = 'Invalid Session data';
                    return $data;
                }
            }
        }else{
            $data = array();
            $data['status'] = 'FAIL';
            $data['message'] = 'Invalid Session data';
            return $data;
        }

        return false;
    }

    public function generateOtp(Request $request)
    {
        $otp           = rand('100000', '999999');
        $request_data = $request->input('data');
        if(isset($request_data->mobile_number)) {
            $session_string  = (isset($request_data->session_string)) ? explode("|", base64_decode($request_data->session_string)) : ($request->get('user') ? $request->get('user')['session_string'] : '');
            $mobile_number = $request_data->mobile_number;
            $merchant_id = isset($request_data->merchant_id) ? $request_data->merchant_id : (isset($session_string[0]) ? $session_string[0] : '');
            $is_consumer = isset($request_data->is_consumer) ? $request_data->is_consumer : 0;
            $is_resend = isset($request_data->is_resend) ? $request_data->is_resend : 0;
            $pan_number = isset($request_data->pan_number) ? $request_data->pan_number : "";
            $name = isset($request_data->name) ? $request_data->name : "";
            if (strlen($mobile_number) == 12 && substr($mobile_number, 0, 2) == "91") {
                $mobile_number = substr($mobile_number, 2, 10);
            }

            if ($is_resend){
                $is_consumer = 0;
            }

//            if ($is_consumer == 1 && ($pan_number == "" || PWAApplicationForm::pan_format_validation($pan_number) != "Valid")){
//                $data = array();
//                $data['status'] = 'FAIL';
//                $data['message'] = 'Please check PAN Number';
//                return $data;
//            }

            if ($is_consumer == 1 && ($name == "" || !(preg_match("/^[a-zA-Z ]*$/",$name)))){
                $data = array();
                $data['status'] = 'FAIL';
                $data['message'] = 'Please check Name';
                return $data;
            }

            if ($is_consumer == 1 && $errorCode = (new ApiController())->checkEligibility(new Request(['mobile_number' => $mobile_number]))) {
                $data['status'] = 'FAIL';
                $data['message'] = 'It seems like it has been less than 3 months since you applied to Credit Fair . We\'ll be happy to serve you after ' . $this->getRemainingMonths($errorCode) . ' Month';
                return $data;
            }

            $dontCheck = true;
            if (isset($request_data->customer)){
                $dontCheck = false;
            }

            if ($is_resend){
                $is_consumer = 1;
            }

            if($is_consumer == 0){
                $isExist = User::where('mobile_number', $mobile_number)->where('user_type','!=',1)->first(['id']);
                if (!isset($isExist->id) && $dontCheck) {
                    $data = array();
                    $data['status'] = 'FAIL';
                    $data['show_popup'] = 1;
                    $data['message'] = 'Mobile number doesnot exist';
                    return $data;
                }
            }

            $message = "Your Credit Fair verification code is ".$otp."<br/>Best Regards,<br/>Team Credit Fair";
            $entity = ['templateid' => '1307161519272825845', 'entityid' => Templates::$entityid];
            $data = array();
            $templateId = Templates::$otp1;
            $args = [$otp];
            if(!empty($merchant_id) && $merchant_id != ''){
                $merchant = Merchant::where('id', $merchant_id)->first(['merchant_name','email', 'skip_appl_otp']);
            }
            if($is_consumer == 1 && $is_resend) {
                //$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";
                //$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 & sending notifications on Whatsapp";
                // $message = "By validating OTP ".$otp." I agree to Credit Fair's terms and conditions provided here - https://bit.ly/2QRVgjd, for the loan application and have no objection to them conducting a credit check or contacting me.<br/>You can view your loan application status through our consumer application by login through below link https://bit.ly/3pkSXS6<br/>Best Regards,<br/> Team Credit Fair";
                $tnC_link = "https://lnk.creditfair.in/hFVR";
                $app_link = "https://lnk.creditfair.in/Wgmx";
                $message = "By validating OTP ".$otp." I agree to Credit Fair's terms and conditions provided here - ".$tnC_link.", for the loan application and have no objection to them conducting a credit check or contacting me. You can view your loan application status through our consumer application by logging through the link ".$app_link." . Team Credit Fair";
                $templateId = Templates::$otp2;
                $entity = ['templateid' => '1307173277417496907', 'entityid' => Templates::$entityid];
            }
            if($is_consumer == 1 && !$is_resend) {

                $telecom = new TelecomDetails();
                $response = $telecom->generateOtp($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";
                    //$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 & sending notifications on Whatsapp";
                    // $message = "By validating OTP ".$otp." I agree to Credit Fair's terms and conditions provided here - https://bit.ly/2QRVgjd, for the loan application and have no objection to them conducting a credit check or contacting me.<br/>You can view your loan application status through our consumer application by login through below link https://bit.ly/3pkSXS6<br/>Best Regards,<br/> Team Credit Fair";
                    // $message = "By validating OTP ".$otp." I agree to Credit Fair's terms and conditions provided here - https://bit.ly/2QRVgjd, for the loan application and have no objection to them conducting a credit check or contacting me. You can view your loan application status through our consumer application by logging through the link https://bit.ly/3pkSXS6. Team Credit Fair";
                    $tnC_link = "https://lnk.creditfair.in/hFVR";
                    $app_link = "https://lnk.creditfair.in/Wgmx";
                    $message = "By validating OTP ".$otp." I agree to Credit Fair's terms and conditions provided here - ".$tnC_link.", for the loan application and have no objection to them conducting a credit check or contacting me. You can view your loan application status through our consumer application by logging through the link ".$app_link." . Team Credit Fair";
                    $templateId = Templates::$otp2;
                    $args = [$otp, "(https://lnk.creditfair.in/hFVR)"];
                    $entity = ['templateid' => '1307173277417496907', 'entityid' => Templates::$entityid];
//                    $otp_manager = new \App\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]);
                }else {
                    $otp = "";
                    $data['request_id'] = $response['request_id'];
                    if(isset($merchant)){
                        //$message = "We have received your loan application from ".$merchant->merchant_name.". This is to inform you that we will be doing a Credit Check.<br/>You might be asked to share OTP. Please reach out to us for any issues :  919967235047.<br/>Thanks,<br/>Team Credit Fair";
                        //$message = "We have received your loan application from ".$merchant->merchant_name.". This is to inform you that we will be doing a Credit Check and you agree to being contacted by Credit Fair.<br/>You can view your loan application status through our consumer application by login through below link https://bit.ly/3pkSXS6<br/>You might be asked to share OTP. Please reach out to us for any issues : 919967235047.<br/>Thanks,<br/>Team Credit Fair";
                        $message = "We have received your loan application from ".$merchant->merchant_name.". This is to inform you that we will be doing a Credit Check and you agree to being contacted by Credit Fair. You can share the OTP with the ".$merchant->merchant_name.". <br/>Please reach out to us for any issues : 919967235047. View your loan application status on our consumer application https://bit.ly/3pkSXS6<br/>Thanks,<br/>Team Credit Fair";
                        $entity = ['templateid' => '1307162851128964498', 'entityid' => Templates::$entityid];
                    }else{
                        $message = "We have received your loan application. This is to inform you that we will be doing a Credit Check.<br/>You might be asked to share OTP.<br/>You can view your loan application status through our consumer application by login through below link https://bit.ly/3pkSXS6<br/> Please reach out to us for any issues :  919967235047.<br/>Thanks,<br/>Team Credit Fair";
                    }
                    //$message = "By sharing otp you 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";
                    $templateId = Templates::$otp_termsandcondition;
                    $args = [$otp, "(https://bit.ly/2QRVgjd)"];
                    //$mobile_number = '91' . $mobile_number;
                    //send_sms($mobile_number, ['message'=>$message]);
                }
                //$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";
            }
            $noEmail = 1;
            if($otp != "") {
                \App\OtpManager::where('mobile_number', (string)$mobile_number)->delete();
                $otp_manager = new \App\OtpManager();
                $otp_manager->otp = $otp;
                if (isset($isExist->id) && $isExist->id == 922) {
                    $otp_manager->otp = 612405;
                    $noEmail = 0;

                    $otp_manager->mobile_number = $mobile_number;
                    $otp_manager->save();

                    $data['status'] = 'OK';
                    $data['message'] = 'OTP request sent';
                    $data['can_skip'] = isset($merchant->skip_appl_otp) ? $merchant->skip_appl_otp : 0;
                    return $data;
                }
                $otp_manager->mobile_number = $mobile_number;
                $otp_manager->save();
            }


            $email = '';
            //$email = isset($merchant) && isset($merchant->email) ? $merchant->email : '';
            if(!$email){
                $user = User::where('mobile_number', $mobile_number)->first(['id','email']);
                $email = isset($user->email) ? $user->email : '';
            }

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

            if($email && $noEmail) {
                try {
                    send_mail($email, $message, 'Credit Fair: OTP');
                }catch (\Exception $e){

                }
            }


            $data['status'] = 'OK';
            $data['message'] = 'OTP request sent';
            $data['can_skip'] = isset($merchant->skip_appl_otp) ? $merchant->skip_appl_otp : 0;
            return $data;
        }else{
            $data = array();
            $data['status'] = 'FAIL';
            $data['message'] = 'Invalid Mobile number';
            return $data;
        }
    }

    public function verifyOtp(Request $request, BasicAccess $BasicAccess)
    {
        $request_data = $request->input('data');
        $verify_type = (isset($request_data->type)) ? $request_data->type : "login";
        $request_id = (isset($request_data->request_id)) ? $request_data->request_id : "";
        $name = (isset($request_data->name)) ? $request_data->name : "";
        $application_id = (isset($request_data->application_id)) ? $request_data->application_id : "";
        if(isset($request_data->mobile_number)) {
            $mobile_number = $request_data->mobile_number;
        }else{
            $data = array();
            $data['status'] = 'FAIL';
            $data['message'] = 'Invalid Mobile number';
            return $data;
        }

        if(isset($request_data->otp)) {
            $otp = $request_data->otp;
        }else{
            $data = array();
            $data['status'] = 'FAIL';
            $data['message'] = 'Invalid OTP';
            return $data;
        }

        if (strlen($mobile_number) == 12 && substr($mobile_number, 0, 2) == "91") {
            $mobile_number = substr($mobile_number, 2, 10);
        }


        $counter = User::where('mobile_number', $mobile_number)->where('user_type', '>=', 2)->where(function($query) {
            $query->whereNull('deleted_at');
        })->first(['otp_counter','last_counter_at']);

        if ($counter && $verify_type == 'login') {
            $totalDuration = Carbon::now()->diffInSeconds($counter->last_counter_at);
            $counterInc = $counter->otp_counter ? $counter->otp_counter : 0;
            $time = $counter->last_counter_at ? $counter->last_counter_at : '';
            if ($counterInc == 3 && $totalDuration < 21600) {
                $data = array();
                $data['status'] = 'FAIL';
                $data['message'] = 'Too many attempts, retry after 6 hours';
                return $data;
            } else if ($counterInc == 3 && $totalDuration > 21600) {
                $counterInc = 1;
                $time = Carbon::now()->toDateTimeString();
            } else {
                $counterInc += 1;
                $time = Carbon::now()->toDateTimeString();
            }

            User::where('mobile_number', $mobile_number)->whereNull('deleted_at')->where('user_type', '>=', 2)->update(['otp_counter' => $counterInc, 'last_counter_at' => $time]);
        } else {
            $time = Carbon::now()->toDateTimeString();
        }

        if (\App\OtpManager::where('mobile_number', (string)$mobile_number)->where('otp', $otp)->first()) {

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

            $data = array();
            $data['status']  = 'OK';
            $data['message'] = 'OTP successfully verified';
            User::where('mobile_number', $mobile_number)->where('user_type', '>=', 2)->whereNull('deleted_at')->update(['user_verified'=> 1]);
            if($verify_type != 'login' && $name){
                //sendWhatsAppMessage($mobile_number, ['id' => $application_id, 'templateId' => Templates::$stop_message_v1, 'args' => [$name]]);
            }

            if($verify_type == 'login'){
                User::where('mobile_number', $mobile_number)->where('user_type', '>=', 2)->whereNull('deleted_at')->update(['otp_counter' => 0, 'last_counter_at' => $time]);
                $type = "Executive";
                $center_id = 0;
                $user_data = User::with('merchant')->where('user_type', '>=', 2)->whereNull('deleted_at')->where('mobile_number',$mobile_number)->first();
                if($user_data->user_type > 4){
                    $type = 'admin';
                }elseif($user_data->user_type == 2){
                    $type = 'Merchant';
                }elseif($user_data->user_type == 3){
                    $type = 'Center';
                    $center_id = $user_data->center_id;
                }else{
                    $center_id = $user_data->center_id;
                }

                $data['merchant_id'] = (isset($user_data->merchant->id)) ? $user_data->merchant->id : 0;
                $data['merchant_name'] = (isset($user_data->merchant->merchant_name)) ? $user_data->merchant->merchant_name : "Credit Fair";
                $data['center_id'] = $center_id;
                $data['user_id'] = $user_data->id;
                $data['user_name'] = $user_data->name;
                if($data['merchant_id'] > 0){
                    $data['referral_code'] = isset($user_data->code) ? strtoupper($user_data->code) : '';
                    $referral_link_base = "https://play.google.com/store/apps/details?id=com.partner.creditfair&referrer=";
                    $utm_medium = urlencode("merchant_app");
                    $referee = urlencode($data['referral_code']);
                    $utm_campaign = urlencode(str_replace(' ','_',$user_data->merchant->merchant_name));
                    $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);
                    //$referral_link = "https://play.google.com/store/apps/details?id=com.partner.creditfair&utm_medium=partner&utm_campaign=".str_replace(' ','_',$user_data->merchant->merchant_name)."&referee=".$data['referral_code'];
                    try {
                        $data['referral_link'] = urlencode(Shortio::getUrl(urldecode($referral_link)));
                    }catch (\Exception $e){
                        $data['referral_link'] = $referral_link;
                    }
                }

                $merchant_details = (isset($data['merchant_id']) && !empty($data['merchant_id']))  ? Merchant::where('id',$data['merchant_id'])->where('status','active')->first(['category_id']) : '';
                $merchant_category = isset($merchant_details->category_id) ? $merchant_details->category_id : '';

                $data['show_prodID'] =($merchant_category == 6 || $merchant_category == 7) ? 1 : 0 ;
                $data['user_guest'] = (($user_data->merchant_id == 0 || $user_data->merchant_id == null || empty($user_data->merchant_id)) || ($user_data->merchant && $user_data->merchant->is_guest_active)) == 1 ? 0 : 1;
                $data['user_email'] = $user_data->email;
                $data['user_mobile'] = $user_data->mobile_number;
                $data['app_create_access'] = $user_data->app_create_access;
                $data['is_gps'] = $user_data->is_gps;
                $adviser = AdviserService::where('user_id', $user_data->id)->whereNull('check_out_at')->orderBy('created_at','desc')->first(['id']);
                $data['adviser_service_id'] = isset($adviser->id) ? $adviser->id : 0;
                $data['session_expiry'] = strtotime("+30 days");
                $session_string = base64_encode($data['merchant_id']."|".$center_id."|".$user_data->id."|".$user_data->mobile_number."|".$data['session_expiry']."|".$type);
                $userObject = new \stdClass();
                $userObject->id = $user_data->id;
                $userObject->session_string = $session_string;
                $userObject->user_type = $user_data->user_type;
                $userObject->center_id = $center_id;
                $userObject->remember_token = $user_data->remember_token;
                $userObject->code = $user_data->code;
                $userObject->email = $user_data->email;
                $userObject->mobile = $user_data->mobile;
                $data['session_string'] = $BasicAccess->generateAccessToken($userObject);
                $data['type'] = strtolower($type);
            }
        } elseif($request_id != ""){
            $telecom = new TelecomDetails();
            $response = $telecom->verifyOtp($request_id,$otp,$application_id,$mobile_number);
            if($response == false){
                $otp           = rand('100000', '999999');
                $templateId = Templates::$otp2;
                //$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";
                // $message = "By validating OTP $otp I agree to Credit Fair's terms and conditions provided here - https://bit.ly/2QRVgjd, for the loan application and have no objection to them conducting a credit check or contacting me.<br/>You can view your loan application status through our consumer application by login through below link https://bit.ly/3pkSXS6<br>Best Regards,<br/>Team Credit Fair";
                // $message = "By validating OTP ".$otp." I agree to Credit Fair's terms and conditions provided here - https://bit.ly/2QRVgjd, for the loan application and have no objection to them conducting a credit check or contacting me. You can view your loan application status through our consumer application by logging through the link https://bit.ly/3pkSXS6. Team Credit Fair";
                $tnC_link = "https://lnk.creditfair.in/hFVR";
                $app_link = "https://lnk.creditfair.in/Wgmx";
                $message = "By validating OTP ".$otp." I agree to Credit Fair's terms and conditions provided here - ".$tnC_link.", for the loan application and have no objection to them conducting a credit check or contacting me. You can view your loan application status through our consumer application by logging through the link ".$app_link." . Team Credit Fair";
            
                \App\OtpManager::where('mobile_number', (string)$mobile_number)->delete();
                $otp_manager                = new \App\OtpManager();
                $otp_manager->otp           = $otp;
                $otp_manager->mobile_number = $mobile_number;
                $otp_manager->save();

                $mobile_number = '91' . $mobile_number;
                $entity = ['templateid' => '1307173277417496907', 'entityid' => Templates::$entityid];
                send_sms($mobile_number, ['message' => $message, 'id' => $application_id, 'id_type' => $application_id ? 'application_id' : '', 'OTP' => true, 'templateId' => $templateId, 'args' => [$otp], 'templateDetails' => $entity]);

                $data['status']  = 'success';
                $data['message'] = 'OTP request sent';
                $data['request_id'] = "";

                $data = array();
                $data['status']  = 'FAIL';
                $data['message'] =  'OTP Resent';
                return $data;
            }else{
                User::where('mobile_number', $mobile_number)->where('user_type', '>=', 2)->whereNull('deleted_at')->update(['user_verified'=> 1]);
            }
            $data = array();
            $data['status']  = 'OK';
            $data['message'] = 'OTP successfully verified';

            $time = Carbon::now()->toDateTimeString();

            User::where('mobile_number', $mobile_number)->where('user_type', '>=', 2)->whereNull('deleted_at')->update(['otp_counter' => 0, 'last_counter_at' => $time, 'user_verified'=> 1]);
            return $data;
        } else{
            $data = array();
            $data['status']  = 'FAIL';
            $data['message'] = 'OTP verification failed';
            return $data;
        }
        return $data;

    }

    public function getPrivacy(Request $request){
        // type => consumer
        $request_data = $request->input('data');
        $session_string = (isset($request_data->session_string)) ? explode("|", base64_decode($request_data->session_string)) :  explode("|", base64_decode((Input::has('session_string')) ? Input::get('session_string') : ""));
//        $view = view('admin.pwa_privacy',['type'=>isset($session_string[5]) ? $session_string[5] : 'merchant']);
        $view = view('front.pages.legal.privacy-policy', ['type' => 'merchant']);
        if($request->has('type') && $request->get('type') == 'customer-app'){
            return $view;
        }
        return ['data'=>$view->render(), 'status' => 'OK'];
//        return $view;
    }

    public function getTerms_Conditions(Request $request){
        // type => consumer
        $request_data = $request->input('data');
        $session_string = (isset($request_data->session_string)) ? explode("|", base64_decode($request_data->session_string)) :  explode("|", base64_decode((Input::has('session_string')) ? Input::get('session_string') : ""));
        $view = view('admin.pwa_terms_conditions',['type'=>isset($session_string[5]) ? $session_string[5] : 'merchant']);
//        $view = view('admin.pwa_terms_conditions',['type'=> 'merchant']);
        $view = view('admin.pwa_privacy',['type'=> 'merchant']);
        return ['data'=>$view->render(), 'status' => 'OK'];
//        return $view;
    }

    /**
     * @param Request $request
     * @return array|\Illuminate\Http\UploadedFile|null|string
     */
    public function documentOcr(Request $request){
        try{
            $filePath = "";
            $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((Input::has('session_string')) ? Input::get('session_string') : ""));
            if(!isset($session_string[0])){
                $data = array();
                $data['status'] = 'FAIL';
                $data['message'] = 'Invalid Session data';
                return $data;
            }
            if($error = $this->validate_session($session_string))
            {
                return $error;
            }

            if($request->hasFile('document')) {
                $file = $request->file('document');
                $filePath = time() . '_' . $file->getClientOriginalName();
                $storage_path = Storage::disk('www')->put($filePath, $file);
                $filePath = $request->getScheme() . '://' . $request->getHttpHost() . '/content/media/' . $storage_path;
            }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){
                    $ocrDataSettings['id'] =  $request_data->id;
                }
                $requestData = new Request($ocrDataSettings);
                $ocrdata = (new OCRRecognition($requestData))->get();
            }
                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($ocrdata && $ocrdata != "") {
                    $data = array();
                    $data['status']  = 'OK';
                    $data['ocrdata'] = $ocrdata;
                    $application_id= isset($request_data->id) ? $request_data->id : 0;
                    $document = new ConsumerDocument(new Request());
                    if (isset($ocrDataSettings['type']) && $ocrDataSettings['type'] != 'pan_card') {
                        if (isset($ocrdata['imageUrl'])){
                            if(isset($storage_path)){
                                $extension = explode('.', $storage_path);
                                $ext = $extension[count($extension) - 1];
                            }else{
                                $ext = '.jpeg';
                            }
                            $masked = true;
                            $document->uploadToS3('aadhar_card_back', $application_id, file_get_contents($ocrdata['imageUrl']), $ext, $masked);
                        }else{
                            $this->uploadDocument($request);
                        }
                    }
                    return $data;
                }
            }
            $data = array();
            $data['status']  = 'FAIL';
            $data['message'] = 'Unable to read the file';
            return $data;
        }catch (\Exception $e){
            (new Slack(new Request(['title'=>'Error 1', 'fields'=>['Message' => $e->getMessage(), 'Line' => $e->getLine(), 'File' =>$e->getFile(), 'Trace' => $e->getTraceAsString(),'respInfo'=>json_encode($data)]])))->send();
        }
    }

    public function referral(Request $request){
        try {
            $ref = (Input::has('referee')) ? Input::get('referee') : '';
            $referrer_data = (Input::has('referrer_data')) ? Input::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((Input::has('session_string')) ? Input::get('session_string') : ($request->get('user') ? $request->get('user')['session_string'] : '')));

            if ($request_data != "" ||  $ref == 'android') {
                $user_id = (isset($session_string[2])) ? $session_string[2] : 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);
                    (new ConsumerApiController($request))->userAttribution($query, $user_id);
                    if ($query) {
                        if (isset($query['utm_source']) && strlen(trim($query['utm_source'])) == 5) {
                            $merchant = User::where('code', strtolower(trim($query['utm_source'])))->first(['id']);
                            if (isset($merchant->id) && isset($session_string[0])) {
                                Merchant::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 getOffers(Request $request){
        $request_data = ($request->request->get('data')) ? $request->request->get('data') : ($request->get('data') ? $request->get('data') : '');
        if($request_data == ""){
            $data['status']  = 'FAIL';
            $data['message'] = 'Invalid merchant details or loan amount';
            return $data;
        }else{
            $merchant_data = (isset($request_data->session_string)) ? explode("|", base64_decode($request_data->session_string)) : ($request->get('user') ? $request->get('user')['session_string'] : '');
            if(!$merchant_data){
                $data = array();
                $data['status']  = 'FAIL';
                $data['message'] = 'Invalid session data 2';
                return $data;
            }
            if(isset($request_data->loan_amount) && $request_data->loan_amount > 9999){
                $loan_amount = $request_data->loan_amount;
            }else{
                $data = array();
                $data['status']  = 'FAIL';
                $data['message'] = 'Loan Amount cannot be less than 10000';
                return $data;
            }
        }

        if($request_data->loan_amount > 2000000){
            $data = array();
            $data['status']  = 'FAIL';
            $data['message'] = 'Loan Amount cannot be more than Twenty Lacs';
            return $data;
        }
        if(!isset($merchant_data[0])){
            $data = array();
            $data['status']  = 'FAIL';
            $data['message'] = 'Invalid session data 1';
            return $data;
        }
        if($error = $this->validate_session($merchant_data))
        {
            return $error;
        }
        $merchant_id = (isset($request_data->merchant_id) && $request_data->merchant_id != "") ? $request_data->merchant_id : $merchant_data[0];

        $merchant_details = Merchant::where('id',$merchant_id)->where('status','active')->first();

        if(isset($merchant_details->id)) {
            $request = new Request();
            $request->attributes->add(['merchant_id' => $merchant_id, 'loan_amount' => $loan_amount, 'category_id' => $merchant_details->category_id,'application_id'=>0, 'product_id'=> $request_data->product_id]);
            $calculation = new \App\Http\Controllers\Admin\EMICalculation($request);
            try {
                $data = array();
                $newOfferData = $calculation->prepareCalculation()->getData();
                $byPassMerchant = [141, 2404, 1972];
                if (in_array($merchant_id,$byPassMerchant) || (isset($merchant_details->anchor_merchant_id) && in_array($merchant_details->anchor_merchant_id,$byPassMerchant))){
                    $_m_id = $merchant_id;
                    if ((isset($merchant_details->anchor_merchant_id) && in_array($merchant_details->anchor_merchant_id,$byPassMerchant))){
                        $_m_id = $merchant_details->anchor_merchant_id;
                    }
                    $offerData = $newOfferData;
                    $newOfferData = [];
                    $off = array();
                    foreach ($offerData as $offerItem){
                        $off[] = $offerItem->id;
                    }
                    sort($off);
                    foreach ($offerData as $offerItem){
                        if ($_m_id == 141) {
                            $newOfferData[] = $offerItem;
//                            if ($loan_amount <= 649999) {
//                                if (in_array($offerItem->id, [459, 460, 461, 462])) {
//                                    $newOfferData[] = $offerItem;
//                                } else if (isset($merchant_details->anchor_merchant_id) && in_array($offerItem->id, array_slice($off, 0, 4))) {
//                                    $newOfferData[] = $offerItem;
//                                }
//                            } else {
//                                if (in_array($offerItem->id, [463, 1089, 1090, 1091])) {
//                                    $newOfferData[] = $offerItem;
//                                } else if (isset($merchant_details->anchor_merchant_id) && in_array($offerItem->id, array_slice($off, 4))) {
//                                    $newOfferData[] = $offerItem;
//                                }
//                            }
                        }else if($_m_id == 2404){
                            if ($loan_amount < 30000) {
                                if (in_array($offerItem->id, [8133, 8137, 8138])) {
                                    $newOfferData[] = $offerItem;
                                } else if (isset($merchant_details->anchor_merchant_id) && in_array($offerItem->id, array_slice($off, 0, 4))) {
                                    $newOfferData[] = $offerItem;
                                }
                            } else {
                                if (in_array($offerItem->id, [8139, 8140, 8141, 8142])) {
                                    $newOfferData[] = $offerItem;
                                } else if (isset($merchant_details->anchor_merchant_id) && in_array($offerItem->id, array_slice($off, 4))) {
                                    $newOfferData[] = $offerItem;
                                }
                            }
                        }else if($_m_id == 1972){
                            if ($loan_amount <= 60000) {
                                if (in_array($offerItem->id, [8715, 8716, 8717, 8718, 8719])) {
                                    $newOfferData[] = $offerItem;
                                } else if (isset($merchant_details->anchor_merchant_id) && in_array($offerItem->id, array_slice($off, 0, 4))) {
                                    $newOfferData[] = $offerItem;
                                }
                            } else if($loan_amount > 60000 && $loan_amount <= 150000) {
                                if (in_array($offerItem->id, [8720, 8721, 8722, 8723, 8724])) {
                                    $newOfferData[] = $offerItem;
                                } else if (isset($merchant_details->anchor_merchant_id) && in_array($offerItem->id, array_slice($off, 4))) {
                                    $newOfferData[] = $offerItem;
                                }
                            } else {
                                if (in_array($offerItem->id, [8725, 8726, 8727])) {
                                    $newOfferData[] = $offerItem;
                                } else if (isset($merchant_details->anchor_merchant_id) && in_array($offerItem->id, array_slice($off, 4))) {
                                    $newOfferData[] = $offerItem;
                                }
                            }
                        }
                    }
                }

                $data['offers'] = $newOfferData;
                $data['status'] = "OK";
                return $data;
            } catch (\Exception $e) {
                $data = array();
                $data['status']  = 'FAIL';
                $data['message'] = 'Something went wrong';
                return $data;
            }
        }else {
            $data = array();
            $data['status'] = 'FAIL';
            $data['message'] = 'Merchant not found';
            return $data;
        }
    }

    public function errorLogging(Request $request){
        $application = new ConsumerApplicationController();
        $data = ($request->get('data')) ? $request->get('data') : ($request->request->get('data') ? $request->request->get('data') : '');
        if($data) {
            $session_string = (isset($data->session_string)) ? explode("|", base64_decode($data->session_string)) : "";
            $cfuser = (isset($session_string[2])) ? $session_string[2] : 0;
            $user = User::find($cfuser);
            $error = [
                'message' => isset($data->message) ? $data->message : '',
                'url' => isset($data->url) ? $data->url : '',
                'status' => isset($data->status) ? $data->status : '',
                'stack' => isset($data->stack) ? $data->stack : '',
                'info' => isset($data->info) && isset($data->info->componentStack) ? $data->info->componentStack : '',
                'user' => isset($user->name) ? $user->name : ''
            ];
            $application->sendslackmessage(0, 'techBugMobile', $error);
            $data = [];
        }
        $data['status'] = 'OK';
        return $data;
    }

    public function applyLoan(Request $request){
        $request_data = ($request->request->get('data')) ? $request->request->get('data') : ($request->get('data') ? $request->get('data') : '');
        if($request_data != ""){
            $session_string = $session_string = (isset($request_data->session_string)) ? explode("|", base64_decode($request_data->session_string)) : ($request->get('user') ? $request->get('user')['session_string'] : '');
            if(!isset($session_string[0])){
                $data = array();
                $data['status'] = 'FAIL';
                $data['message'] = 'Invalid Session data';
                return $data;
            }
            if($error = $this->validate_session($session_string))
            {
                return $error;
            }
            $page_event = (isset($request_data->page_event) ) ? $request_data->page_event : "";
            $application_id = (isset($request_data->application_id) ) ? $request_data->application_id : 0;
            $phone = isset($request_data->phone) ? $request_data->phone : '';
            if($page_event == 'loan_details' && $application_id == 0) {
                if(!in_array($phone, [9820603150,7304362961,7874191148,7045273515,8384820006,9820603150])) {
                    if ($errorCode = (new ApiController())->checkEligibility(new Request(['email' => isset($request_data->email) ? $request_data->email : '', 'mobile_number' => $phone]))) {
                        $data['status'] = 'FAIL';
                        $data['message'] = 'It seems like it has been less than 3 months since you applied to Credit Fair . We\'ll be happy to serve you after ' . $this->getRemainingMonths($errorCode) . ' Month';
                        return $data;
                    }
                }
            }

            $response = PWAApplicationForm::apply($request_data,$session_string,$request);

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

    public function exotelService(Request $request){
        $request_data = ($request->request->get('data')) ? $request->request->get('data') : ($request->get('data') ? $request->get('data') : '');
        if($request_data != ""){
            $session_string = (isset($request_data->session_string)) ? explode("|", base64_decode($request_data->session_string)) : ($request->get('user') ? $request->get('user')['session_string'] : '');
            if(!isset($session_string[0])){
                $data = array();
                $data['status'] = 'FAIL';
                $data['message'] = 'Invalid Session data';
                return $data;
            }
            if($error = $this->validate_session($session_string))
            {
                return $error;
            }

            $application_id = isset($request_data->id) ? $request_data->id : 0;
            $purpose = isset($request_data->purpose) ? str_replace(' ','_',strtolower($request_data->purpose)) : '';
            $mobile_number = isset($session_string[3]) ? $session_string[3] : 0;
            $user_id = isset($session_string[2]) ? $session_string[2] : 0;

            $advisor = ConsumerApplication::with('advisor')->where('id',$application_id)->first();

            $to = isset($request_data->to) ? $request_data->to : (isset($advisor->mobile_number) ? $advisor->mobile_number : '');

            if ($to && $application_id > 0 && $mobile_number > 0) {
                $application = new ConsumerApplicationController();
                $request->merge(['to' => $to, 'from' => $mobile_number, 'application_type' => 'application_id', 'user_id' => $user_id, 'id' => $application_id, 'purpose' => $purpose]);
                $response = $application->exotelService('call', $request);

                $responseData = $response->getData();

                $code = isset($responseData->response) && isset($responseData->response->code) ? $responseData->response->code : 0;
                $message = isset($responseData->message) ? $responseData->message : '';

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

    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[2]) ? $session_string[2] : 0;
        if($user_id) {
            AppRating::insert([
                'rating' => $rating,
                'feedback' => $feedback,
                'user_id' => $user_id,
                'created_at' => Carbon::now()->toDateTimeString()
            ]);

            try {
                $user = User::where('id', $user_id)->first(['name', 'merchant_id']);
                $merchant = Merchant::where('id', $user->merchant_id)->first(['merchant_name']);
                (new Slack(new Request(['title' => 'Rating received from ' . strtolower($user->name), 'fields' => ['Merchant Name' =>$merchant->merchant_name, 'Source' => 'WhatsApp', 'Merchant Id' => $user->merchant_id], 'group' => Slack::$merchant_customer_review])))->send();
            }catch (\Exception $e){

            }
        }

        $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[2]) ? $session_string[2] : 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');
                }

                $gpsData = GPSLogs::where('user_id',$user_id)->where('created_at','>=', Carbon::now()->subMinute(1)->toDateTimeString())->where('created_at','<=', Carbon::now()->toDateTimeString())->orderBy('created_at','desc')->first(['id','gps_status']);

                if(isset($gpsData->id) && $gpsData->gps_status == $gps){
                    $data = array();
                    $data['status'] = 'OK';
                    $data['message'] = 'Updated';
                    return response()->json($data, 200);
                }

                $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 getRemainingMonths($application_id){
        $application = ConsumerApplication::find($application_id);
        if(isset($application->created_at)) {
            $date = Carbon::parse($application->created_at);
            $now = Carbon::now();

            $diff = $date->diffInDays($now);
            return ($diff < 29) ? 3 : (($diff < 59) ? 2 : (($diff <= 90) ? 1 : 1));
        }
        return 1;
    }

    public function setTestEquifaxReport($id){

        $application = ConsumerApplication::find($id);
        if(isset($application->merchant_id) && ($application->merchant_id == 73)) {
            $creditfair = CreditReport::where('application_id', 1439)->first();
            $data = $creditfair->toArray();
            unset($data['id']);
            $creditfairOther = new CreditReport();
            $creditfairOther->fill($data);
            $creditfairOther->application_id = $id;

            if($application->mobile_number == 7874191148 || $application->mobile_number == 9820603150 || $application->mobile_number == 9898659586 || $application->mobile_number == 9822856259 || $application->mobile_number == 8384820006 || $application->mobile_number == 9820603150){
                //approval
            }elseif($application->mobile_number == 7304362961){
                //rejection
                $creditfairOther->TotalPastDue = 6000;
                $creditfairOther->Score = 12;
            }elseif($application->mobile_number == 8291919036 || $application->mobile_number == 9910695664){
                //normal
                $creditfairOther->Score = 700;
            }
            $creditfairOther->save();


            $foir = FOIR::where('application_id', 1439)->first();
            $data = $foir->toArray();
            unset($data['id']);
            $foirOther = new FOIR();
            $foirOther->fill($data);
            $foirOther->application_id = $id;
            $foirOther->save();

            $request = new Request();
            $request->attributes->add(['application_id'=>$id]);
            $response = (new ConsumerApplicationController())->getScoreCard($request);
            return false;
        }
        return true;
    }

    public function generateEquifax(Request $request){
        $request_data = ($request->request->get('data')) ? $request->request->get('data') : ($request->get('data') ? $request->get('data') : '');
        $session_string = $session_string = (isset($request_data->session_string)) ? explode("|", base64_decode($request_data->session_string)) : ($request->get('user') ? $request->get('user')['session_string'] : '');
        if(!isset($session_string[0])){
            $data = array();
            $data['status'] = 'FAIL';
            $data['message'] = 'Invalid Session data';
            return $data;
        }
        if($error = $this->validate_session($session_string))
        {
            return $error;
        }
        if(env('APP_CONNECTION') != 0) {

            if($this->setTestEquifaxReport($request_data->application_id)) {
                $applicationController = new ConsumerApplicationController();
                $applicationController->isRoot = false;
                // $applicationController->generateEqifaxReport($request_data->application_id);
                $applicationController->generateSoftBureauReport($request_data->application_id);
            }
        }
        $data = array();
        $data['status'] = 'OK';
        $data['message'] = 'Equifax Generated Successfully';
        return $data;
    }

    public function uploadDocumentForMerchant(Request $request){
        $request_data = ($request->request->get('data')) ? $request->request->get('data') : ($request->get('data') ? $request->get('data') : '');
        $session_string = $session_string = (isset($request_data->session_string)) ? explode("|", base64_decode($request_data->session_string)) :
            ($request->get('user') ? $request->get('user')['session_string'] : '');
        /*if(!isset($session_string[0])){
            $data = array();
            $data['status'] = 'FAIL';
            $data['message'] = 'Invalid Session data';
            return $data;
        }
        if($error = $this->validate_session($session_string))
        {
            return $error;
        }*/
        $request_all = $_FILES;
        $response_array = [];
        $application_id = isset($request_data->application_id) ? $request_data->application_id : (isset($request_data->id) ? $request_data->id : (isset($request_data->merchant_id) ? $request_data->merchant_id : $request->get('merchant_id')));
        foreach ($request_all as $key=>$file){
            $file_type_array = explode("|",$key);
            $files_type = str_replace("|0"," ",$key);
            $files_type = 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';
            }
            $response = PWAApplicationForm::uploadToS3ForMerchant(strtolower(trim($files_type)),$application_id,$request->file($key),$password);
            $response_array[] = ['filetype' => $files_type, 'status' => $response['status']];
        }

        $consumer_application_files = MerchantFiles::where('merchant_id',$application_id)->whereNull('type')->whereNull('deleted_at')->orderBy('created_at', 'asc')->get();
        if(isset($consumer_application_files[0])){
            foreach ($consumer_application_files as $consumer_application_file){
                $document = array();
                $document['extension'] = 'image';
                if(isset($consumer_application_file->file_path) && !empty($consumer_application_file->file_path)) {
                    $documentpatharray = explode('.', $consumer_application_file->file_path);
                    if(isset($documentpatharray[0])) {
                        $arraycount = count($documentpatharray);
                        if($documentpatharray[$arraycount-1] == 'pdf' || $documentpatharray[$arraycount-1] == 'PDF'){
                            $document['extension'] = 'pdf';
                        }
                    }
                }
                $document['title'] = ucfirst(str_replace("_"," ",$consumer_application_file->file_type));
                $full_path = '/consumer-application/get-documents/';
                $short_path = isset($consumer_application_file->file_path) && !empty($consumer_application_file->file_path) ? $consumer_application_file->file_path : $application_id.'/'.$consumer_application_file->file_type.'.pdf';
                $full_path .= $short_path;
                $full_path = str_replace('//','/',$full_path);
                $document['filepath'] = _env('ADMINURL', 'https://creditfair.in/admin').$full_path;
                $document['password'] =  isset($consumer_application_file->password) && !empty($consumer_application_file->password) ? $consumer_application_file->password : "";
                $documents[] = $document;
            }
            try {
                $application = Merchant::find($application_id);
                $link = 'https://creditfair.in/admin/merchants/edit/' . $application_id;
                (new Slack(new Request(['title' => 'New Document uploaded', 'fields' => ['Merchant' => $application->merchant_name, 'Application Link' => $link],'group' => 'customer_documents'])))->send();
            }catch (\Exception $e){

            }

            $data = array();
            $data['status'] = 'OK';
            $data['message'] = 'Documents Upload Successfully';
            $data['doc_response'] = $response_array;
            return $data;
        }
    }

    public function uploadDocument(Request $request){
        $request_data = ($request->request->get('data')) ? $request->request->get('data') : ($request->get('data') ? $request->get('data') : '');
        $request_data = is_object($request_data) ? $request_data : (object) $request_data;
        $session_string = $session_string = (isset($request_data->session_string)) ? explode("|", base64_decode($request_data->session_string)) : ($request->get('user') ? $request->get('user')['session_string'] : '');
        if(!isset($session_string[0])){
            $data = array();
            $data['status'] = 'FAIL';
            $data['message'] = 'Invalid Session data';
            return $data;
        }
        if($error = $this->validate_session($session_string))
        {
            return $error;
        }
        $request_all = $_FILES;
        $response_array = [];
        $application_id = isset($request_data->application_id) ? $request_data->application_id : $request_data->id;
        foreach ($request_all as $key=>$file){
            $file_type_array = explode("|",$key);
            $files_type = str_replace("|0"," ",$key);
            $files_type = 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';
            }
            $response = PWAApplicationForm::uploadToS3(strtolower(trim($files_type)),$application_id,$request->file($key),$password);
            $response_array[] = ['filetype' => $files_type, 'status' => $response['status']];
        }

        $consumer_application_files = ConsumerApplicationFiles::where('consumer_application_id',$application_id)->whereNull('deleted_at')->orderBy('created_at', 'asc')->get();
        if(isset($consumer_application_files[0])){
            foreach ($consumer_application_files as $consumer_application_file){
                $document = array();
                $document['extension'] = 'image';
                if(isset($consumer_application_file->file_path) && !empty($consumer_application_file->file_path)) {
                    $documentpatharray = explode('.', $consumer_application_file->file_path);
                    if(isset($documentpatharray[0])) {
                        $arraycount = count($documentpatharray);
                        if($documentpatharray[$arraycount-1] == 'pdf' || $documentpatharray[$arraycount-1] == 'PDF'){
                            $document['extension'] = 'pdf';
                        }
                    }
                }
                $document['title'] = ucfirst(str_replace("_"," ",$consumer_application_file->file_type));
                $full_path = '/consumer-application/get-documents/';
                $short_path = isset($consumer_application_file->file_path) && !empty($consumer_application_file->file_path) ? $consumer_application_file->file_path : $application_id.'/'.$consumer_application_file->file_type.'.pdf';
                $full_path .= $short_path;
                $full_path = str_replace('//','/',$full_path);
                $document['filepath'] = _env('ADMINURL', 'https://creditfair.in/admin').$full_path;
                $document['password'] =  isset($consumer_application_file->password) && !empty($consumer_application_file->password) ? $consumer_application_file->password : "";
                $documents[] = $document;
            }
            try {
                $application = ConsumerApplication::with('merchant', 'advisor')->where('id',$application_id)->first(['name','merchant_id','id', 'created_by']);
                $link = 'https://creditfair.in/admin/consumer-applications/edit/' . $application_id;
                $user_id = isset($session_string[2]) ? $session_string[2] : 0;
                $user = User::find($user_id);
                $userName = isset($user->name) ? $user->name : '';
                $advisor_id = isset($application->advisor) && isset($application->advisor->id) ? $application->advisor->id : '';
                $merchantName = isset($application->merchant) ? $application->merchant->merchant_name : '';
                (new Slack(new Request(['title' => 'New Document uploaded', 'fields' => ['Customer' => $application->name, 'Merchant Name' => $merchantName, 'Application Link' => $link, 'By' => $userName],'group' => 'customer_documents', 'tagging' => [$advisor_id]])))->send();
            }catch (\Exception $e){

            }
        }
        $data = array();
        $data['status'] = 'OK';
        $data['message'] = 'Documents Upload Successfully';
        $data['doc_response'] = $response_array;
        return $data;
    }

    public function getCompanyType(Request $request){
        $request_data = ($request->request->get('data')) ? $request->request->get('data') : ($request->get('data') ? $request->get('data') : '');
        $session_string = $session_string = (isset($request_data->session_string)) ? explode("|", base64_decode($request_data->session_string)) : ($request->get('user') ? $request->get('user')['session_string'] : '');
        if(!isset($session_string[0])){
            $data = array();
            $data['status'] = 'FAIL';
            $data['message'] = 'Invalid Session data';
            return $data;
        }
        if($error = $this->validate_session($session_string))
        {
            return $error;
        }
        $profession = ScoreCard::$professionTypeCreditFair;
        $data = array();
        $data['status'] = 'OK';
        $data['message'] = 'Company type list';
        $data['company_type'] = $profession;

        return $data;
    }

    public function getCompanyList(Request $request){
        $request_data = ($request->request->get('data')) ? $request->request->get('data') : ($request->get('data') ? $request->get('data') : '');
        if($request_data != "") {
            $session_string = $session_string = (isset($request_data->session_string)) ? explode("|", base64_decode($request_data->session_string)) : ($request->get('user') ? $request->get('user')['session_string'] : '');
            if(!isset($session_string[0])){
                $data = array();
                $data['status'] = 'FAIL';
                $data['message'] = 'Invalid Session data';
                return $data;
            }
            if($error = $this->validate_session($session_string))
            {
                return $error;
            }
            $data = $request_data->keyword;
            $companies_data = Company::where('company', 'LIKE', '%' . $data . '%')->limit(10)->get();
            $companies = array();
            foreach ($companies_data as $company) {
                $companies[] = ['id'=>$company->id, 'name'=>$company->company];
            }
            $data = array();
            $data['status'] = 'OK';
            $data['message'] = 'Company type list';
            $data['companies'] = $companies;
            return $data;
        }
    }

    /**
     * @param Request $request
     * @return array
     */
    public function getapplication(Request $request)
    {
        $this->sessionMerchant = null;
        $request_data = ($request->request->get('data')) ? $request->request->get('data') : ($request->get('data') ? $request->get('data') : '');
        if ($request_data != "") {

            $session_string = (isset($request_data->session_string)) ? explode("|", base64_decode($request_data->session_string)) : ($request->get('user') ? $request->get('user')['session_string'] : '');
            $data = array();
            if (!isset($session_string[0])) {
                $data['status'] = 'FAIL';
                $data['message'] = 'Invalid Session data';
                return $data;
            }
            if ($error = $this->validate_session($session_string)) {
                return $error;
            }

            $keyword = '';
            $dashboard_filter = (isset($request_data->dashboard_filters)) ? $request_data->dashboard_filters : "";

            $no_sort = (isset($request_data->no_sort)) ? $request_data->no_sort : false;

            $from_date = ($request_data->from_date) ? Carbon::createFromFormat('Y-m-d', $request_data->from_date)->startOfDay()->toDateTimeString() : Carbon::now()->startOfDay()->toDateTimeString();
            $to_date = ($request_data->to_date) ? Carbon::createFromFormat('Y-m-d', $request_data->to_date)->endOfDay()->toDateTimeString() : Carbon::now()->endOfDay()->toDateTimeString();

            if ($dashboard_filter == "") {
                $merchant_id = (isset($request_data->merchant_id) && $request_data->merchant_id != 0) ? $request_data->merchant_id : ((isset($session_string[0])) ? $session_string[0] : 0);
                $user_type = ((isset($session_string[5])) ? $session_string[5] : 0);
                $keyword = (isset($request_data->keyword)) ? $request_data->keyword : "";
                $status = (isset($request_data->status)) ? strtolower($request_data->status) : "";
                $duration = (isset($request_data->duration)  && $request_data->duration != "" ) ? $request_data->duration : "";
                /*if ($user_type == "admin") {
                    $center_id = (isset($request_data->center_id)) ? $request_data->center_id : 0;
                    $cfuser = 0;
                    $userid = (isset($request_data->executive_id)) ? $request_data->executive_id : 0;
                } else*/if ($user_type == "admin") {
                    $center_id = (isset($request_data->center_id)) ? $request_data->center_id : 0;
                    $cfuser = 0;
                    $userid = (isset($request_data->executive_id)) ? $request_data->executive_id : 0;
                } elseif ($user_type == "Merchant") {
                    $center_id = (isset($request_data->center_id)) ? $request_data->center_id : 0;
                    $userid = (isset($request_data->executive_id)) ? $request_data->executive_id : 0;
                    $cfuser = 0;
                } elseif ($user_type == "Center") {
                    $userid = (isset($request_data->executive_id)) ? $request_data->executive_id : 0;
                    $center_id = (isset($session_string[1])) ? $session_string[1] : 0;
                    $cfuser = 0;
                } else {
                    $center_id = 0;
                    $userid = (isset($session_string[2])) ? $session_string[2] : 0;
                    $cfuser = 0;
                }
                if($duration){
                    if($duration == 'day'){
                        $from_date = Carbon::now()->startOfDay()->toDateTimeString();
                        $to_date = Carbon::now()->endOfDay()->toDateTimeString();
                    }elseif($duration == 'week'){
                        $from_date = Carbon::now()->startOfWeek()->toDateTimeString();
                        $to_date = Carbon::now()->endOfWeek()->toDateTimeString();
                    }elseif($duration == 'month'){
                        $from_date = Carbon::now()->startOfMonth()->toDateTimeString();
                        $to_date = Carbon::now()->endOfMonth()->toDateTimeString();
                    }
                }
                if (isset($center_id) && $center_id != "" && $center_id != 0) {
                    if(strpos($center_id, '_merchant') !== false){
                        $merchant_id = explode('_merchant',$center_id)[0];
                        $center_id = 0;
                    }else{
                        ConsumerApplication::$center_id = $center_id;
                    }
                }
                $status_check = array();
                if (isset($this->statusgroup[$status])) {
                    $status_check = $this->statusgroup[$status];
                } else {
                    array_push($status_check, $status);
                    if ($status == 'approved') {
                        array_push($status_check, "disbursement checklist done");
                    }
                }
            } else {
                $dashboard_filter = json_decode(base64_decode($dashboard_filter));
                if(!isset($merchant_id) && $this->sessionMerchant){
                    $merchant_id = $this->sessionMerchant;
                }
            }
            $application_data_array = array();
            $application_data = ConsumerApplication::with('application_rating','application_element', 'application_element.merchant_center', 'merchant_comment', 'merchant_comment.user', 'proFormaInvoice')->whereNull('is_deleted');

            if ($dashboard_filter == "") {
                if (isset($merchant_id) && $merchant_id != "" && $merchant_id != 0) {
                    $anchorMerchant = $this->isAnchorMerchant($merchant_id);
                    $application_data = $application_data->whereIn('merchant_id', $anchorMerchant['merchant_ids']);
                }
                if (isset($userid) && $userid != "" && $userid != 0) {
                    $application_data = $application_data->where('src_representative_name', $userid);
                }
                if (isset($cfuser) && $cfuser != "" && $cfuser != 0) {
                    $application_data = $application_data->whereRaw('IF(pre_created_by != "", pre_created_by, created_by) = ?',$cfuser);
                }
                if ($keyword != "") {
                    $application_data = $application_data->whereHas('proFormaInvoice', function ($query) use ($keyword) {
                        $query->where('name', 'like', '%' . $keyword . '%')
                            ->orWhere('email', 'like', '%' . $keyword . '%')
                            ->orWhere('mobile_number', 'like', '%' . $keyword . '%')
                            ->orWhere('loan_application_no', 'like', '%' . $keyword . '%');
                    });
                }

                if(isset($status_check))
                {
                    $status_check = array_values(array_filter($status_check));
                    if ($status_check) {
                        $application_data = $application_data->whereIn('state', $status_check);
                    }
                }

                $application_data = $application_data->where('created_at', '>=', $from_date)->where('created_at', '<=', $to_date);
            } else {
                $application_data = $application_data->whereIn('id', $dashboard_filter);
            }

            $application_data = $application_data->select('id', 'name', 'loan_amount', 'state', 'created_at')->orderBy('created_at', 'desc')->limit(50)->get();

            if (isset($application_data[0]->name)) {
                foreach ($application_data as $application) {

                    if ($application->application_element) {

                        $files = ConsumerApplicationFiles::where('consumer_application_id', $application->id)/*->whereIn('file_type', ['electricity_bill','gas_bill','nach', 'agreement', 'loan_agreement_esign'])*/->get();
                        $filesArray = [];
                        if (count($files) > 0) {
                            foreach ($files as $file) {
                                $filesArray[] = isset($file->file_type) ? $file->file_type : '';
                            }
                        }

                        $nach = 0;
                        $pan_card = 0;
                        $agreement = 0;
                        $esign = 0;
                        $utility_bill = 0;
                        $self_attested = 0;
                        if (in_array('nach', $filesArray)) {
                            $nach = 1;
                        }
                        if (in_array('pan_card', $filesArray)) {
                            $pan_card = 1;
                        }
                        if (in_array('agreement', $filesArray)) {
                            $agreement = 1;
                        }
                        if (in_array('loan_agreement_esign', $filesArray)) {
                            $esign = 1;
                        }
                        if (in_array('self_attested', $filesArray)) {
                            $self_attested = 1;
                        }
                        if (in_array('electricity_bill', $filesArray)) {
                            $utility_bill = 1;
                        }else if (in_array('gas_bill', $filesArray)) {
                            $utility_bill = 1;
                        }

                        if (in_array($application->state, ['in-process', 'aborted', 'rejected', 'waiting for documents', 'form completed', 'incomplete', 'waiting for decision', 'cancelled'])) {
                            $nach = 2;
                            $pan_card = 2;
                            $agreement = 2;
                            $esign = 2;
                            $utility_bill = 2;
                            $self_attested = 2;
                        }



                        $consumerApplication = new ConsumerApplicationController();
                        $otherRequiredDocument = $consumerApplication->getOtherRequiredDocument($application);
                        $otherRequiredDocumentArray = [];

                        foreach($otherRequiredDocument as $otherDocument){
                            if (!in_array($otherDocument, ['nach','agreement','utility_bill'])) {
                                if (in_array($otherDocument, $filesArray) || in_array(str_replace(' ','_',$otherDocument), $filesArray)) {
                                    $otherRequiredDocumentArray[] = ["doc" => ucwords(str_replace('_',' ',strval($otherDocument))), 'value' => 1];
                                } else {
                                    $otherRequiredDocumentArray[] = ["doc" => ucwords(str_replace('_',' ',strval($otherDocument))), 'value' => 0];
                                }
                            }
                        }


                        $application_data_array[$application->id]['applicant_name'] = $application->name;
                        $application_data_array[$application->id]['loan_amount'] = str_replace('.00', '', money_format('%!i', $application->loan_amount));
                        $application_data_array[$application->id]['status'] = ucfirst($this->searchForId($application->state, $this->statusgroup));
                        $application_data_array[$application->id]['rating'] = (isset($application->application_rating) && isset($application->application_rating->rating)) ? $application->application_rating->rating : 0;
                        $application_data_array[$application->id]['color'] = isset($this->statuscolor[$this->searchForId($application->state, $this->statusgroup)]) ? $this->statuscolor[$this->searchForId($application->state, $this->statusgroup)] : '';
                        $application_data_array[$application->id]['customer_application_id'] = (isset($application->proFormaInvoice->loan_application_no)) ? $application->proFormaInvoice->loan_application_no : 0;
                        $application_data_array[$application->id]['created_at'] = date('d M Y', strtotime($application->created_at));
                        $application_data_array[$application->id]['original_created_at'] = $application->created_at;
                        $application_data_array[$application->id]['center'] = (isset($application->application_element->merchant_center->name)) ? $application->application_element->merchant_center->name : "";
                        $application_data_array[$application->id]['comment'] = (isset($application->merchant_comment->comment)) ? ApiController::getPureComment(new Request(['comment' =>$application->merchant_comment->comment]))['comment'] : "";
                        $application_data_array[$application->id]['commented_by'] = (isset($application->merchant_comment->user->name)) ? $application->merchant_comment->user->name : "";
                        $application_data_array[$application->id]['commented_on'] = (isset($application->merchant_comment->created_at)) ? date('d, F Y H:i:s', strtotime($application->merchant_comment->created_at)) : "";

                        if (!in_array($application->state, ['incomplete', 'form completed', 'in-process',/* 'waiting for documents',*/ 'waiting for decision', 'aborted', 'rejected'])) {
                            $pendingDoc = array(["doc" => 'NACH', 'value' => $nach], ["doc" => "PDC", 'value' => $agreement], ["doc" => "E-Sign", 'value' => $esign], ["doc" => "Utility Bill", 'value' => $utility_bill], ["doc" => "Self Attested", 'value' => $self_attested], ["doc" => "Pan Card", 'value' => $pan_card]);

                            if ($otherRequiredDocumentArray){
                                if(!in_array($application->state, ['waiting for documents', 'pre approved'])){
                                    $pendingDoc = array_merge($pendingDoc, $otherRequiredDocumentArray);
                                }else{
                                    $pendingDoc = $otherRequiredDocumentArray;
                                }
                                $application_data_array[$application->id]['pending'] = $pendingDoc;
                            }
                            if(!in_array($application->state,['waiting for documents'])){
                                $application_data_array[$application->id]['pending'] = $pendingDoc;
                            }
                        }
                    }
                }

                if($no_sort){
                    uasort($application_data_array, function($a, $b){
                        return $a['loan_amount'] < $b['loan_amount'];
                    });
                }

                if($application_data_array){
                    $data = array();
                    $data['status'] = 'OK';
                    $data['message'] = 'Application list';
                    $data['applications'] = $application_data_array;
                    return $data;
                }else {
                    $data = array();
                    $data['status'] = 'FAIL';
                    $data['message'] = 'No Data Found';
                    return $data;
                }
            }
        }

        $data = array();
        $data['status'] = 'FAIL';
        $data['message'] = 'No Data Found';
        return $data;
    }

    public function isAnchorMerchant($merchant_id){
        $merchants = Merchant::where('anchor_merchant_id',$merchant_id)->get(['id','merchant_name']);
        $isAnchorMerchant = false;
        $merchantIds[] = $merchant_id;
        $merchantList = [];
        foreach($merchants as $merchant){
            $isAnchorMerchant = true;
            $merchantIds[] = $merchant->id;
            $merchantList[] = $merchant;
        }

        if($isAnchorMerchant){
            return ['merchant_ids' => $merchantIds, 'anchor_merchant' => $merchantList];
        }else {
            return ['merchant_ids' => $merchant_id ? [$merchant_id] : 0];
        }
    }

    public function getApprovalDetails(Request $request)
    {
        $request_data = ($request->request->get('data')) ? $request->request->get('data') : ($request->get('data') ? $request->get('data') : '');

        if ($request_data != "") {
            $session_string = (isset($request_data->session_string)) ? explode("|", base64_decode($request_data->session_string)) : ($request->get('user') ? $request->get('user')['session_string'] : '');
            if (!isset($session_string[0])) {
                $data = array();
                $data['status'] = 'FAIL';
                $data['message'] = 'Invalid Session data';
                return $data;
            }
            if ($error = $this->validate_session($session_string)) {
                return $error;
            }
            $emi_date = (isset($request_data->emi_date)) ? $request_data->emi_date : "";

            if (($emi_date == "" || $emi_date == '1970-01-01')) {
                $data = array();
                $data['status'] = 'FAIL';
                $data['message'] = 'Please check First EMI Date';
                return $data;
            }

            $request = new Request();
            $application = ConsumerApplication::with('category', 'merchant', 'emi')->where('id', $request_data->application_id)->first();


            $consumer_application_controller = new ConsumerApplicationController();
            $isMultiLenderWhitelisted = $consumer_application_controller->isMultiLender($application->merchant_id);

            $currentStatus = 'approved';
            if ($isMultiLenderWhitelisted > 1){
                $currentStatus = 'cf approved';
            }


            $application->approved_amount = $application->loan_amount;
            $application->state = $currentStatus;
            $application->save();
            $emi_details = ApplicationEMICalculation::where('application_id', $request_data->application_id)->first();
            $emi_date = date('d/m/Y', strtotime($emi_date));
            if (!isset($emi_details->emi_date) || ((date('Y-m-d', strtotime($emi_details->emi_date)) != date('Y-m-d', strtotime($emi_date)))) || (env('APP_CONNECTION') == 0)) {
                $offer = MerchantOffers::where('id', $application->offer_id)->first(['interest_type_id']);
                $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
                    ]
                );

                (new ConsumerApplicationController())->generateEMI($request, $application, $request_data->application_id);
                $emi_details = ApplicationEMICalculation::where('application_id', $request_data->application_id)->first();

            }
            //$consumer_application = ConsumerApplication::where('id',$request_data->application_id)->first();

            ConsumerApplicationElement::where('application_id',$request_data->application_id)->update(['agreement_version' => 2]);

            StatusLogs::insert([
                'application_id' => $application->id,
                'user_id' => 107,
                'status' => $currentStatus,
                'created_at' => Carbon::now()->toDateTimeString()
            ]);
            $data = array();
            $data['status'] = 'OK';
            $data['application_id'] = $application->id;
//            $data['message'] = 'We are very happy to inform you that '.$application->name.'\'s. application for an Easy EMI plan has been approved! ';
            $data['message'] = 'Congratulations! '.$application->name.'\'s. Easy EMI plan has been approved! ';
//            $data['message_details'] = array();

            $data['message_details'] = [
                ['title' => 'Loan Amount Sanctioned', 'amount' => "Rs." . money_format('%!i', $application->approved_amount)],
                ['title' => 'Advance Payable', 'amount' => "Rs." . money_format('%!i', $emi_details->upfront_from_customer)],
                ['title' => 'Monthly installment amount', 'amount' => "Rs." . money_format('%!i', $emi_details->emi)],
                ['title' => 'Tenure (in months)', 'amount' => $emi_details->tenure . " EMIs"],
                ['title' => 'Rate of Interest', 'amount' => $emi_details->interest_rate . "% p.a."],
                ['title' => 'Processing Fee (Including GST)', 'amount' => "Rs." . $emi_details->processing_fee],
            ];

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


    public function updateApprovalDetails(Request $request){
        $request_data = ($request->request->get('data')) ? $request->request->get('data') : ($request->get('data') ? $request->get('data') : '');

        if ($request_data != "") {
            $session_string = (isset($request_data->session_string)) ? explode("|", base64_decode($request_data->session_string)) : ($request->get('user') ? $request->get('user')['session_string'] : '');
            if (!isset($session_string[0])) {
                $data = array();
                $data['status'] = 'FAIL';
                $data['message'] = 'Invalid Session data';
                return $data;
            }
            if($error = $this->validate_session($session_string))
            {
                return $error;
            }
//            $emi_date = (isset($request_data->emi_date) ) ? $request_data->emi_date : "";
//
//            if(($emi_date == "" || $emi_date == '1970-01-01')){
//                $data = array();
//                $data['status'] = 'FAIL';
//                $data['message'] = 'Please check First EMI Date';
//                return $data;
//            }

            $applicationData = ConsumerApplication::where('id', $request_data->application_id)->first(['merchant_id']);

            $consumer_application_controller = new ConsumerApplicationController();
            $isMultiLenderWhitelisted = $consumer_application_controller->isMultiLender($applicationData->merchant_id);

            $currentStatus = 'approved';
            if ($isMultiLenderWhitelisted > 1){
                $currentStatus = 'cf approved';
            }

            $user_id = $session_string[2];
            $user = User::where('id',$user_id)->first(['name']);
            $consumer_application_controller = new ConsumerApplicationController();
            $consumer_application_controller->sendslackmessage($request_data->application_id,$currentStatus,'','- By Mobile App',$user->name);
//            if(env('APP_CONNECTION') != 0) {

                if($currentStatus == 'approved') {
                    $consumer_application_controller->sendSanctionLetter($request_data->application_id);
                    $consumer_application_controller->sendProForma($request_data->application_id);
                    $consumer_application_controller->proformaSigningNotification($request_data->application_id);
                    $consumer_application_controller->creditLimitNotification($request_data->application_id);
                    $consumer_application = ConsumerApplication::find($request_data->application_id);
                    $consumer_application_controller->whatsAppCommunication($consumer_application, $currentStatus);
                    $consumer_application_controller->ApprovalInit(null, $consumer_application->id, true);
                }
//            }
            $data['status'] = 'OK';
            $data['message'] = 'Dashboard';
            return $data;
        }
        $data = array();
        $data['status'] = 'FAIL';
        $data['message'] = 'Please check request data';
        return $data;
    }

    public function getdashboard(Request $request)
    {
        $request_data = ($request->request->get('data')) ? $request->request->get('data') : ($request->get('data') ? $request->get('data') : '');
        if ($request_data != "") {

            $session_string = (isset($request_data->session_string)) ? explode("|", base64_decode($request_data->session_string)) : ($request->get('user') ? $request->get('user')['session_string'] : '');

            if (!isset($session_string[0])) {
                $data = array();
                $data['status'] = 'FAIL';
                $data['message'] = 'Invalid Session data';
                return $data;
            }
            if($error = $this->validate_session($session_string))
            {
                return $error;
            }
            $merchant_id = $parent_merchant = (isset($request_data->merchant_id) && $request_data->merchant_id != "") ? $request_data->merchant_id : ((isset($session_string[0])) ? $session_string[0] : 0);
            $user_type = (isset($session_string[5])) ? $session_string[5] : 0;
            $from_date = (isset($request_data->from_date) && $request_data->from_date != "" ) ? $request_data->from_date : date('Y-m-d');
            $to_date = (isset($request_data->to_date)  && $request_data->to_date != "" ) ? $request_data->to_date : date('Y-m-d');
            $duration = (isset($request_data->duration)  && $request_data->duration != "" ) ? $request_data->duration : "";
            $cfuser = 0;
            /*if($user_type == "admin"){
                $center_id = (isset($request_data->center_id) ) ? $request_data->center_id : 0;
                $cfuser = 0;
                $userid = (isset($request_data->executive_id) && $request_data->executive_id != "") ? $request_data->executive_id : 0;
            }else*/if($user_type == "admin"){
                $center_id = (isset($request_data->center_id) && $request_data->center_id != "" ) ? $request_data->center_id : 0;
                $cfuser = 0;
                $userid = (isset($request_data->executive_id) && $request_data->executive_id != "") ? $request_data->executive_id : 0;
            }elseif($user_type == "Merchant"){
                $center_id = (isset($request_data->center_id) && $request_data->center_id != ""  ) ? $request_data->center_id : 0;
                if(strpos($center_id, '_merchant') !== false){
                    $anchor_merchant_id = $merchant_id = explode('_merchant',$center_id)[0];
                    $center_id = 0;
                }
                $cfuser = 0;
                $userid = (isset($request_data->executive_id) && $request_data->executive_id != "" ) ? $request_data->executive_id : 0;
            }elseif($user_type == "Center"){
                $userid = (isset($request_data->executive_id) && $request_data->executive_id != "" ) ? $request_data->executive_id : 0;
                $cfuser = 0;
                $center_id = (isset($session_string[1])) ? $session_string[1] : 0;
            }else{
                $center_id = 0;
                $userid = (isset($session_string[2])) ? $session_string[2] : 0;
            }

            if (!isset($anchor_merchant_id)){
                $isAnchorMerchant = $this->isAnchorMerchant($parent_merchant);
                if (isset($isAnchorMerchant['merchant_ids'])){
                    $merchant_id = $isAnchorMerchant['merchant_ids'];
                }
            }


            if($duration){
                if($duration == 'day'){
                    $from_date = Carbon::now()->startOfDay()->toDateString();
                    $to_date = Carbon::now()->endOfDay()->toDateString();
                }elseif($duration == 'week'){
                    $from_date = Carbon::now()->startOfWeek()->toDateString();
                    $to_date = Carbon::now()->endOfWeek()->toDateString();
                }elseif($duration == 'month'){
                    $from_date = Carbon::now()->startOfMonth()->toDateString();
                    $to_date = Carbon::now()->endOfMonth()->toDateString();
                }
            }

            $dashboard_request = array();
            $dashboard_request['from_date'] = $from_date;
            $dashboard_request['to_date'] = $to_date;

            $applications = ConsumerApplication::whereIn('state', ['form completed','in-process', 'waiting for documents', 'approved']);

            if($merchant_id != 0){
                $dashboard_request['merchant_id'] = $merchant_id;
                $applications = $applications->where('merchant_id', $merchant_id);
            }
            if($center_id != 0){
                $dashboard_request['center_id'] = $center_id;
                $applications = $applications->where('merchant_location_id', $center_id);
            }
            if($userid != 0){
                $dashboard_request['executive_id'] = $userid;
                $applications = $applications->where('src_representative_name', $userid);
            }
            if($cfuser != 0){
                $dashboard_request['user_id'] = $cfuser;
                $applications = $applications->where('user_id', $cfuser);
            }


            $applications = $applications->whereNull('is_deleted')->orderBy('created_at', 'desc')
                ->limit(20)->get(['id']);

            $request = new Request($dashboard_request);
            $dashboard= (new Dashboard($request));
            $applicationsProcessed = $dashboard->getLoanApplicationProcessed();
            $applicationsApproved = $dashboard->getLoanApplicationByStatusV1('approved');
//            $applicationsAbort = $dashboard->getLoanApplicationByStatusV1('aborted');
//            $applicationsRejected = $dashboard->getLoanApplicationByStatusV1('rejected');
            $applicationsDisbursementTime = $dashboard->getDisbursement();


            $appl = [];
            foreach ($applications as $app){
                array_push($appl, $app->id);
            }

            $sorted_applications = ConsumerApplication::whereIn('id', $appl)->orderByRaw("CAST(loan_amount AS UNSIGNED) DESC")->get(['id', 'name', 'loan_amount', 'state']);

            $apps = [];
            $total_la = 0;
            $total_pending_la = 0;
            $total_app_ids = array();
            foreach ($sorted_applications as $key => $app){
                if($key<3){
                    $apps[$key]['name'] = $app->name;
                    $apps[$key]['loan_amount'] = number_format($app->loan_amount);
                    $apps[$key]['status'] = $app->state;
                    $apps[$key]['application_id'] = base64_encode(json_encode($app->id));
                    $apps[$key]['doc'] = (new Admin\ConsumerApplicationController)->getOtherRequiredDocument($app);
                    $total_la += (int)$app->loan_amount;
                }
                $total_pending_la += $app->loan_amount;
                array_push($total_app_ids,$app->id);
            }

            $dashboard = [
                array(
                    'title1' => 'Applications Sent',
                    'icon' => 'sent',
                    'count' => str_replace('.00','',money_format('%!i',$applicationsProcessed['processed_application'])),
                    'title2' => 'Value of applications Sent',
                    'value' => '&#8377;'.PWAApplicationForm::getAmountInLac(($applicationsProcessed['value_processed_application'])),
                    'applications' => base64_encode(json_encode($applicationsProcessed['application_ids']))
                ),
//                array(
//                    'title' => 'Value of applications Sent',
//                    'count' => '&#8377;'.PWAApplicationForm::getAmountInLac(($applicationsProcessed['value_processed_application'])),
//                    'applications' => base64_encode(json_encode($applicationsProcessed['application_ids']))
//                ),
                array(
                    'title1' => 'Applications Approved',
                    'icon' => 'approve',
                    'count' => str_replace('.00','',money_format('%!i',$applicationsApproved[0])),
                    'title2' => 'Value of loans approved',
                    'value' => '&#8377;'.PWAApplicationForm::getAmountInLac($applicationsApproved[1]),
                    'applications' => base64_encode(json_encode($applicationsApproved[2]))
                ),
//                array(
//                    'title' => 'Value of loans approved',
//                    'count' => '&#8377;'.PWAApplicationForm::getAmountInLac($applicationsApproved[1]),
//                    'applications' => base64_encode(json_encode($applicationsApproved[2]))
//                ),
                array(
                    'title1' => 'Applications Disbursed',
                    'icon' => 'disburse',
                    'count' => str_replace('.00','',money_format('%!i',$applicationsDisbursementTime[1])),
                    'title2' => 'Value of loans Disbursed',
                    'value' => '&#8377;'.PWAApplicationForm::getAmountInLac($applicationsDisbursementTime[3]),
                    'applications' => base64_encode(json_encode($applicationsDisbursementTime[4]))
                ),
                array(
                    'title1' => 'Pending Applications',
                    'icon' => 'pending_app',
                    'count' => count($total_app_ids),
                    'title2' => 'Value of open loans',
                    'value' => '&#8377;'.PWAApplicationForm::getAmountInLac($total_pending_la),
                    'applications' => base64_encode(json_encode($total_app_ids))
                ),
//                array(
//                    'title' => 'Value of loans Disbursed',
//                    'count' => '&#8377;'.PWAApplicationForm::getAmountInLac($applicationsDisbursementTime[3]),
//                    'applications' => base64_encode(json_encode($applicationsDisbursementTime[4]))
//                ),
//                array(
//                    'title' => 'Applications Rejected',
//                    'icon' => 'reject',
//                    'count' => str_replace('.00','',money_format('%!i',$applicationsRejected[0])),
//                    'applications' => base64_encode(json_encode($applicationsRejected[2]))
//                ),
//                array(
//                    'title' => 'Applications Aborted',
//                    'icon' => 'abort',
//                    'count' => str_replace('.00','',money_format('%!i',$applicationsAbort[0])),
//                    'applications' => base64_encode(json_encode($applicationsAbort[2]))
//                )
            ];

//            $apps[] = money_format('%!i',$total_la);

            $data['total_loan_amount'] = $apps != [] && !empty($apps) && $total_la > 0 ? number_format($total_la) : 0;
            $data['applications'] = $dashboard;
//            $data['pending_app_ids'] = base64_encode(json_encode($total_app_ids));
            $data['pending_app_ids'] = json_encode($total_app_ids);
            $data['pending_app'] = $apps;
            $data['status'] = 'OK';
            $data['message'] = 'Dashboard';
            return $data;

        }
        $data = array();
        $data['status'] = 'FAIL';
        $data['message'] = 'No Data Found';
        return $data;
    }

    public function getStatus(Request $request){
        $request_data = ($request->request->get('data')) ? $request->request->get('data') : ($request->get('data') ? $request->get('data') : '');
        if ($request_data != "") {
            $session_string = (isset($request_data->session_string)) ? explode("|", base64_decode($request_data->session_string)) : ($request->get('user') ? $request->get('user')['session_string'] : '');

            if (!isset($session_string[0])) {
                $data = array();
                $data['status'] = 'FAIL';
                $data['message'] = 'Invalid Session data';
                return $data;
            }
            if($error = $this->validate_session($session_string))
            {
                return $error;
            }
            $merchant_id = (isset($session_string[0])) ? $session_string[0] : 0;
            $user_type = (isset($session_string[5])) ? $session_string[5] : 0;
            $center_id = (isset($session_string[1])) ? $session_string[1] : 0;
            $user_data = array();
            $center_data = array();
            $merchant_data = array();
            $executive_data = array();

            if ($user_type  == 'admin') {
                $merchant_data = Merchant::where('status','active')->where('is_guest_active', 1)->whereNull('deleted_at')->select('id', 'merchant_name', 'category_id')->orderBy('merchant_name', 'asc')->get();
                $leads = Leads::whereNull('deleted_at')->get();
                foreach($leads as $value) {
                    $merchant_data[] = $value;
                }

//                $products = Products::whereNull('deleted_at')->get();

                $center_data_arrays = Merchant::with('centers')->where('is_guest_active', 1)->where('status','active')->whereNull('deleted_at')->select('id')->orderBy('merchant_name', 'asc')->get();
                foreach ($center_data_arrays as $center_data_array){
                    if(count($center_data_array->centers) > 0){
                        $center_data[$center_data_array->id] = $center_data_array->centers;
                    }
                }
                $user_data = User::where('merchant_id','>',0)->whereNotNull('center_id')->whereNull('deleted_at')->select('id', 'name','merchant_id', 'center_id', 'user_type')->orderBy('name', 'asc')->get();
                foreach ($user_data as $executive) {
                    if ($executive->user_type == 4) {
                        if ($executive->center_id == null || $executive->center_id == "") {
                            $executive_data[$executive->merchant_id]['NA'][] = $executive;
                        } else {
                            $executive_data[$executive->merchant_id][$executive->center_id][] = $executive;
                        }
                    }
                };
            }
            else{
                if (strtolower($user_type) == 'merchant' || strtolower($user_type) == "center") {
                    $anchorMerchant = $this->isAnchorMerchant($merchant_id);
                    $user_data = User::whereIn('merchant_id', is_array($anchorMerchant['merchant_ids']) ? $anchorMerchant['merchant_ids'] : [$anchorMerchant['merchant_ids']])->whereNull('deleted_at');
                    if (isset($center_id) && $center_id != "" && $center_id != 0) {
                        $user_data = $user_data->where('center_id', $center_id);
                    }
                    $user_data = $user_data->select('id', 'name', 'center_id','user_type','merchant_id')->orderBy('name', 'asc')->get();
                }
                $executive_data = array();
                foreach ($user_data as $executive) {
                    if ($executive->user_type == 4) {
                        if ($executive->center_id == null || $executive->center_id == "") {
                            $executive_data[$executive->merchant_id]['NA'][] = $executive;
                        } else {
                            $executive_data[$executive->merchant_id][$executive->center_id][] = $executive;
                        }
                    }
                }

                if (strtolower($user_type) == 'merchant') {
                    $centerLists = MerchantLocation::where('merchant_id', $merchant_id)->whereNull('deleted_at')->select('id', 'name', 'merchant_id')->orderBy('name', 'asc')->get();
                    if(isset($centerLists[0]->id)) {
                        $center_data[$merchant_id] = ($centerLists) ? $centerLists : [];
                    }

                    if (isset($anchorMerchant['anchor_merchant'])){
                        foreach ($anchorMerchant['anchor_merchant'] as $item) {
                            $center_data[$merchant_id][] = ['id' => $item->id . '_merchant', 'name' => $item->merchant_name, 'merchant_id' => $item->id];
                        }
                    }
                }

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




//            $status = array();
//
//            foreach ($this->statusgroup as $key=>$value){
//                array_push($status,ucfirst($key));
//            }

//            $data['show_prodID'] =($merchant_category == 6 || $merchant_category == 7) ? 1 : 0 ;

            //$status = array('incomplete','form completed','in-process','waiting for documents','waiting for decision','approved','ready for disbursement', 'disbursed', 'rejected','aborted');
            $status = array_map('ucfirst', array_keys($this->statusgroup));
            $states = StateModel::get(['name','id']);
            $category = MerchantCategory::get(['id', 'name']);
            $data = array();
            $data['status'] = 'OK';
            $data['status_data'] = $status;
            $data['merchant_data'] = $merchant_data;
            $data['executive_data'] = $executive_data;
            $data['product_list'] = isset($product_list) ? $product_list : '';
            $data['center_data'] = $center_data;
            $data['states'] = $states;
            $data['category'] = $category;
            return $data;
        }
        $data = array();
        $data['status'] = 'FAIL';
        $data['message'] = 'No Data Found';
        return $data;
    }

    public function getProducts(Request $request){
        try {
            $request_data = ($request->request->get('data')) ? $request->request->get('data') : ($request->get('data') ? $request->get('data') : '');
            if ($request_data != "") {
                $session_string = (isset($request_data->session_string)) ? explode("|", base64_decode($request_data->session_string)) : ($request->get('user') ? $request->get('user')['session_string'] : '');
                if (!isset($session_string[0])) {
                    $data = array();
                    $data['status'] = 'FAIL';
                    $data['message'] = 'Invalid Session data';
                    return $data;
                }
                if ($error = $this->validate_session($session_string)) {
                    return $error;
                }

                if(isset($request_data->merchant_id)){
                    $products = Products::where('merchant_id', $request_data->merchant_id)->whereNull('deleted_at')->get();
                    $product_list = [];
                    foreach ($products as $prod){
                        $offers = ProductOffers::where('product_id', $prod->id)->whereNull('deleted_at')->get();
                        if(count($offers) > 0){
                            $product_list[]= $prod;
                        }
                    }
                    $data = array();
                    $data['status'] = 'OK';
                    $data['product_list'] = isset($product_list) ? $product_list : '';
                    return $data;
                }
            }
            $data = array();
            $data['status'] = 'FAIL';
            $data['message'] = 'No Data Found';
            return $data;
        }catch (\Exception $e){
//            (new Slack(new Request(['title' => 'Error Testing', 'fields' => ['l' => $e->getLine(), 'm' => $e->getMessage(), 'f' => $e->getFile(), 't' => $e->getTraceAsString()]])))->send();
        }
    }

    public function getApplicationData(Request $request)
    {
        try {
            $request_data = ($request->request->get('data')) ? $request->request->get('data') : ($request->get('data') ? $request->get('data') : '');
            if ($request_data != "") {
                $session_string = (isset($request_data->session_string)) ? explode("|", base64_decode($request_data->session_string)) : ($request->get('user') ? $request->get('user')['session_string'] : '');
                if (!isset($session_string[0])) {
                    $data = array();
                    $data['status'] = 'FAIL';
                    $data['message'] = 'Invalid Session data';
                    return $data;
                }
                if ($error = $this->validate_session($session_string)) {
                    return $error;
                }
                $summary = array();
                $identification_details = array();
                $current_address = array();
                $permanent_address = array();
                $incomedetails = array();
                $documents = array();
                $user_type = (isset($session_string[5])) ? $session_string[5] : 0;
                $userid = (isset($session_string[2])) ? $session_string[2] : 0;
                $merchant_id = (isset($session_string[0])) ? $session_string[0] : 0;

                $application_id = (isset($request_data->application_id)) ? $request_data->application_id : 0;
                $consumer_application = ConsumerApplication::with('creditReport','application_element', 'merchant', 'proFormaInvoice', 'application_element.merchant_center', 'advisor', 'Checklist', 'merchant_comment', 'merchant_comment.user')->where('id', $application_id)->first();

                $merchant_resepentative = User::where('id', $consumer_application->src_representative_name)->first(['name']);

                $consumer_application_files = ConsumerApplicationFiles::where('consumer_application_id', $application_id)
                    ->whereIn('file_type', [
                        'pan_card', 'aadhar_card', 'electricity_bill', 'pro_forma_invoice', 'proforma', 'itr', 'bank_statement', 'nach', 'agreement', 'loan_agreement_esign', 'original_seen', 'original_seen_verified', 'lotus_pay_physical_MNTH'
                    ])
                    ->whereNull('deleted_at')->orderBy('created_at', 'asc')->get();
                $nach = 0;
                $pan_card = 0;
                $esign = 0;
                $agreement = 0;
                $self_attested = 0;
                $electricity_bill = 0;
                $gas_bill = 0;
                $pro_forma_invoice = false;
                $originalSeen_file = false;
                $signedProforma = false;
                $originalSeen = false;
                $dataProforma = [];
                $dataSignedProforma = [];
                $dataSigned = [];

                $disbursementLogs = DisbursementLogs::where('application_id', $application_id)->get();

                foreach ($disbursementLogs as $disbursementLog) {
                    $dataSigned[$application_id . '/' . $disbursementLog->phase . '/proforma'] = 0;
                }

                $hashids = new Hashids('Creditfair by CS', 20);
                $consumerApplicationController = new ConsumerApplicationController();
                if (isset($consumer_application_files[0])) {
                    foreach ($consumer_application_files as $consumer_application_file) {
                        if (strtolower(trim($consumer_application_file->file_type)) == trim('nach')) {
                            $nach = 1;
                        }
                        if (strtolower(trim($consumer_application_file->file_type)) == trim('pan_card')) {
                            $pan_card = 1;
                        }
                        if (strtolower(trim($consumer_application_file->file_type)) == trim('agreement')) {
                            $agreement = 1;
                        }
                        if (strtolower(trim($consumer_application_file->file_type)) == trim('self_attested')) {
                            $self_attested = 1;
                        }
                        if (strtolower(trim($consumer_application_file->file_type)) == trim('electricity_bill')) {
                            $electricity_bill = 1;
                        }
                        if (strtolower(trim($consumer_application_file->file_type)) == trim('gas_bill')) {
                            $gas_bill = 1;
                        }
                        if (strtolower(trim($consumer_application_file->file_type)) == trim('loan_agreement_esign')) {
                            $esign = 1;
                        }
                        $document = array();
                        $document['extension'] = 'image';
                        if (isset($consumer_application_file->file_path) && !empty($consumer_application_file->file_path)) {
                            $documentpatharray = explode('.', $consumer_application_file->file_path);
                            if (isset($documentpatharray[0])) {
                                $arraycount = count($documentpatharray);
                                if ($documentpatharray[$arraycount - 1] == 'pdf' || $documentpatharray[$arraycount - 1] == 'PDF') {
                                    $document['extension'] = 'pdf';
                                }
                            }
                        }
                        $title = $consumer_application_file->file_type == 'lotus_pay_physical_MNTH' ? 'Pre-filled NACH' : $consumer_application_file->file_type;
                        $document['title'] = ucfirst(str_replace("_", " ", $title));
                        $full_path_string = $full_path = '/consumer-application/get-documents/';
                        $short_path = isset($consumer_application_file->file_path) && !empty($consumer_application_file->file_path) ? $consumer_application_file->file_path : $application_id . '/' . $consumer_application_file->file_type . '.pdf';
                        $full_path .= $short_path;
                        $full_path = str_replace('//', '/', $full_path);
                        $document['filepath'] = _env('ADMINURL', 'https://creditfair.in/pwa') . $full_path;//.'/'.$hashids->encode(Carbon::now()->addMinutes(30)->timestamp);
                        $document['password'] = isset($consumer_application_file->password) && !empty($consumer_application_file->password) ? $consumer_application_file->password : "";

                        /*if (strtolower(trim($consumer_application_file->file_type)) == trim('proforma')) {
                            $signedProforma = 1;
                            $file_path_trim = preg_replace('/^([^.]*).*$/', '$1', $consumer_application_file->file_path);
                            if (in_array($file_path_trim, $dataSigned)){
                                $dataSigned[$file_path_trim] = 1;
                            }
                        }*/

                        if (strtolower(trim($consumer_application_file->file_type)) == trim('original_seen_verified')) {
                            $originalSeen = 1;
                        }
                        
                        if (strtolower(trim($consumer_application_file->file_type)) == trim('pro_forma_invoice') && $consumer_application_file->show_to_merchant == 1) {
                            $dataProforma[$document['filepath']] = 0;
                        }

                        if (strtolower(trim($consumer_application_file->file_type)) == trim('proforma')) {
                            $dataSignedProforma[] = str_replace('proforma', 'pro_forma_invoice', $consumer_application_file->file_path);
                        }

                        /*if (strtolower(trim($consumer_application_file->file_type)) == trim('pro_forma_invoice') && $signedProforma == false) {
                            $pro_forma_invoice = $document['filepath'];
                        }*/
                        if (strtolower(trim($consumer_application_file->file_type)) == trim('original_seen') && $originalSeen == false) {
                            $originalSeen_file = $document['filepath'];
                        }
                        $documents[] = $document;
                    }
                }


//                $deleted_proforma = ConsumerApplicationFiles::where('consumer_application_id', $application_id)
//                    ->where('file_type', 'proforma')->withTrashed()->get();
//                foreach ($deleted_proforma as $file) {
//                    if (strtolower(trim($file->file_type)) == trim('proforma') && !empty($file->deleted_at) && !in_array($consumer_application->state, ['disbursed', 'nach registered'])) {
//                        $dataSignedProforma[] = str_replace('proforma', 'pro_forma_invoice', $file->file_path);
//                    }
//                }

                $signedProformaLists = [];


//                foreach ($dataProforma as $dataSignedKey => $dataSignedItem) {
//                    if (isset($full_path_string) && (in_array(explode($full_path_string, $dataSignedKey)[1], $dataSignedProforma))) {
//                        $signedProformaLists[] = 1;
//                        unset($dataProforma[$dataSignedKey]);
//                    }
//                }

                $counter = 0;
                foreach ($dataProforma as $dataSignedKey => $dataSignedItem) {
                    if(count($dataSignedProforma) > $counter) {
                        if (isset($full_path_string)/* && (in_array(explode($full_path_string, $dataSignedKey)[1], $dataSignedProforma) ||
                                count($dataProforma) === count($dataSignedProforma))*/) {
                            $signedProformaLists[] = 1;
                            // unset($dataProforma[$dataSignedKey]);
                        }
                    }
                    $counter++;
                }

                $counter = 0;
                if ($dataProforma) {
                    foreach ($dataProforma as $dataSignedKey => $dataSignedItem) {
                        if(count($dataSignedProforma) == 0 || count($dataSignedProforma) > $counter) {
                            if (!$dataSignedItem) {
                                $signedProforma = 0;
                                $pro_forma_invoice = $dataSignedKey;
                                $signedProformaLists[] = $dataSignedKey;
                                break;
                            } else {
                                $signedProforma = 1;
                            }
                        }
                        $counter++;
                    }
                }


                $approved_status_array = ['approved', 'disbursement checklist done', 'ready for disbursement', 'disbursement query','disbursed', 'nach registered', 'rejected', 'aborted'];


                $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;
                        }
                    }
                }



                $disable_edit = false;
                if (in_array($consumer_application->state, $approved_status_array)) {
                    $disable_edit = true;
                    if ($nach == 0) {
                        $document = array();
                        $document['title'] = ucfirst(str_replace("_", " ", 'nach'));
                        $document['type'] = 'nach';
                        $document['filepath'] = '';
                        $documents[] = $document;
                    }

                    if ($pan_card == 0) {
                        $document = array();
                        $document['title'] = ucfirst(str_replace("_", " ", 'pan_card'));
                        $document['type'] = 'pan_card';
                        $document['filepath'] = '';
                        $documents[] = $document;
                    }

                    if ($agreement == 0) {
                        $document = array();
                        $document['title'] = ucfirst(str_replace("_", " ", 'agreement'));
                        $document['type'] = 'agreement';
                        $document['filepath'] = '';
                        $documents[] = $document;
                    }

                    if ($self_attested == 0) {
                        $document = array();
                        $document['title'] = ucfirst(str_replace("_", " ", 'self_attested'));
                        $document['type'] = 'self_attested';
                        $document['filepath'] = '';
                        $documents[] = $document;
                    }

                    if ($electricity_bill == 0) {
                        $document = array();
                        $document['title'] = ucfirst(str_replace("_", " ", 'electricity_bill'));
                        $document['type'] = 'electricity_bill';
                        $document['filepath'] = '';
                        $documents[] = $document;
                    }

                    if ($gas_bill == 0) {
                        $document = array();
                        $document['title'] = ucfirst(str_replace("_", " ", 'gas_bill'));
                        $document['type'] = 'gas_bill';
                        $document['filepath'] = '';
                        $documents[] = $document;
                    }

                    $document = array();
                    $document['title'] = 'Other Document';
                    $document['type'] = 'other';
                    $document['filepath'] = '';
                    $documents[] = $document;

                    $docsRequired = $consumerApplicationController->getOtherRequiredDocument($consumer_application);

                    if ($docsRequired) {

                        $consumerApplication_files = ConsumerApplicationFiles::where('consumer_application_id', $application_id)
                            ->whereNull('deleted_at')->orderBy('created_at', 'asc')->get(['file_type'])->toArray();

                        $consumerApplication_files = array_values(array_map(function ($item) {
                            return $item['file_type'];
                        }, $consumerApplication_files));
                        foreach ($docsRequired as $value) {
                            if (!in_array($value, ['emandate', 'cpv', 'electricity_bill', 'gas_bill'])) {
                                if (!in_array(str_replace(' ', '_', $value), $consumerApplication_files) && !in_array($value, $consumerApplication_files)) {
                                    $document = array();
                                    $document['title'] = ucfirst(str_replace("_", " ", $value));
                                    $document['type'] =  $value;
                                    $document['filepath'] = '';
                                    $documents[] = $document;
                                }
                            }
                        }
                    }
                }


                if (!$disable_edit && $user_type != 5) {
                    if ($merchant_id > 0 && $merchant_id != $consumer_application->merchant_id) {
                        $disable_edit = true;
                    }
                }

                try {
                    $creditLine = new CreditLine(new Request(['id' => $application_id]));
                    $creditLimit = $creditLine->getCreditData();
                    $summary['creditLimit'] = $this->searchForId($consumer_application->state, $this->statusgroup) === 'approved' && $creditLimit['max_loan_amount_to_sanction_basis_ml'] > $consumer_application->loan_amount ?
                        str_replace('.00', '', money_format('%!i', round($creditLimit['max_loan_amount_to_sanction_basis_ml']))) : 'error';
                } catch (\Exception $e) {
                    $summary['creditLimit'] = 'error';
                }


                $summary['customer_application_id'] = (isset($consumer_application->proFormaInvoice->loan_application_no)) ? $consumer_application->proFormaInvoice->loan_application_no : 0;
                $summary['application_date'] = date('d M Y', strtotime($consumer_application->created_at));
                $summary['application_status'] = ucfirst($this->searchForId($consumer_application->state, $this->statusgroup));
                $summary['loan_amount'] = str_replace('.00', '', money_format('%!i', $consumer_application->loan_amount));
                $summary['center'] = (isset($consumer_application->application_element->merchant_center->name)) ? $consumer_application->application_element->merchant_center->name : "";
                $summary['merchant_representative'] = (isset($merchant_resepentative->name)) ? $merchant_resepentative->name : "";
                $summary['merchant_name'] = (isset($consumer_application->merchant->merchant_name)) ? $consumer_application->merchant->merchant_name : "";
//            $summary['nach'] = $nach;
//            $summary['pdc'] = $agreement;
//            $summary['esign'] = $esign;
                //$summary['pending'] = array(["doc"=>'NACH', 'value'=>$nach],["doc"=>"PDC", 'value'=>$agreement],["doc"=>"E-Sign",'value'=>$esign]);

                $summary['adviser'] = (isset($consumer_application->advisor->name)) ? $consumer_application->advisor->name : "";
                $summary['adviser_contact'] = (isset($consumer_application->advisor->mobile_number)) ? $consumer_application->advisor->mobile_number : "";
                $summary['name'] = $consumer_application->name;
                $summary['phone'] = $consumer_application->mobile_number;
                $summary['email'] = $consumer_application->email;
                $summary['merchant_id'] = $consumer_application->merchant_id;
                $summary['center_id'] = $consumer_application->application_element ? $consumer_application->application_element->center_id : '';
                $summary['caller_lists'] = $consumerApplicationController->getCallerLists($consumer_application, $userid, true);
                $caseReviewStatus = Comments::where('application_id', $application_id)->whereNotNull('request_review')->get();
                $summary['case_reviewed'] = count($caseReviewStatus) > 0 ? true : false;

                $comments = Comments::with('user')->where('application_id', $application_id);
                if ($user_type == "Merchant" || $user_type == "Center" || $user_type == "Executive") {
                    $comments = $comments->where('show_merchant', 1);
                }
                $comments = $comments->orderBy('created_at', 'asc')->get();
                $summary['comment'] = array();
                if (isset($comments[0])) {
                    foreach ($comments as $application_comment) {

                        $pureComment = ApiController::getPureComment(new Request(['comment' => $application_comment->comment]))['comment'];

                        if (!isset($application_data['summary']['_comment'])) {
                            $summary['_comment'] = $pureComment;
                            $summary['_commented_by'] = date('d, F Y H:i:s', strtotime($application_comment->created_at));
                            $summary['_commented_on'] = $application_comment->user->name;
                        }

                        $comment['comment'] = $pureComment;
                        $comment['commented_on'] = date('d, F Y H:i:s', strtotime($application_comment->created_at));
                        $comment['commented_by'] = $application_comment->user->name;
                        array_push($summary['comment'], $comment);
                    }
                }


            $product_name = isset($consumer_application->application_element) && $consumer_application->application_element->product_name ? $consumer_application->application_element->product_name : '';
            $product_name = $consumerApplicationController->getProductName($product_name, $consumer_application->state);


            if(!empty($product_name)) {
                $product = explode(',', $product_name);
                $prod_id = Products::whereIn('name', $product)->where('merchant_id', $consumer_application->merchant_id)->whereNull('deleted_at')->get(['id']);
                $productIds = [];
                foreach ($prod_id as $_product) {
                    $productIds[] = $_product->id;
                }
            }

            if($this->checkDuplicateApplication($consumer_application) && $consumer_application->state === 'form completed'){
                $disable_edit = true;
            }



            $identification_details['name'] = $consumer_application->name;
            $identification_details['pan'] = $consumer_application->pan_card;
            $identification_details['disableName'] = $disableName;
            $identification_details['disablePanNumber'] = $disablePanNumber;
            $identification_details['disableCoName'] = $disableCoName;
            $identification_details['disableCoPanNumber'] = $disableCoPanNumber;
            $identification_details['dob'] = $consumer_application->dob;
            $identification_details['gender'] = $consumer_application->gender;
            $identification_details['phone'] = $consumer_application->mobile_number;
            $identification_details['email'] = $consumer_application->email;
            $identification_details['loan_amount'] = $consumer_application->loan_amount;
            //$identification_details['tenure'] = $consumer_application->tenure;
            $identification_details['unique_id_number'] = isset($consumer_application->application_element) ? $consumer_application->application_element->unique_id_number : '';
            $identification_details['preferred_language'] = isset($consumer_application->application_element) ? $consumer_application->application_element->preferred_language : '';
            $identification_details['offer_id'] = $consumer_application->offer_id;
            $identification_details['product_name'] = isset($prod_id) && count($prod_id) < 1 ? $product_name : '';
            $identification_details['p_name'] = isset($prod_id) && count($prod_id) > 0 ? $product_name : 'Others';
            $identification_details['product_id'] = isset($prod_id) &&count($prod_id) > 0 ?  (isset($productIds) ? implode(',', $productIds) : $prod_id) : 'others';

//            $identification_details['product_id'] = empty($productIds) ? 'others' : ($productIds ? implode(',', $productIds) : $prod_id);

                $duration = isset($consumer_application->application_element) ? $consumer_application->application_element->duration : '';
                if ($duration !== '') {
                    $duration_split = explode('|', $duration);
                    $month = isset($duration_split[0]) ? $duration_split[0] : '';
                    $year = isset($duration_split[1]) ? $duration_split[1] : '';
                }
                $identification_details['duration_year'] = isset($year) ? $year : '';
                $identification_details['duration_month'] = isset($month) ? $month : '';


                $current_address['address_text'] = $consumer_application->application_element->current_address_text;
                $current_address['formatted_text'] = $consumer_application->application_element->current_formatted_text;
                $current_address['city'] = $consumer_application->current_address_city;
                $current_address['state'] = $consumer_application->current_address_state;
                $current_address['pin_code'] = $consumer_application->current_address_pincode;
                $current_address['address_type'] = $consumer_application->current_address_status;
                $current_address_lat_long = explode(",", $consumer_application->application_element->current_address_lat_long);
                $current_address['lat'] = (isset($current_address_lat_long[0])) ? $current_address_lat_long[0] : "";
                $current_address['long'] = (isset($current_address_lat_long[1])) ? $current_address_lat_long[1] : "";

                $permanent_address['address_text'] = $consumer_application->application_element->permanent_address_text;
                $permanent_address['formatted_text'] = $consumer_application->application_element->permanent_formatted_text;
                $permanent_address['city'] = $consumer_application->permanent_address_city;
                $permanent_address['state'] = $consumer_application->permanent_address_state;
                $permanent_address['pin_code'] = $consumer_application->permanent_address_pincode;
                $permanent_address['address_type'] = $consumer_application->permanent_address_status;
                $permanent_address_lat_long = explode(",", $consumer_application->application_element->permanent_address_lat_long);
                $permanent_address['lat'] = (isset($permanent_address_lat_long[0])) ? $permanent_address_lat_long[0] : "";
                $permanent_address['long'] = (isset($permanent_address_lat_long[1])) ? $permanent_address_lat_long[1] : "";

                $company_details = array();
                $company = Company::where('id', $consumer_application->company_name)->first();
                if (isset($company->company)) {
                    $company_details['name'] = $company->company;
                }
                $company_details['id'] = $consumer_application->company_name;

                $incomedetails['profession_type'] = $consumer_application->employee_status;
                $incomedetails['net_monthly_income'] = $consumer_application->monthly_income;
                $incomedetails['company_name'] = $company_details;
                $incomedetails['doj'] = (isset($consumer_application->Checklist->joining_date) && $consumer_application->Checklist->joining_date) ? date('Y-m', strtotime($consumer_application->Checklist->joining_date)) : '';
                $incomedetails['company_type'] = isset($consumer_application->application_element->profession_type) ? ScoreCard::$professionTypeCreditFair[$consumer_application->application_element->profession_type]['valueS'] : '';
                $incomedetails['designation'] = isset($consumer_application->application_element->designation) ? $consumer_application->application_element->designation : '';
                $incomedetails['department'] = isset($consumer_application->application_element->department) ? $consumer_application->application_element->department : '';
                $incomedetails['contact'] = isset($consumer_application->application_element->contact) ? $consumer_application->application_element->contact : '';


            $application_data = array('id' => $application_id, 'summary' => $summary, 'identification_details' => $identification_details, 'address_details' => array('current_address' => $current_address, 'permanent_address' => $permanent_address), 'income_details' => $incomedetails, 'documents' => $documents, 'disable_edit' => $disable_edit, 'proforma_list' => $signedProformaLists, 'accept_proforma' => ($signedProforma == 0) ? $pro_forma_invoice : $signedProforma /*, 'accept_original_seen' => ($originalSeen == 0) ? $originalSeen_file : $originalSeen*/);

                //$application_data['summary']['_comment'] = (isset($consumer_application->merchant_comment->comment)) ? $consumer_application->merchant_comment->comment  : "";
                //$application_data['summary']['_commented_by'] = (isset($consumer_application->merchant_comment->user->name)) ? $consumer_application->merchant_comment->user->name  : "";
                //$application_data['summary']['_commented_on'] = (isset($consumer_application->merchant_comment->created_at)) ? date('d, F Y H:i:s',strtotime($consumer_application->merchant_comment->created_at))  : "";


                $data = array();
                $data['status'] = 'OK';
                $data['message'] = 'Application Details';
                $data['data'] = $application_data;
                return $data;
            }
        }catch (\Exception $e){
            (new Slack(new Request(['title' => 'Error Testing', 'fields' => ['l' => $e->getLine(), 'm' => $e->getMessage(), 'f' => $e->getFile(), 't' => $e->getTraceAsString()]])))->send();
        }
        $data = array();
        $data['status'] = 'FAIL';
        $data['message'] = 'No Data Found';
        return $data;

    }

    public function checkDuplicateApplication($consumer_application){
        $application = 0;
//        $repeatPeriod = \Carbon\Carbon::now()->subMonth(3)->toDateTimeString();
        $repeatPeriod = date('Y-m-d-H:i:s', strtotime($consumer_application->created_at. ' - 3 month'));
        if($consumer_application->pan  || $consumer_application->email || $consumer_application->mobile_number || $consumer_application->aadhaar_card || $consumer_application->pan_card){
            if(!empty($consumer_application->pan)) {
                $application = ConsumerApplication::where('pan_card', $consumer_application->pan)->where('id', '!=', $consumer_application->id)->where('created_at', '>=', $repeatPeriod)->whereNull('is_deleted')->orderBy('created_at', 'desc')->first(['id']);
            }
            if(!empty($consumer_application->pan_card)) {
                $application = ConsumerApplication::where('pan_card', $consumer_application->pan_card)->where('id', '!=', $consumer_application->id)->where('created_at', '>=', $repeatPeriod)->whereNull('is_deleted')->orderBy('created_at', 'desc')->first(['id']);
            }
            if(!empty($consumer_application->email)) {
                if (!isset($application->id)) {
                    $application = ConsumerApplication::where('email', $consumer_application->email)->where('id', '!=', $consumer_application->id)->where('created_at', '>=', $repeatPeriod)->whereNull('is_deleted')->orderBy('created_at', 'desc')->first(['id']);
                }
            }
            if(!empty($consumer_application->mobile_number)) {
                if (!isset($application->id)) {
                    $application = ConsumerApplication::where('mobile_number', $consumer_application->mobile_number)->where('id', '!=', $consumer_application->id)->where('created_at', '>=', $repeatPeriod)->whereNull('is_deleted')->orderBy('created_at', 'desc')->first(['id']);
                }
            }
            if(!empty($consumer_application->aadhaar_card)) {
                if (!isset($application->id)) {
                    $application = ConsumerApplication::where('aadhaar_card', $consumer_application->aadhaar_card)->where('id', '!=', $consumer_application->id)->where('created_at', '>=', $repeatPeriod)->whereNull('is_deleted')->orderBy('created_at', 'desc')->first(['id']);
                }
            }

            if(isset($application->id)) {
                return true;
            }
        }
        return false;
    }

    public function acceptProforma(Request $request){
        $request_data = ($request->request->get('data')) ? $request->request->get('data') : ($request->get('data') ? $request->get('data') : '');
        if ($request_data != "") {
            $session_string = (isset($request_data->session_string)) ? explode("|", base64_decode($request_data->session_string)) : ($request->get('user') ? $request->get('user')['session_string'] : '');
            $document_type = (isset($request_data->document_type)) ? $request_data->document_type : "";
            if (!isset($session_string[0])) {
                $data = array();
                $data['status'] = 'FAIL';
                $data['message'] = 'Invalid Session data';
                return $data;
            }
            if($error = $this->validate_session($session_string))
            {
                return $error;
            }
            $signedBy =  $session_string[2];
            $isSigned = false;
            if ($document_type == 'original_seen') {
                $isSigned = $this->signMerchantOriginalSeenManually($request_data->application_id, $signedBy);
            }elseif ($document_type == 'proforma'){
                $isSigned = $this->signMerchantProformaManually($request_data->application_id, $signedBy);
            }
            if($isSigned) {
                $data = array();
                $data['status'] = 'OK';
                $data['message'] = ($document_type == 'proforma') ? 'We\'v successfully accepted the disbursement advice' : 'We\'v successfully accepted the Original Seen & Verified';
                return $data;
            }
        }

        $data = array();
        $data['status'] = 'FAIL';
        $data['message'] = 'Can\'t Accept Proforma at this time';
        return $data;
    }

    public static function getUserTypeString($user_type){
        return ($user_type == 2) ? 'Merchant' : (($user_type == 3) ? 'Center Head' : (($user_type == 4) ? 'Center Executive' : (($user_type == 1) ? 'Consumer' : 'Admin')));
    }

    public function signMerchantOriginalSeenManually($application_id, $signedBy){
        $request = new Request();
        $request->request->add([
            'type' => 'Original Seen',
            'bot' => true
        ]);
        $document = (new ConsumerDocument($request));
        $documentDetails = $document->getDocument($application_id);
        $user = User::where('id',$signedBy)->first(['name', 'user_type']);
        $consent = [
            'consent' => $user->name.' signed this agreement at '.date('h:s A',strtotime('now')).' on '.date('d-M-Y',strtotime('now')),
            'name' => $user->name,
            'position' => static::getUserTypeString($user->user_type),
        ];
        if($documentDetails['user']['purpose_of_the_loan'] != 'Personal Loan') {
            $pdf = App::make('snappy.pdf.wrapper');
            $pdf->loadView('admin.documents.original_seen_and_verified_merchant', $documentDetails, ['consent' => $consent])->setOption('encoding', 'UTF-8')->setPaper('a4')->setOrientation('portrait');
            $document->uploadToS3('original_seen_verified', $application_id, $pdf->output());
            return true;
        }

        return false;
    }

    public function signMerchantProformaManually($application_id, $signedBy, $position=null){
        $request = new Request();
        $request->request->add([
            'type' => 'Pro Forma Invoice',
            'request_type' => 'acceptance',
            'bot' => true
        ]);
        $document = (new ConsumerDocument($request));
        $documentDetails = $document->getDocument($application_id);
        $user = User::where('id',$signedBy)->first(['name', 'user_type']);
        $consent = [
            'consent' => isset($user) ? $user->name: $signedBy.' signed this agreement at '.date('h:s A',strtotime('now')).' on '.date('d-M-Y',strtotime('now')),
            'name' => isset($user) ? $user->name: $signedBy,
            'position' => isset($user) ? static::getUserTypeString($user->user_type): $position,
        ];

        $documentDetails = $this->proformaDisbursementPhase($documentDetails, $application_id);

        if (isset($documentDetails['user']['disbursement_phase'])) {
            $request->request->add(['properties' => $documentDetails['user']]);
        }

        if($documentDetails['user']['purpose_of_the_loan'] != 'Personal Loan') {
            $pdf = App::make('snappy.pdf.wrapper');
            $pdf->loadView('admin.documents.per_forma_invoice', $documentDetails, ['consent' => $consent])->setOption('encoding', 'UTF-8')->setPaper('a4')->setOrientation('portrait');
            $document->uploadToS3('proforma', $application_id, $pdf->output());
            return true;
        }

        return false;
    }

    public function proformaDisbursementPhase($documentDetails, $application_id){
        $isMultiPhase = false;
        $total_disbursed_phases = 0;
        $next_phase_to_disburse = null;

        $application = ConsumerApplication::where('id', $application_id)->first(['offer_id']);

        $offer_id = $application->offer_id;
        $disbursementOffers = DisbursementOffers::where('application_id', $application_id)->where('offer_id', $offer_id)->orderBy('phase','asc')->get();
        $total_phases = count($disbursementOffers);

        if ($total_phases > 0) {
            $isMultiPhase = true;
            $offer_ids = [];
            foreach ($disbursementOffers as $offer) {
                $offer_ids[] = $offer->id;
            }
            $disbursementLogs = DisbursementLogs::where('application_id', $application_id)->whereIn('disbursement_offer_id', $offer_ids)->orderBy('phase', 'asc')->get();
            $total_disbursed_phases = count($disbursementLogs);
            

          // Identify which phase is going to disburse now
            $disbursedPhases = $disbursementLogs->pluck('phase')->toArray();
            for ($phase = 1; $phase <= $total_phases+1; $phase++) {
                if (!in_array($phase, $disbursedPhases)) {
                    $next_phase_to_disburse = $phase;
                    break;
                }
            }
        }

        if ($isMultiPhase && $next_phase_to_disburse != null) {
            if ($next_phase_to_disburse > 1){
                $next_phase_to_disburse = $next_phase_to_disburse - 1;
            }
            $disbursementOffers = DisbursementOffers::where('application_id', $application_id)->where('phase',$next_phase_to_disburse)->get();
        }else{
            $disbursementOffers = DisbursementOffers::where('application_id', $application_id)->get();
        }

        if ($disbursementOffers) {
            $application = ConsumerApplication::with('emi','merchant','application_element.merchant_center')->where('id',$application_id)->first();
            foreach ($disbursementOffers as $disbursementOfferKey => $disbursementOffer) {
                $dataSigned = $application_id . '/' . $disbursementOffer->phase . '/proforma';
                $consumer_application_file = ConsumerApplicationFiles::where('consumer_application_id', $application_id)->where('file_type', 'proforma')
                    ->where('file_path', 'like','%'. $dataSigned .'%')->first(['id']);
                    if (isset($consumer_application_file->id)) {
                        // Delete the file if it exists
                        $consumer_application_file->delete();
                    }
                    // Proceed with the existing logic if the file does not exist
                    $documentDetails['user'] = (new MultiStageDisbursement())->getPartialDisbursementData($application, $documentDetails['user'], ($disbursementOffer->phase));
                    break;
            }
        }
        return $documentDetails;
    }

    public function callBackRequest(Request $request){
        $request_data = ($request->request->get('data')) ? $request->request->get('data') : ($request->get('data') ? $request->get('data') : '');
        if ($request_data != "") {
            $session_string = (isset($request_data->session_string)) ? explode("|", base64_decode($request_data->session_string)) : ($request->get('user') ? $request->get('user')['session_string'] : '');
            if (!isset($session_string[0])) {
                $data = array();
                $data['status'] = 'FAIL';
                $data['message'] = 'Invalid Session data';
                return $data;
            }
            if($error = $this->validate_session($session_string))
            {
                return $error;
            }
            $mobile_number = $request_data->mobile_number;
            $message = $request_data->message;

            if (strlen($mobile_number) == 12 && substr($mobile_number, 0, 2) == "91") {
                $mobile_number = substr($mobile_number, 2, 10);
            }

            if(strlen($mobile_number != 10)){
                $data = array();
                $data['status'] = 'FAIL';
                $data['message'] = 'Invalid Mobile Number';
                return $data;
            }

//            if(_env('APP_CONNECTION') == 0){
//                return true;
//            }
            $field =array();
            array_push($field,array('title'=>"Number","value"=> $mobile_number,"short" => true));
            array_push($field,array('title'=>"Message","value"=> $message,"short" => true));
            $user_id = $session_string[2];
            $user = User::where('id',$user_id)->first(['name']);
            $payload = json_encode(array('text'=>'Callback Requested on Mobile App', "username" => $user->name,'attachments'=>array(array('fields'=>$field))));
            $curl = curl_init();
            curl_setopt_array($curl, array(
                CURLOPT_URL => "https://hooks.slack.com/services/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",
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_ENCODING => "",
                CURLOPT_MAXREDIRS => 10,
                CURLOPT_TIMEOUT => 30,
                CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
                CURLOPT_CUSTOMREQUEST => "POST",
                CURLOPT_POSTFIELDS => "payload=".$payload,
                CURLOPT_HTTPHEADER => array(
                    "Content-Type: application/x-www-form-urlencoded",
                ),
            ));

            $response = curl_exec($curl);
            $err = curl_error($curl);

            curl_close($curl);

            $data = array();
            $data['status'] = 'OK';
            $data['message'] = 'We will get back to you as soon as possible';
            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 = (Input::has('referee')) ? Input::get('referee') : '';
        $latitude = (Input::has('latitude')) ? Input::get('latitude') :'';
        $longitude = (Input::has('longitude')) ? Input::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((Input::has('session_string')) ? Input::get('session_string') : ""));
        if ($request_data != "" ||  $ref == 'android') {
            $user_id = (isset($session_string[2])) ? $session_string[2] : 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 fcmRegistrationForPWA(Request $request){
        $ref = (Input::has('referee')) ? Input::get('referee') : "Mobile App";
        $request_data = ($request->request->get('data')) ? $request->request->get('data') : ($request->get('data') ? $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';
                $fcm_id = (Input::has('token')) ? Input::get('token') : "";
                $device_type = 'android';
            }
            $session_string = (isset($request_data->session_string)) ? explode("|", base64_decode($request_data->session_string)) :  explode("|", base64_decode((Input::has('session_string')) ? Input::get('session_string') : ""));
            if (!isset($session_string[0])) {
                $data = array();
                $data['status'] = 'FAIL';
                $data['message'] = 'Invalid Session data';
                return $data;
            }
            if($error = $this->validate_session($session_string))
            {
                return $error;
            }
            $user_id = (isset($session_string[2])) ? $session_string[2] : 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 fcmRegistration(Request $request){
        $ref = (Input::has('referee')) ? Input::get('referee') : "Mobile App";
        $request_data = ($request->request->get('data')) ? $request->request->get('data') : ($request->get('data') ? $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';
                $fcm_id = (Input::has('token')) ? Input::get('token') : "";
                $device_type = 'android';
            }
            $session_string = (isset($request_data->session_string)) ? explode("|", base64_decode($request_data->session_string)) :  explode("|", base64_decode((Input::has('session_string')) ? Input::get('session_string') : ""));
            if (!isset($session_string[0])) {
                $data = array();
                $data['status'] = 'FAIL';
                $data['message'] = 'Invalid Session data';
                return $data;
            }
            if($error = $this->validate_session($session_string))
            {
                return $error;
            }
            $user_id = (isset($session_string[2])) ? $session_string[2] : 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 CreateUser(Request $request){
        $request_data = ($request->request->get('data')) ? $request->request->get('data') : ($request->get('data') ? $request->get('data') : '');
        if ($request_data != "") {
            $session_string = (isset($request_data->session_string)) ? explode("|", base64_decode($request_data->session_string)) : ($request->get('user') ? $request->get('user')['session_string'] : '');
            if (!isset($session_string[0])) {
                $data = array();
                $data['status'] = 'FAIL';
                $data['message'] = 'Invalid Session data';
                return $data;
            }
            if ($error = $this->validate_session($session_string)) {
                return $error;
            }

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

                $userData = User::where('mobile_number', $request_data->phone)->first(['id']);
                if(isset($userData->id)){
                    $data = array();
                    $data['status'] = 'FAIL';
                    $data['message'] = 'User Already added';
                }else if(strlen($request_data->phone) != 10) {
                    $data = array();
                    $data['status'] = 'FAIL';
                    $data['message'] = 'Please enter a valid Mobile Number';
                }else {
                    $user = new \App\User();
                    $user->name = $request_data->uname;
                    $user->username = str_replace(' ', '', strtolower($request_data->uname));
                    $user->email = null;
                    $user->mobile_number = $request_data->phone;
                    $user->user_type = ($request_data->utype == 2) ? 4 : ($request_data->utype == 0 ? 2 : 3);
                    $user->merchant_id = $request_data->merchant_id;
                    $user->center_id = isset($request_data->center) && !empty($request_data->center) ? $request_data->center : 0;
                    $user->password = bcrypt(123456);
                    $user->save();
                    $data = array();
                    $data['status'] = 'OK';
                    $data['message'] = 'User successfully added';
                }
            }catch (\Exception $e){
                $data = array();
                $data['status'] = 'FAIL';
                $data['message'] = 'Please add proper details';
            }

            return $data;
        }
    }

    public function addComments(Request $request){
        $request_data = ($request->request->get('data')) ? $request->request->get('data') : ($request->get('data') ? $request->get('data') : '');
        if ($request_data != "") {
            $session_string = (isset($request_data->session_string)) ? explode("|", base64_decode($request_data->session_string)) : ($request->get('user') ? $request->get('user')['session_string'] : '');
            if (!isset($session_string[0])) {
                $data = array();
                $data['status'] = 'FAIL';
                $data['message'] = 'Invalid Session data';
                return $data;
            }
            if ($error = $this->validate_session($session_string)) {
                return $error;
            }

            $user_id = (isset($session_string[2])) ? $session_string[2] : 0;
            $application_id = isset($request_data->application_id) ? $request_data->application_id : 0;
            $_comment = isset($request_data->comment) ? $request_data->comment : 0;
            $requestCaseReview = isset($request_data->requestCaseReview) ? $request_data->requestCaseReview : false;

            if($application_id > 0 && $user_id > 0){
                $comment = new Comments();
                $comment->application_id = $application_id;
                $comment->user_id = $user_id;
                $comment->comment = $_comment;
                $comment->show_merchant = 1;
                $comment->request_review = $requestCaseReview ? 0 : null;
                $comment->save();

                $user = User::where('id',$user_id)->first(['name']);
                $consumer = ConsumerApplication::with('merchant', 'advisor')->where('id',$application_id)->first();

                $merchant_name = $consumer->merchant ? $consumer->merchant->merchant_name : '';
                $application_link = asset("admin/consumer-applications/edit/" . $application_id);

                if($requestCaseReview){
                    $requested_by = User::where('id', $user_id)->first(['name']);
                    $application_rejected_by = StatusLogs::where('application_id', $application_id)->where('status', 'rejected')->first(['user_id']);
                    $application_waiting_documents_by = StatusLogs::where('application_id', $application_id)->where('status', 'waiting for documents')->first(['user_id']);
                    if(isset($application_rejected_by->user_id)){
                        $rejected_by_name = User::where('id', $application_rejected_by->user_id)->first(['name']);
                        $message = $requested_by->name." has requested review of case a status changed from waiting for decision to waiting for documents by ".$rejected_by_name->name.". \nReason for request:".$request->get('request_reason');
                    }
                    else if(isset($application_waiting_documents_by->user_id)) {
                        $waiting_documents_by_name = User::where('id', $application_waiting_documents_by->user_id)->first(['name']);
                        $message = $requested_by->name." has requested review of case a status changed from waiting for decision to waiting for documents by ".$waiting_documents_by->name.". \nReason for request:".$request->get('request_reason');
                    }
                    else{
                        $application_approved_by = StatusLogs::where('application_id', $application_id)->where('status', 'approved')->first(['user_id']);
                        $approved_by_name = User::where('id', $application_approved_by->user_id)->first(['name']);
                        $message = $requested_by->name." has requested review of a case approved by ".$approved_by_name->name.". \nReason for request: ".$_comment;
                    }

                    (new Slack(new Request(['title' => 'Case Review Request', 'fields' => ['Message' => $message, 'application_id' => $application_id, 'link' => $application_link], 'group' => Slack::$CASE_REVIEWS])))->send();
                }else{
                    $advisor_id = isset($consumer->advisor) && isset($consumer->advisor->id) ? $consumer->advisor->id : '';
                    $slack_url = isset($consumer->advisor) && isset($consumer->advisor->slack_url) ? $consumer->advisor->slack_url : '';
                    (new \App\Slack(new \Illuminate\Http\Request(['title'=>'New Comment from Merchant','fields'=>['User Name' =>$user->name,'Customer Name' => $consumer->name,'Merchant Name' => $merchant_name,'Comment' => $_comment,'Application Link'=> $application_link],'group'=>'loan_application', 'tagging' => [$advisor_id]])))->send();

                    (new \App\Slack(new \Illuminate\Http\Request(['title'=>'New Comment from Merchant','fields'=>['User Name' =>$user->name,'Customer Name' => $consumer->name,'Merchant Name' => $merchant_name,'Comment' => $_comment,'Application Link'=> $application_link],'group'=>$slack_url])))->send();
                }


                $data = array();
                $data['status'] = 'OK';
                $data['message'] = 'Comment added!';
                return $data;
            }
        }

        $data = array();
        $data['status'] = 'FAIL';
        $data['message'] = 'Can\'t save comment at this time.';
        return $data;
    }

    function searchForId($id, $array) {
        foreach ($array as $key => $val) {
            foreach ($val as $status) {
                if ($status === $id) {
                    return $key;
                }
            }
        }
        return null;
    }

    public function guestSession(Request $request){

        $request_data = ($request->request->get('data')) ? $request->request->get('data') : ($request->get('data') ? $request->get('data') : '');
        if ($request_data != "") {
            $requestOriginal = $request;
            $request = new Request((array) $request_data);

            if($request->has('doc_rejected') && $request->get('doc_rejected')){
                $merchantExisting = User::where('mobile_number', $request->get('phone'))->first(['id']);
                if (!isset($merchantExisting->id) && !empty($request->get('email'))) {
                    $merchantExisting = User::where('email', $request->get('email'))->first(['id']);
                }

                if($request->has('document')){
                    //(new ConsumerApplicationController())->uploadConsumerDocuments($request , $merchantData->id, 'merchant');
                    $requestOriginal->request->add(['request_id_type'=> 'merchant_id','merchant_id' => $merchantExisting->id]);
                    $responseData = $this->uploadDocumentForMerchant($requestOriginal);

                    if(isset($responseData)){
                        return $responseData;
                    }else {
                        $data = array();
                        $data['status'] = 'OK';
                        $data['message'] = 'OTP sent';
                        return $data;
                    }
                }else{
                    if (isset($merchantExisting->id)) {
                        $data = array();
                        $data['status'] = 'FAIL';
                        $data['message'] = 'You are already a member';
                        return $data;
                    }
                }
            } else {

                $merchantExisting = User::where('mobile_number', $request->get('phone'))->first(['id']);
                if (!isset($merchantExisting->id) && !empty($request->get('email'))) {
                    $merchantExisting = User::where('email', $request->get('email'))->first(['id']);
                }

                if (isset($merchantExisting->id)) {
                    $data = array();
                    $data['status'] = 'FAIL';
                    $data['message'] = 'You are already a member';
                    return $data;
                }

                $pan_number = $request->has('pan') && $request->get('pan') ? $request->get('pan') : "";

                if ($pan_number != "" && PWAApplicationForm::pan_format_validation($pan_number) != "Valid") {
                    $data = array();
                    $data['status'] = 'FAIL';
                    $data['message'] = 'Invalid PAN number';
                    return $data;
                }

                $merchant = new Merchant();
                $code = (new MerchantController())->getReferralCode();

                $merchantCategory = MerchantCategory::all();

                $_industry_type = 10;

                $industry_type = $request->get('industry_type');

                foreach ($merchantCategory as $mCategory) {
                    if (strtolower($mCategory->name) == strtolower($industry_type)) {
                        $_industry_type = $mCategory->id;
                    }
                }

                $_company_type = '';
                $company_type = $request->get('company_type');
                if ($company_type == 'Private Limited') {
                    $_company_type = 'private limited';
                } else if ($company_type == 'Sole Proprietorship') {
                    $_company_type = 'sole prop';
                } else if ($company_type == 'Unregistered Partnership') {
                    $_company_type = 'unregistered';
                } else if ($company_type == 'Registered Partnership') {
                    $_company_type = 'registered';
                } else if ($company_type == 'HUF/AOP') {
                    $_company_type = 'huf/aop';
                } else if ($company_type == 'Unlisted Public Limited') {
                    $_company_type = 'upl';
                } else if ($company_type == 'Listed Public Limited') {
                    $_company_type = 'lpl';
                } else if ($company_type == 'Limited Liability Partnership') {
                    $_company_type = 'llp';
                } else if ($company_type == 'Non Profit Company / Foundation') {
                    $_company_type = 'nonprofit';
                }
                $slug = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 5);
                $merchantSlug = Merchant::where('slug', $slug)->first();
                if (isset($merchantSlug->id)) {
                    $slug = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 5);
                }

                $address = $request->has('address') && $request->get('address') ? $request->get('address') : '';
                $landmark = $request->has('landmark') && $request->get('landmark') ? $request->get('landmark') : '';
                $city = $request->has('city') && $request->get('city') ? $request->get('city') : '';
                $state_name = $request->has('state_name') && $request->get('state_name') ? $request->get('state_name') : '';

                $merchant->fill([
                    'official_merchant_name' => $request->get('company_name'),
                    'merchant_name' => $request->get('company_name'),
                    'slug' => $slug,
                    'title' => $request->get('designation'),
                    'contact_number' => $request->get('phone'),
                    'status' => 'active',
                    'email' => $request->get('email'),
                    'pan_card' => $pan_number,
                    'gst_number' => $request->has('gst_number') && $request->get('gst_number') ? $request->get('gst_number') : null,
                    'address' => $address,
                    'state' => $state_name,
                    'city' => $city,
                    'category_id' => $_industry_type,
                    'type_of_firm' => $_company_type,
                    'owner_name' => $request->get('fullname'),
                    'is_guest_active' => 0,
                    'financial_partner' => $request->get('partner_name') == '' ? 'No' : $request->get('partner_name')
                ]);

                if ($request->has('referee')) {
                    $merchant->referred_by = $request->get('referee');
                }
                $merchant->save();

                //            GST Info
                if (isset($merchant->id) && $request->get('gst_authentication')) {
                    $karzaAPI = KarzaAPI::where('merchant_id', $merchant->id)->first(['id']);
                    if (!isset($karzaAPI->id)) {
                        $karzaAPI = new KarzaAPI();
                        $karzaAPI->data = $request->get('gst_authentication');
                        $karzaAPI->merchant_id = $merchant->id;
                        $karzaAPI->gstin = $request->get('gst_number');
                        $karzaAPI->created_at = \Carbon\Carbon::now()->toDateTimeString();
                        $karzaAPI->user_id = 0;
                        $karzaAPI->save();
                    }
                }


                $merchantData = Merchant::where('id', $merchant->id)->first(['id']);
                if (isset($merchantData->id)) {
                    $user = new \App\User();
                    $user->name = $request->get('fullname');
                    $user->username = str_replace(' ', '', strtolower($request->get('fullname')));
                    $user->email = $request->has('email') && $request->get('email') ? $request->get('email') : null;
                    $user->mobile_number = $request->get('phone');
                    $user->user_type = 2;
                    $user->merchant_id = $merchantData->id;
                    $user->center_id = 0;
                    $user->code = $code;
                    $user->password = bcrypt(123456);
                    $user->save();

                    //                $doc_data= $request->get('document');

                    //                $docs = (array)$doc_data;
                    //                $docs = $this->object_to_array($doc_data);

                    //                if($request->has('document') && count(array_diff($request->get('documents'),[null]))){
                    //                if($request->has('document') && count(array_diff($docs,[null]))){
                    if ($request->has('document')) {
                        //(new ConsumerApplicationController())->uploadConsumerDocuments($request , $merchantData->id, 'merchant');
                        $requestOriginal->request->add(['request_id_type' => 'merchant_id', 'merchant_id' => $merchantData->id]);
                        $responseData = $this->uploadDocumentForMerchant($requestOriginal);
                    }

                    $this->addOffersToMerchant($merchantData->id, $_industry_type);

                    (new FrontController())->partnerQuery($this->getPartnerRequest($request->all()));
                    $this->generateOtp(new Request(['data' => json_decode(json_encode(['mobile_number' => $request->get('phone')]))]));


                    if ($request->has('referee')) {
                        $this->sendCommunicationToRefer($merchant, 1);
                    }

                    if (isset($responseData)) {
                        return $responseData;
                    } else {
                        $data = array();
                        $data['status'] = 'OK';
                        $data['message'] = 'OTP sent';
                        return $data;
                    }
                } else {
                    $data = array();
                    $data['status'] = 'FAIL';
                    $data['message'] = 'Something went wrong. Please try after sometime';
                    return $data;
                }
            }
        }

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

    public function createNewLead(Request $request){
        $request_data = ($request->has('data')) ? $request->get('data') : "";
        $user = $request->get('user');
        if ($request_data != "") {
            $company_name = isset($request_data->company_name) ? $request_data->company_name : '';
            $sector = isset($request_data->sector) ? $request_data->sector : '';
            $nature_of_business = isset($request_data->nature_of_business) ? $request_data->nature_of_business : '';
            $address = isset($request_data->address) ? $request_data->address : '';
            $state_name = isset($request_data->state_name) ? $request_data->state_name : '';
            $cities_served = isset($request_data->cities_served) ? $request_data->cities_served : '';
            $pincode = isset($request_data->pincode) ? $request_data->pincode : '';

            if($company_name !== ''){
                $existingMerchant = Merchant::where('merchant_name', $company_name)->where('category_id', $sector)->first(['id']);
                $existingLead = Leads::where('firm', $company_name)->where('sector_id', $sector)->where('state_id', $state_name)->first(['id']);
                if($existingMerchant !== null || $existingLead !== null){
                    $data = array();
                    $data['status'] = 'FAIL';
                    $data['message'] = $existingMerchant != null ? 'Merchant already exists' : 'Lead already exists';
                    return $data;
                }
            }

//            $state = StateModel::where('name','like','%' . $state_name . '%')->first(['id']);
            $leads = [
                'firm' => $company_name,
                'sector_id' => $sector,
                'business' => $nature_of_business,
                'address' => $address,
                'state_id' =>$state_name,
                'city' => $cities_served,
                'pincode' => $pincode,
                'lead_generated_by' => $user['id'],
                'user_id' => $user['id'],
                'status' => 1,
                'created_at' => Carbon::now()->toDateTimeString()
            ];

            Leads::insert($leads);

            $data = array();
            $data['status']  = 'OK';
            $data['message'] = 'Success';
            return $data;
        }
        $data = array();
        $data['status'] = 'FAIL';
        $data['message'] = 'Something went wrong. Please try after sometime';
        return $data;
    }

    public function ExistingLogin(Request $request){
        $request_data = ($request->has('data')) ? $request->get('data') : "";
        if ($request_data != "") {
            //$request_data = json_decode(base64_decode($request_data), true);
            $request = new Request((array) $request_data);


            $merchantExisting = User::where('mobile_number',$request->get('phone'))->first(['id']);
            if(!isset($merchantExisting->id) && !empty($request->get('email'))) {
                $merchantExisting = User::where('email', $request->get('email'))->first(['id']);
            }

            if(isset($merchantExisting->id)){
                $data = array();
                $data['status'] = 'FAIL';
                $data['message'] = 'You are already a member';
                return $data;
            }else {
                $name = isset($request_data->fullname) ? $request_data->fullname : '';
                $mobile = isset($request_data->phone) ? $request_data->phone : '';
                $email = isset($request_data->email) ? $request_data->email : '';
                $company = isset($request_data->company_name) ? $request_data->company_name : '';
                $designation = isset($request_data->designation) ? $request_data->designation : '';
                $location = isset($request_data->location) ? $request_data->location : '';

                $slack_data = array('Name' => $name, 'Mobile Number'=>$mobile, 'Email'=>$email, 'Merchant Name'=>$company, 'Designation'=>$designation, 'Location'=>$location);

                (new Slack(new Request(['title'=>'User requested access to login on Merchant App',
                    'fields'=>$slack_data, 'group' => Slack::$MERCHANT_ACTIVITY])))->send();

                MerchantUserRequest::insert([
                    'name' => $name,
                    'mobile_number' => $mobile,
                    'email_id' => $email,
                    'designation' => $designation,
                    'location' => $location,
                    'merchant_name' => $company,
                    'created_at' => Carbon::now()->toDateTimeString(),
                ]);

                $details = [
                    'name' => $name,
                    'email' => $email,
                    'mobile_number' => $mobile,
                    'deleted_at'=> Carbon::now()->toDateTimeString(),
                ];

                $user = new \App\User();
                $user->fill($details);
                $user->save();

                $data['status']  = 'OK';
                $data['message'] = 'We will get in touch shortly';
                return $data;
            }
        }

        $data = array();
        $data['status'] = 'FAIL';
        $data['message'] = 'Something went wrong. Please try after sometime';
        return $data;
    }

    function object_to_array($data) {
        $result = array();

        $data = (array) $data;
        foreach ($data as $key => $value) {
            if (!is_array($value)) {
                $value = (array)$value;
                foreach ($value as $key1 => $value1) {
                    if (!is_array($value1)){
                        $value1 = (array)$value1;
                        $value[$key1] = $value1;
                    }
                    else
                        $value[$key1] = $value1;
                }
                $result[$key] = $value;
            }
            else
                $result[$key] = $value;
        }
        return $result;
    }

    public function sendCommunicationToRefer($merchant, $type){

        if (is_array($merchant)){
            $user = $merchant[0];
            $merchant = $merchant[1];
        }

        $sms = "";
        if($type == 1 || $type == 2) {
            $user = User::where('code', $merchant->referred_by)->first(['id', 'name', 'mobile_number']);
            if (isset($user->name) && !empty($user->mobile_number)) {
                if ($type == 1) {
                    $sms = "Dear " . $user->name . ",<br/>Congratulations! " . $merchant->merchant_name . ", referred by you, has started the registration process with us. Please ask them to complete the registration and send an application to win your reward of Rs.500!";
                } else if ($type == 2) {
                    $sms = "Dear " . $user->name . ",<br/>Congratulations! " . $merchant->merchant_name . " is successfully registered with us. Please remind them to send us loan applications so you both can earn Rs.500 each!";
                }
            }
        }else if($type == 3 && isset($user)){
            $referral_link = "https://bit.ly/35MXMw0";
           // $referral_link = \Bitly::getUrl($referral_link);
            $sms = "Dear ".$user->name.",<br/>Congratulations! You won Rs.500 as ".$merchant->merchant_name." got a decision on their First Application.Continue to Refer & Earn more with Credit fair @ ".$referral_link." !";
        }

        if ($sms && isset($user)) {
            (new Reminders(new Request()))
                ->setSMSBody(str_replace('<br/>', "\n", $sms))
                ->setPhone($user->mobile_number)
                ->setAdditionalData(['id' => $user->id, 'id_type' => 'user_id'])
                ->send();
        }
    }

    public function getMerchantLists(Request $request){
        $request_data = ($request->request->get('data')) ? $request->request->get('data') : ($request->get('data') ? $request->get('data') : '');
        $response = [];
        $nearbyList = [];
        if ($request_data != "" && isset($request_data->longitude) && isset($request_data->latitude)) {
            $session_string = (isset($request_data->session_string)) ? explode("|", base64_decode($request_data->session_string)) : ($request->get('user') ? $request->get('user')['session_string'] : '');
            $user_id = (isset($session_string[2])) ? $session_string[2] : 0;
            $data['status']  = 'OK';
            $data['message'] = 'List fetched';
            $state = (new ConsumerApplicationController())->getPincodeData(['longitude' => $request_data->longitude,'latitude' => $request_data->latitude, 'pincode' => '', 'type' => 'state']);
            if($state) {
                $selectedMerchant = Merchant::where('state', $state)->where('status','active')->whereNotNull('merchant_name')->get(['id','merchant_name','latitude','longitude']);
                $selectedCustomer = ConsumerApplication::where('current_address_state', 'like', '%' . $state . '%')->whereNotNull('name')->whereNull('is_deleted')->get(['id','name']);
                $selectedLead = Leads::whereNotNull('firm')->get(['id','firm as name']);

                $latitude = $request_data->latitude;
                $longitude = $request_data->longitude;

                $nearby = Merchant::selectRaw('* , ( 6367 * acos( cos( radians( ? ) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians( ? ) ) + sin( radians( ? ) ) * sin( radians( latitude ) ) ) ) AS distance', [$latitude, $longitude, $latitude])
                    ->having('distance', '<=', 2)
                    ->where('status','active')
                    ->orderBy('distance')
                    ->get();


                $nearbyCustomer = UserGeolocation::with(['applications' => function ($query) {
                    $query->whereNull('is_deleted');
                }])->selectRaw('*, ( 6367 * acos( cos( radians( ? ) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians( ? ) ) + sin( radians( ? ) ) * sin( radians( latitude ) ) ) ) AS distance', [$latitude, $longitude, $latitude])
                    ->where('applicant_type',1)
                    ->where('service','current')
                    ->where('id_type','application_id')
                    ->having('distance', '<=', 2)
                    ->orderBy('distance')
                    ->get();

                $merchantIDs = [];
                $customerIDs = [];
                $leadIDs = [];

                if ($user_id) {
                    foreach ($nearby as $item){
                        if($item->id && !in_array($item->id, $merchantIDs)) {
                            $dataNearBy = ['id' => $item->id, 'name' => $item->merchant_name, 'type' => 'merchant_id', 'nearby' => 1,'longitude' => $item->longitude, 'latitude' => $item->latitude,'distance' => round($item->distance, 2).' Km'];
                            $response[] = $dataNearBy;
                            $nearbyList[] = $dataNearBy;
                            $merchantIDs[] = $item->id;
                        }
                    }
                    foreach ($nearbyCustomer as $item){
                        if($item->applications && !in_array($item->applications->id, $customerIDs)) {
                            $dataNearBy = ['id' => $item->applications->id, 'name' => $item->applications->name, 'type' => 'application_id', 'nearby' => 1,'longitude' => $item->longitude, 'latitude' => $item->latitude,'distance' => round($item->distance, 2).' Km'];
                            $response[] = $dataNearBy;
                            $nearbyList[] = $dataNearBy;
                            $customerIDs[] = $item->applications->id;
                        }
                    }
                    foreach ($selectedMerchant as $sm_item){
                        if($sm_item->merchant_name && !in_array($sm_item->id, $merchantIDs)) {
                            $response[] = ['id' => $sm_item->id, 'name' => $sm_item->merchant_name, 'type' => 'merchant_id','longitude' => $sm_item->longitude, 'latitude' => $sm_item->latitude, 'nearby' => 0];
                            $merchantIDs[] = $sm_item->id;
                        }
                    }
                    foreach ($selectedCustomer as $sc_item){
                        if($sc_item->name && !in_array($sc_item->id, $customerIDs)) {
                            $userLocation = UserGeolocation::where('_id',$sc_item->id)->where('id_type','application_id')->where('service', 'current')->whereNull('deleted_at')->first(['latitude','longitude']);
                            $response[] = ['id' => $sc_item->id, 'name' => $sc_item->name, 'type' => 'application_id','longitude' => isset($userLocation->longitude) ? $userLocation->longitude : '', 'latitude' => isset($userLocation->latitude) ? $userLocation->latitude : '', 'nearby' => 0];
                            $customerIDs[] = $sc_item->id;
                        }
                    }
                    foreach ($selectedLead as $sc_item){
                        if($sc_item->name && !in_array($sc_item->id, $leadIDs)) {
                            $response[] = ['id' => $sc_item->id, 'name' => $sc_item->name, 'type' => 'application_id','longitude' =>  '', 'latitude' => '', 'nearby' => 0];
                            $leadIDs[] = $sc_item->id;
                        }
                    }
                }
            }
        }

        usort($nearbyList, function ($a, $b) {
            return $a['distance'] <=> $b['distance'];
        });
        $data['data'] = $response;
        $data['nearby'] = $nearbyList;
        return $data;
    }

    public function adviserServiceUpdate(Request $request){
        $request_data = ($request->request->get('data')) ? $request->request->get('data') : ($request->get('data') ? $request->get('data') : '');
        $status = 'FAIL';
        $message = 'Failed update status';
        $data = array();

        try {

            if ($request_data != "") {
                $user = (object)$request->get('user');
                $session_string = (isset($request_data->session_string)) ? explode("|", base64_decode($request_data->session_string)) : ($request->get('user') ? $request->get('user')['session_string'] : '');
                if (!isset($session_string[0])) {
                    $data['status'] = 'FAIL';
                    $data['message'] = 'Invalid Session data';
                    return $data;
                }
                if ($error = $this->validate_session($session_string)) {
                    return $error;
                }
                $user_id = $session_string[2];

                if($request_data->lead){

                    $lead = Leads::where('user_id', $user_id)->orderBy('created_at', 'desc')->first(['id']);
                    $service_id = $lead->id;
                    $service_id_type = 'lead_id';
                    $service_type = 2;
                } else{
                    $service_id = $request_data->service_id;
                    $service_type = $request_data->service_type;
                    $service_id_type = $request_data->service_id_type;
                }

                $adviser_service_id = $request_data->adviser_service_id;
                $latitude = isset($request_data->location) && isset($request_data->location->latitude) ? $request_data->location->latitude : '';
                $longitude = isset($request_data->location) && isset($request_data->location->longitude) ? $request_data->location->longitude : '';


                $adviserService = AdviserService::where('user_id', $user_id)->whereNull('check_out_at')->orderBy('created_at', 'desc')->first();
                if (isset($adviserService->id) && !$adviser_service_id) {
                    $data['status'] = 'FAIL';
                    $data['message'] = 'Can\'t check in. Please checkout first';
                    return $data;
                }


                if ($adviser_service_id) {
                    $adviserService = AdviserService::find($adviser_service_id);
                    $service_id = $adviserService->service_id;
                    $service_id_type = $adviserService->service_id_type;
                }


                if ($service_id_type == 'application_id') {
                    $visitedData = ConsumerApplication::where('id', $service_id)->first(['id', 'name']);
                } else if ($service_id_type == 'lead_id') {
                    $visitedData = Leads::where('id', $service_id)->first(['id', 'firm as name']);
                } else {
                    $visitedData = Merchant::where('id', $service_id)->first(['id', 'merchant_name as name']);
                }

                $date = Carbon::now()->toDateTimeString();

                if (!$adviser_service_id) {

                    $adviser_service_id = AdviserService::insertGetId(
                        [
                            'user_id' => $user_id,
                            'service_id' => $service_id,
                            'service_id_type' => $service_id_type,
                            'service_type' => $service_type,
                            'check_in_at' => $date,
                            'check_in_latitude' => $latitude,
                            'check_in_longitude' => $longitude,
                            'created_at' => $date
                        ]
                    );

                    $status = 'OK';
                    $message = 'Successfully checked in';
                    $data['adviser_service_id'] = $adviser_service_id;

                    (new Slack(new Request(['title' => 'Checked In', 'fields' => ['Advisor' => $user->name, 'Checked In At' => $date, 'Visiting' => $visitedData->name], 'group' => Slack::$DAILY_TASK])))->send();
                } else {

                    $adviserService = AdviserService::find($adviser_service_id);

                    if(!$adviserService->check_out_at) {
                        $adviserService->check_out_at = $date;
                        $adviserService->check_out_latitude = $latitude;
                        $adviserService->check_out_longitude = $longitude;
                    }
                    $adviserService->save();
                    $status = 'OK';
                    $message = 'Successfully checked out';
                    $timeTaken = (new ConsumerApplicationController())->dateToTimeString($adviserService->check_in_at, Carbon::now()->toDateTimeString());
                    (new Slack(new Request(['title' => 'Checked Out', 'fields' => ['Advisor' => $user->name, 'Checked Out At' => $date, 'Visited' => $visitedData->name, 'Time Taken' => str_replace('ago', '', $timeTaken)], 'group' => Slack::$DAILY_TASK])))->send();
                }
            }
        }catch (\Exception $exception){
            return ['status' => $status, 'message' => 'Exception occurred while adviser service update', 'data' => isset($user) ? $user : $data];
        }

        return ['status' => $status, 'message' => $message, 'data' => $data];
    }

    public function addOffersToMerchant($merchant_id, $category_id){
        $merchantOffers = MerchantOffers::where('merchant_id',181)->get();
        foreach ($merchantOffers as $offer){
            $data = $offer->toArray();
            unset($data['id']);
            $offers = new MerchantOffers();
            $offers->fill($data);
            $offers->created_by = 107;
            $offers->category_id = $category_id;
            $offers->checked_by = 107;
            $offers->status = 1;
            $offers->created_at = Carbon::now()->toDateTimeString();
            $offers->merchant_id = $merchant_id;
            $offers->save();
        }
    }

    public function getPartnerRequest($data){
        $partner = [
            'name' => isset($data['fullname']) ? $data['fullname'] : '',
            'number' => isset($data['phone']) ? $data['phone'] : '',
            'email' => isset($data['email']) ? $data['email'] : '',
            'company_name' => isset($data['company_name']) ? $data['company_name'] : '',
            'turnover' => isset($data['company_turnover']) ? $data['company_turnover'] : '',
            'website' => isset($data['site_link']) ? $data['site_link'] : '',
            'other_financial' => (isset($data['partnerStatus']) && $data['partnerStatus'] == 'Yes') ? 1 : 0,
            'existing_partner' => isset($data['partner_name']) ? $data['partner_name'] : '',
            'industry' => isset($data['industry_type']) ? $data['industry_type'] : '',
            'come_to_know' => isset($data['referenceType']) ? $data['referenceType'] : '',
            'referee' => isset($data['referee']) ? $data['referee'] : '',
        ];

        return new Request($partner);
    }

    public function rewards(Request $request){
        $request_data = ($request->request->get('data')) ? $request->request->get('data') : ($request->get('data') ? $request->get('data') : '');
        if ($request_data != "") {
            $session_string = (isset($request_data->session_string)) ? explode("|", base64_decode($request_data->session_string)) : ($request->get('user') ? $request->get('user')['session_string'] : '');
            if (!isset($session_string[0])) {
                $data = array();
                $data['status'] = 'FAIL';
                $data['message'] = 'Invalid Session data';
                return $data;
            }
            if ($error = $this->validate_session($session_string)) {
                return $error;
            }

            $data = $this->getRewardsStatus([$session_string[0], $session_string[2]], false);

            return $data;
        }

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

    public function getRewardsStatus($session_string, $isBot){
        $refer_badge = 'eligible';

        $one_down_achieved_days_remaining = 0;
        $hat_trick_achieved_days_remaining = 0;
        $id = (isset($session_string[0])) ? $session_string[0] : 0;
        $user_id = (isset($session_string[1])) ? $session_string[1] : 0;

        $from_date = (isset($session_string[2])) ? $session_string[2] : Carbon::now()->startOfWeek()->toDateTimeString();
        $to_date = (isset($session_string[3])) ? $session_string[3] : Carbon::now()->endOfWeek()->toDateTimeString();

        $consumerApplicationController = new ConsumerApplicationController();
        $statusReverseArray = $consumerApplicationController->statusreversearray['approved'];

        $user = User::where('id', $user_id)->first(['name','code']);

        $referralCode = Merchant::find($id);

        $user_initials = 'CF';
        if (isset($user->name) && !empty($user->name)){
            $user_initials = strtoupper(substr($user->name, 0, 2));
        }else if ($referralCode){
            $user_initials = strtoupper(substr($referralCode->merchant_name, 0, 2));
        }

        if (isset($user->code)) {
            $referredMerchants = Merchant::where('referred_by', $user->code)->get(['id']);
            if ($referredMerchants) {
                foreach ($referredMerchants as $refMerchant) {
                    $referredMerchantsIds[] = $refMerchant->id;
                }
            }

            if (isset($referredMerchantsIds) && !empty($referredMerchantsIds)) {
                /* $statusArray = $statusReverseArray;
                 if (isset($statusArray[2]) && $statusArray[2] == 'rejected') {
                     unset($statusArray[2]);
                     $statusArray = array_values($statusArray);
                 }
                 $ref = ConsumerApplication::/*whereNotIn('state', $statusArray)
                    whereIn('merchant_id', $referredMerchantsIds)
                    ->whereNull('is_deleted')
                    ->count();*/

                if ($referredMerchantsIds) {
                    $refer_badge = 'in-process';
                }
            }
        }

        $applicationsData = ConsumerApplication::with('emi')->where('created_at', '>=', $from_date)
            ->where('created_at', '<=', $to_date)
            /*->whereNotIn('state', $statusReverseArray)*/
            ->where('src_representative_name', $user_id)
            ->whereNull('is_deleted')
            ->get(['id','approved_amount','created_at','state']);

        $date = Carbon::now()->toDateString();
        $endDate = Carbon::parse($to_date);
        $applications = 0;
        $loan_amount = 0;
        $disbursed_amount = 0;
        //$one_down = 'in-process';
        $hat_trick = 'eligible';
        $one_down_start = $from_date;
        $one_down_achieved = '';
        $hat_trick_start = '';
        $hat_trick_achieved= '';
        $one_down = 'in-process';
        $amountEarned = 0;
        $one_down_achieved_days_remaining = $endDate->diffInDays($date);
        $hat_trick_achieved_days_remaining = $endDate->diffInDays($date);
        $no_application_until_hat_trick = 5;
        $minAmountOneDown = 150000;
        $minAmountHatTrick = 500000;
        $one_down_remaining_application = 0;
        $one_down_remaining_amount = 0;
        $hat_trick_remaining_application = 0;
        $hat_trick_remaining_amount = 0;
        if($applicationsData) {
            foreach ($applicationsData as $appData) {

                $applications++;
                if (!in_array($appData->state, $consumerApplicationController->statusreversearray['approved'])) {
                    $loan_amount += ($appData->approved_amount) ? $appData->approved_amount : 0;
                }
                if (!in_array($appData->state, $consumerApplicationController->statusreversearray['disbursed'])) {
                    $disbursed_amount += ($appData->approved_amount) ? $appData->approved_amount : 0;
                }
                if ($applications >= 5 && $loan_amount >= $minAmountOneDown) {
                    $hat_trick = 'in-process';
                    $one_down = 'achieved';
                    $one_down_achieved = date('d M, Y', strtotime($appData->created_at));
                    $hat_trick_start = date('d M, Y', strtotime($appData->created_at));
                    $hat_trick_achieved_days_remaining = $endDate->diffInDays($date);
                    $no_application_until_hat_trick = 5 - $applications;
                    $amountEarned = 500;
                } elseif ($applications >= 25 && $disbursed_amount >= $minAmountHatTrick) {
                    $hat_trick = 'achieved';
                    $one_down = 'achieved';
                    $hat_trick_achieved = date('d M, Y', strtotime($appData->created_at));
                    $no_application_until_hat_trick = 0;
                    $amountEarned = 3000;
                    break;
                }
            }
        }

        if ($one_down == 'in-process') {
            $one_down_remaining_application = 5 - $applications;
            $one_down_remaining_application = ($one_down_remaining_application <= 0) ? 0 : $one_down_remaining_application;
            $one_down_remaining_amount = $minAmountOneDown - $loan_amount;
            $one_down_remaining_amount = ($one_down_remaining_amount <= 0) ? 0 : $one_down_remaining_amount;
        } if ($hat_trick == 'in-process' || $hat_trick == 'eligible'){
            $hat_trick_remaining_application = 25 - $applications;
            $hat_trick_remaining_application = ($hat_trick_remaining_application <= 0) ? 0 : $hat_trick_remaining_application;
            $hat_trick_remaining_amount = $minAmountHatTrick - $disbursed_amount;
            $hat_trick_remaining_amount = ($hat_trick_remaining_amount <= 0) ? 0 : $hat_trick_remaining_amount;
        }

        if($one_down == 'achieved'){
            $one_down_achieved_days_remaining = 0;
        }
        if($hat_trick == 'achieved'){
            $hat_trick_achieved_days_remaining = 0;
        }


        $data = array();
        $data['status'] = 'OK';
        $data['message'] = 'Data Found';
        $data['data'] = ['from_date' => date('d M, Y', strtotime($from_date)), 'to_date' => date('d M, Y', strtotime($to_date)),
            'one_down_remaining_application' => $one_down_remaining_application,
            'one_down_remaining_amount' => str_replace('.00', '', money_format('%!i', $one_down_remaining_amount)),
            'hat_trick_remaining_application' => $hat_trick_remaining_application,
            'hat_trick_remaining_amount' => str_replace('.00', '', money_format('%!i', $hat_trick_remaining_amount)),
            'no_application_until_hat_trick' => $no_application_until_hat_trick, 'one_down_achieved_days_remaining' => $one_down_achieved_days_remaining , 'hat_trick_achieved_days_remaining' => $hat_trick_achieved_days_remaining, 'amountEarned' => $amountEarned, 'badges' => ['refer_badge' => $refer_badge,'one_down' => ['status'=>$one_down,'one_down_start_date'=>$one_down_start,'one_down_achieved_date'=>$one_down_achieved], 'hat_trick' => ['status'=>$hat_trick,'hat_trick_start_date'=>$hat_trick_start,'hat_trick_achieved_date'=>$hat_trick_achieved]],'user_initials'=>$user_initials];
        if($isBot && isset($statusArray) && isset($referredMerchantsIds)){
            $data['attributes'] = ['status' => $statusArray, 'merchant_id' => $referredMerchantsIds, 'user_id' => $user_id];
        }
        return $data;
    }

    public function getEarnedRewards(Request $request){

        $request_data = ($request->request->get('data')) ? $request->request->get('data') : ($request->get('data') ? $request->get('data') : '');
        if ($request_data != "") {
            $session_string = (isset($request_data->session_string)) ? explode("|", base64_decode($request_data->session_string)) : ($request->get('user') ? $request->get('user')['session_string'] : '');
            if (!isset($session_string[0])) {
                $data = array();
                $data['status'] = 'FAIL';
                $data['message'] = 'Invalid Session data';
                return $data;
            }
            if ($error = $this->validate_session($session_string)) {
                return $error;
            }

            $from_date = Carbon::createFromFormat('Y-m-d', '2019-06-01')->startOfDay()->toDateTimeString();

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

            $applicationsData = ConsumerApplication::where('created_at','>=',$from_date)
                ->where('src_representative_name', $user_id)
                ->whereNull('is_deleted')
                ->orderBy('created_at','asc')
                ->get(['id','created_at']);

            $totalAmount = 0;
            $response = [];
            $datesData = [];
            $rewardCount = 0;
            foreach ($applicationsData as $application){
                $startDate = Carbon::createFromFormat('Y-m-d',date('Y-m-d',strtotime($application->created_at)));

                $start = $startDate->startOfWeek()->toDateTimeString();
                $end = $startDate->endOfWeek()->toDateTimeString();

                $datesData[date('Y-m-d', strtotime($start)) . '|' . date('Y-m-d', strtotime($end))] = ['start' => date('Y-m-d', strtotime($start)) , 'end' =>  date('Y-m-d', strtotime($end))];

            }


            foreach ($datesData as $dateItem){
                $data = $this->getRewardsStatus([$session_string[0], $session_string[2], $dateItem['start'], $dateItem['end']], false);

                $data = $data['data'];

                if ($data['amountEarned']) {

                    $achievement_at = ($data['amountEarned'] == 500) ? $data['badges']['one_down']['one_down_start_date'] : (($data['amountEarned'] == 3000) ? $data['badges']['hat_trick']['hat_trick_start_date'] : '');

                    $response[] = [
                        'earned' => $data['amountEarned'],
                        'earned_reward' => $data['amountEarned'].' Earned',
                        'achievement_at' => $achievement_at
                    ];

                    $totalAmount += $data['amountEarned'];
                    $rewardCount++;
                }
            }

            $responseData = [
                'total_amount' => $totalAmount,
                'total_reward_count' => $rewardCount,
                'data' => $response
            ];

            $data = array();
            $data['data'] = $responseData;
            $data['status'] = 'OK';
            $data['message'] = 'rewards data';
            return $data;
        }

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

    public function getRewards(Request $request){
        $request_data = ($request->request->get('data')) ? $request->request->get('data') : ($request->get('data') ? $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')));
            if (!isset($session_string[0])) {
                $data = array();
                $data['status'] = 'FAIL';
                $data['message'] = 'Invalid Session data';
                return $data;
            }
            if ($error = $this->validate_session($session_string)) {
                return $error;
            }


            $user_id = (isset($session_string[2])) ? $session_string[2] : 0;
            $status = (new ConsumerApplicationController())->statusreversearray;
            $statusData = $status['approved'];
            if (($key = array_search('rejected', $statusData)) !== false) {
                unset($statusData[$key]);
                $statusData = array_values($statusData);
            }
            $users = User::with('referrals')->where('id',$user_id)->first();
            $response = [];
            if($users->referrals) {
                foreach ($users->referrals as $referral) {

                    $counter = 0;
                    $is_signed = false;
                    $is_application_login = false;
                    $is_approved = false;
                    $is_signing = false;


                    $merchant = Merchant::where('id',$referral->id)->first();
                    if (isset($merchant->id)){
                        if (!$merchant->is_guest_active){
                            $is_signing = true;
                            $counter = 1;
                        }else if($merchant->is_guest_active == 1){
                            $is_signed = true;
                            $counter = 2;
                            $is_signing = true;
                        }
                    }


                    $application = ConsumerApplication::where('merchant_id', $referral->id)->whereNotIn('state', $statusData)->first(['id']);
                    if (isset($application->id)) {
                        $is_application_login = true;
                        $is_approved = true;
                        $counter = 4;
                    } else {
                        $application = ConsumerApplication::where('merchant_id', $referral->id)->first(['id']);
                        if (isset($application->id)) {
                            $is_application_login = true;
                            $counter = 3;
                        }
                    }


                    $response[] = [
                        'name' => $referral->merchant_name,
                        'is_signing' => $is_signing,
                        'is_signup' => $is_signed,
                        'is_application_login' => $is_application_login,
                        'is_approved' => $is_approved,
                        'counter' => $counter,
                        'referral_date' => date('d M, Y',strtotime($referral->created_at))
                    ];
                }
            }

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

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

    public function saveDevice(Request $request){
        $request_data = (Input::has('data')) ? Input::get('data') : $request->get('session_string');
        if ($request_data != "") {
            $session_string = (isset($request_data->session_string)) ? explode("|", base64_decode($request_data->session_string)) : explode("|", base64_decode($request->get('session_string')));
            if (!isset($session_string[0])) {
                $data = array();
                $data['status'] = 'FAIL';
                $data['message'] = 'Invalid Session data';
                return $data;
            }
            if ($error = $this->validate_session($session_string)) {
                return $error;
            }


            $user_id = (isset($session_string[2])) ? $session_string[2] : 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 = (Input::has('data')) ? Input::get('data') : $request->get('session_string');
        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')));
            if (!isset($session_string[0])) {
                $data = array();
                $data['status'] = 'FAIL';
                $data['message'] = 'Invalid Session data';
                return $data;
            }
            if ($error = $this->validate_session($session_string)) {
                return $error;
            }
            $user_id = (isset($session_string[2])) ? $session_string[2] : 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 checkUpdate(){

        $version = _env('ANDROID_APP_VERSION');
        $isForceUpdate = _env('ANDROID_APP_FORCE_UPDATE');
        $isSignedOut = _env('ANDROID_APP_SIGN_OUT');

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

    public function createCenter(Request $request){
        $request_data = ($request->request->get('data')) ? $request->request->get('data') : ($request->get('data') ? $request->get('data') : '');
        if ($request_data != "") {
            $session_string = (isset($request_data->session_string)) ? explode("|", base64_decode($request_data->session_string)) : ($request->get('user') ? $request->get('user')['session_string'] : '');
            if (!isset($session_string[0])) {
                $data = array();
                $data['status'] = 'FAIL';
                $data['message'] = 'Invalid Session data';
                return $data;
            }
            if ($error = $this->validate_session($session_string)) {
                return $error;
            }
            try {

                $user_id = (isset($session_string[2])) ? $session_string[2] : 0;
                $user_type = (isset($session_string[5])) ? $session_string[5] : "";
                $merchant_id = (isset($request_data->merchant_id)) ? $request_data->merchant_id : ((isset($session_string[0])) ? $session_string[0] : 0);

                if(isset($request_data->cname) && empty($request_data->cname) || !isset($request_data->cname)){
                    $data = array();
                    $data['status'] = 'FAIL';
                    $data['message'] = 'Please select center';
                    return $data;
                }

                if($merchant_id > 0 && $user_type != "Executive" && $user_type != "Center") {
                    $merchant = Merchant::where('id',$merchant_id)->first();
                    $userData = DB::table('merchant_location')->where('merchant_id',$merchant_id)->where('name',$request_data->cname)->where('created_at','>=',Carbon::now()->subDay(1)->toDateTimeString())->first(['id']);// MerchantLocation::where('merchant_id',$merchant_id)->get(['name']);
                    if (isset($userData->id)) {
                        $data = array();
                        $data['status'] = 'FAIL';
                        $data['message'] = 'Center already exist';
                    } else if (strlen($request_data->phone) != 10) {
                        $data = array();
                        $data['status'] = 'FAIL';
                        $data['message'] = 'Please enter a valid Mobile Number';
                    } else {
                        $center = new MerchantLocation();
                        $center->merchant_id = $merchant_id;
                        $center->name =  isset($request_data->cname) && !empty($request_data->cname) ? $request_data->cname : "";
                        $center->email =  isset($request_data->email) && !empty($request_data->email) ? $request_data->email : "";
                        $center->phone =  isset($request_data->phone) && !empty($request_data->phone) ? $request_data->phone : "";
                        $center->slug =  isset($request_data->cname) && !empty($request_data->cname) ? $request_data->cname : "";
                        $center->location =  isset($request_data->location) && !empty($request_data->location) ? $request_data->location : "";
                        $center->gst_number =  isset($request_data->gst_number) && !empty($request_data->gst_number) ? $request_data->gst_number : "";
                        $center->deleted_at =  date('Y-m-d H:i:s');
                        $center->save();

                        $user = User::where('id',$user_id)->first(['name']);
                        $actions = array('text'=>array('Call', 'Call offline'),'value' =>
                            array('call','call_offline'));
                        $attachment = ['title'=>'New Center added in '.$merchant->merchant_name,'fields'=>['Center Name' =>$center->name,'Merchant Name' => $merchant->merchant_name,"Created By"=> $user->name],'group' => 'businessdevelopment'];
                        $attachment[0]['actions'] = $actions;
                        (new \App\Slack(new \Illuminate\Http\Request($attachment)))->send();

                        $data = array();
                        $data['status'] = 'OK';
                        $data['message'] = 'Center successfully added';
                    }
                }else{
                    $data = array();
                    $data['status'] = 'FAIL';
                    $data['message'] = 'You don\'t have persmission to create Center';
                }
            }catch (\Exception $e){
                $data = array();
                $data['status'] = 'FAIL';
                $data['message'] = 'Please add proper details';
            }

            return $data;
        }
    }

    public function applicationUpdates(Request $request){
        $request_data = ($request->request->get('data')) ? $request->request->get('data') : ($request->get('data') ? $request->get('data') : '');
        if ($request_data != "") {
            $session_string = (isset($request_data->session_string)) ? explode("|", base64_decode($request_data->session_string)) : ($request->get('user') ? $request->get('user')['session_string'] : '');
            $data = array();
            if (!isset($session_string[0])) {
                $data['status'] = 'FAIL';
                $data['message'] = 'Invalid Session data';
                return $data;
            }
            if ($error = $this->validate_session($session_string)) {
                return $error;
            }
            try {

                $response = array();

                if (isset($request_data->application_id) && $request_data->application_id > 0) {
                    ConsumerApplicationElement::where('application_id', $request_data->application_id)->update(['is_reviewed' => 1]);
                    $data = array();
                    $data['status'] = 'OK';
                    $data['message'] = 'Reviewed';
                    return $data;
                }else{
                    $user_id = (isset($session_string[2])) ? $session_string[2] : 0;
                    $user_type = (isset($session_string[5])) ? $session_string[5] : "";
                    $merchant_id = (isset($request_data->merchant_id)) ? $request_data->merchant_id : ((isset($session_string[0])) ? $session_string[0] : 0);

                    $applications = ConsumerApplication::with('application_element')
                        ->where('src_representative_name', $user_id)
                        ->whereIn('state', ['disbursed', 'nach registered'])
                        ->where('created_at','>=',Carbon::now()->startOfDay()->toDateTimeString())
                        ->where('created_at','<=',Carbon::now()->endOfDay()->toDateTimeString())->get(['id','name','approved_amount','loan_amount']);


                    foreach ($applications as $application) {


                        $rating = ApplicationRating::where('application_id', $application['id'])->first(['rating']);

                        if(($application->application_element && $application->application_element->is_reviewed != 1) || (!isset($rating) && empty($rating))) {
                            $response[] = [
                                'id' => $application->id,
                                'name' => $application->name,
                                'amount' => $application->approved_amount > 0 ? $application->approved_amount : $application->loan_amount,
                            ];
                        }
                    }
                }

                $data = array();
                $data['status'] = 'OK';
                $data['message'] = 'Rating Data';
                $data['data'] = ['ratings' => $response];
                return $data;

            } catch (\Exception $e) {
                $data = array();
                $data['status'] = 'FAIL';
                $data['message'] = 'Service unavailable';
            }

            return $data;
        }

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

    public function saveUserInfo(Request $request){

        $request_data = (Input::has('data')) ? Input::get('data') : $request->get('session_string');
        if ($request_data != "") {
            $session_string = (isset($request_data->session_string)) ? explode("|", base64_decode($request_data->session_string)) : explode("|", base64_decode($request->get('session_string')));
            if (!isset($session_string[0])) {
                $data = array();
                $data['status'] = 'FAIL';
                $data['message'] = 'Invalid Session data';
                return $data;
            }
            if ($error = $this->validate_session($session_string)) {
                return $error;
            }
            $s3 = Storage::disk('s3');
            $user_id = (isset($session_string[2])) ? $session_string[2] : 0;

            /*if (!$s3->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);

            $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 saveApplicationRating(Request $request){
        $request_data = ($request->request->get('data')) ? $request->request->get('data') : ($request->get('data') ? $request->get('data') : '');
        if ($request_data != "") {
            $session_string = (isset($request_data->session_string)) ? explode("|", base64_decode($request_data->session_string)) : ($request->get('user') ? $request->get('user')['session_string'] : '');
            if (!isset($session_string[0])) {
                $data = array();
                $data['status'] = 'FAIL';
                $data['message'] = 'Invalid Session data';
                return $data;
            }
            if ($error = $this->validate_session($session_string)) {
                return $error;
            }
            try {

                if (isset($request_data->application_id) && $request_data->application_id > 0) {
                    $user_id = (isset($session_string[2])) ? $session_string[2] : 0;

                    $ratings = [
                        'application_id' => $request_data->application_id,
                        'user_id' => $user_id,
                        'advisorIssue' => $request_data->advisorIssue,
                        'disbTime' => $request_data->disbTime,
                        'docIssue' => $request_data->docIssue,
                        'feedback' => $request_data->feedback,
                        'rating' => $request_data->rating,
                        'created_at' => Carbon::now()->toDateTimeString()
                    ];

                    $rating = Rating::where('application_id', $ratings['application_id'])->first(['id']);
                    if (!isset($rating->id)) {
                        Rating::insert($ratings);
                    } else {
                        $data = array();
                        $data['status'] = 'FAIL';
                        $data['message'] = 'Data already submitted';
                        return $data;
                    }

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

            } catch (\Exception $e) {
                $data = array();
                $data['status'] = 'FAIL';
                $data['message'] = 'Service unavailable';
                return $data;
            }
        }

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

    public function getRegistrationDocStatus(Request $request){
        $request_data = ($request->request->get('data')) ? $request->request->get('data') : ($request->get('data') ? $request->get('data') : '');
        $merchant_id =  isset($request_data->merchant_id) ? $request_data->merchant_id : '';
        if ($request_data != '' && $merchant_id != '') {
            $required_docs = ['bank_statement', 'gst_certificate', 'pan_card', 'cancelled_cheque', 'itr'];
            $merchantFiles = MerchantFiles::where('merchant_id', $merchant_id)->get();
            $documents = [];

            foreach ($merchantFiles as $file) {
                $files [] = $file->file_type;
            }

            foreach ($required_docs as $doc) {
                if(!empty($files)){
                    if (!in_array($doc, $files)) {
                        $documents[] = $doc;
                    }
                }else{
                    $documents[] = $doc;
                }

            }

            $data = array();
            $data['status'] = 'OK';
            $data['message'] = 'Successful';
            $data['pending_document'] = $documents;
            $data['documents'] = $merchantFiles;
            return $data;

        }else{

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

    public function getGSTValidated(Request $request){
        $request_data = ($request->request->get('data')) ? $request->request->get('data') : ($request->get('data') ? $request->get('data') : '');
        $merchant_id =  isset($request_data->merchant_id) ? $request_data->merchant_id : '';

        return (new MerchantController())->getGSTDetails($merchant_id, $request);
    }

    public function sendMerchantMISReport(Request $request){
        $request_data = ($request->request->has('data')) ? $request->request->get('data') : ($request->get('data') ? $request->get('data') : '');
        $merchant_id =  isset($request_data->merchant_id) ? $request_data->merchant_id : '';
        $center_id =  isset($request_data->center_id) ? $request_data->center_id : '';

        return (new MerchantController())->getMISReport($merchant_id, $request, 'merchant_app', $center_id);
    }

}
