<?php

namespace App;

use App\Events\V1\EventPushNotificationToMerchant;
use App\Events\V1\EventSendOtpSms;
use App\Http\Controllers\Admin\ConsumerApplicationController;
use App\Http\Controllers\Admin\LenderServices;
use App\Http\Controllers\ApiController;
use App\Http\Controllers\Grade\GradeController;
use App\Http\Controllers\MerchantApiController;
use Carbon\Carbon;
use Hashids\Hashids;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\DB;
use App\Imports\TestImport;

class PWAApplicationForm
{
    public function init(){
    }

    public static function apply($request_data,$session_string,$request){
        $page_event = (isset($request_data->page_event) ) ? $request_data->page_event : "";
        if($page_event == 'loan_details'){
            $response = static::loan_details($request_data,$session_string,$request);
        }elseif($page_event == 'identification_details'){
            $response = static::indentification_details($request_data,$session_string,$request);
        }elseif($page_event == 'address_details'){
            $response = static::address_details($request_data,$session_string,$request);
        }elseif($page_event == 'income_details'){
            $response = static::income_details($request_data,$session_string,$request);
        }
        return $response;
    }

    public static function loan_details($request_data,$session_string,$request){
        $name = (isset($request_data->name) ) ? trim($request_data->name) : "";
        $mobile_number = (isset($request_data->phone) ) ? trim($request_data->phone) : "";
        $loan_amount = (isset($request_data->loan_amount) ) ? trim($request_data->loan_amount) : "";
        $unique_id_number = (isset($request_data->unique_id_number) ) ? $request_data->unique_id_number : "";
        $merchant_id = (isset($request_data->merchant_id) && $request_data->merchant_id != "") ? $request_data->merchant_id : $session_string[0];
        /*if($merchant_id == 5803){
            $loan_amount = 10000;
        }*/
        $center_id = (isset($request_data->center_id) && $request_data->center_id != "") ? $request_data->center_id : ((isset($session_string[1]) && $session_string[1] != "") ? $session_string[1] : 0) ;
        $tenure = (isset($request_data->tenure) ) ? $request_data->tenure : "";
        $offer_id = (isset($request_data->tenure) ) ? $request_data->tenure : "";
        $application_id = (isset($request_data->application_id) ) ? $request_data->application_id : 0;
        $product_id = (isset($request_data->product_id) ) ? $request_data->product_id : '';
        $p_name = (isset($request_data->p_name) ) ? $request_data->p_name : '';
        $product_name = (isset($request_data->product_name) ) ? $request_data->product_name : '';
        $preferred_language = (isset($request_data->preferred_language) ? strtoupper($request_data->preferred_language) : '');
        $skipped = isset($request_data->skipped) ? $request_data->skipped : true;
        $user_id = $session_string[2];
        $user_type = ((isset($session_string[5])) ? $session_string[5] : 0);

        $duration_year = (isset($request_data->duration_year) ) ? $request_data->duration_year : '';
        $duration_month = (isset($request_data->duration_month) ) ? $request_data->duration_month : '';
        $duration = $duration_month.'|'.$duration_year;

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

        $merchant_category = isset($merchant_details->category_id) ? $merchant_details->category_id : '';
        if (strlen($mobile_number) == 12 && substr($mobile_number, 0, 2) == "91") {
            $mobile_number = substr($mobile_number, 2, 10);
        }
        if($name == "" || !(preg_match("/^[a-zA-Z ]*$/",$name)) ){
            $data = array();
            $data['status'] = 'FAIL';
            $data['message'] = 'Please check Name';
            return $data;
        }

        if($preferred_language == ""){
            $data = array();
            $data['status'] = 'FAIL';
            $data['message'] = 'Please select preferred language';
            return $data;
        }
        if($mobile_number == "" || !(preg_match('/^[0-9]{10}+$/', $mobile_number)) || strlen($mobile_number) != 10){
            $data = array();
            $data['status'] = 'FAIL';
            $data['message'] = 'Please check Mobile Number';
            return $data;
        }
//        if($tenure == "" || $tenure == 0){
//            $data = array();
//            $data['status'] = 'FAIL';
//            $data['message'] = 'Please check Loan Tenure';
//            return $data;
//        }

        if($loan_amount == "" || $loan_amount == 0) {
            $data = array();
            $data['status'] = 'FAIL';
            $data['message'] = 'Please check Loan Amount';
            return $data;
        }

        if($name != "" && (preg_match("/^[a-zA-Z ]*$/",$name)) &&
            $mobile_number != "" && (preg_match('/^[0-9]{10}+$/', $mobile_number)) &&
            strlen($mobile_number) == 10 &&
            $tenure != "" && isset($merchant_details->category_id)){
            if($application_id > 0){
                $consumer_application = ConsumerApplication::where('id',$application_id)->first();
            }else{
                $consumer_application = new ConsumerApplication();
                $consumer_application->state = "form completed";
            }
            if($application_id == 0 || $application_id == "") {
                $consumer_application->merchant_id = $merchant_id;
                $consumer_application->merchant_location_id = $center_id;
                $consumer_application->src_representative_name = $user_id;
                $consumer_application->purpose = $merchant_details->category_id;
            }


            $merchantOffer = MerchantOffers::where('id',$offer_id)->first(['tenure']);
            if(isset($merchantOffer->tenure)){
                $tenure = $merchantOffer->tenure;
            }

            $consumer_application->name = $name;
            $consumer_application->lender_id = 2;
            $consumer_application->mobile_number = $mobile_number;
            $consumer_application->tenure = $tenure;
            $consumer_application->offer_id = $offer_id;
            $consumer_application->loan_amount = $loan_amount;
            $consumer_application->updated_by = "Mobile App";
            if($user_type >=5){
                $consumer_application->created_by = $user_id;
            }

            if($application_id <= 0) {
                $customer = $consumer_application->saveCustomer();
                $consumer_application->applicant_id = $customer->applicant_id;
                $consumer_application->co_applicant_id = $customer->co_applicant_id;

            }

            $consumer_application->save();


            if($application_id == 0 || $application_id == "") {
                StatusLogs::insert([
                    'application_id' => $consumer_application->id,
                    'user_id' => $session_string[2],
                    'status' => 'form completed',
                    'created_at' => Carbon::now()->toDateTimeString()
                ]);
            }


            if($application_id == 0 && isset($consumer_application->id)){
                (new ConsumerApplicationController())->waitReminder($consumer_application->id);
            }

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

            $consumer_application_elements->center_id = $center_id;
            $consumer_application_elements->product_name = $product_id != 'others' ? $product_id : $product_name;
            $consumer_application_elements->duration = $duration;
            $consumer_application_elements->preferred_language = $preferred_language;
            $consumer_application_elements->unique_id_number = $unique_id_number;
            $consumer_application_elements->save();

            $application_user_id = (new ConsumerApplicationController())->userCreation($consumer_application, $skipped);
            $consumer_application->user_id = $application_user_id;
            $consumer_application->save();

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

            if($application_id == 0) {
                $user_id = $session_string[2];
                $user = User::where('id', $user_id)->first();
                $consumer_application_controller = new ConsumerApplicationController();
                $consumer_application_controller->sendslackmessage($consumer_application->id, 'form completed', '', '- By Mobile App', $user->name);

                $consumer_application_controller = isset($consumer_application_controller) ? $consumer_application_controller : new ConsumerApplicationController();
                $consumer_application_controller->sendMessageOnWhatsApp($consumer_application->id, 'merchant');
                $lenderService = new LenderServices(new Request());
                $lenderService->sendConstantMessage($consumer_application->id);
            }
            $merchant = Merchant::where('id', $merchant_id)->first();
            $total = DB::table('consumer_application')->select(DB::raw('count(*) as app_count'), DB::raw('SUM(approved_amount) as total_approved_amount'))->where('merchant_id', $merchant_id)->whereIn('state', ['approved','disbursement checklist done','ready for disbursement','disbursed','nach registered','closed'])->first();
            $total_remaining_amount = $merchant->max_approval_value - $total->total_approved_amount;
            if ($merchant->status == 'active' && $merchant->pre_status == 1 && ($loan_amount > $total_remaining_amount || $total->total_approved_amount > $merchant->max_approval_value || $total->app_count >= $merchant->max_no_cases)) {
                if($user_type == 'Merchant' || $user_type == 'Executive' || $user_type == 'Center') {
                    event(new EventPushNotificationToMerchant($session_string[2]));
                }
            }
            $data['status'] = 'OK';
            $data['message'] = 'Application saved successfully';
            $data['application_id'] = $consumer_application->id;
            return $data;
        }else{
            $data = array();
            $data['status'] = 'FAIL';
            $data['message'] = 'Please check request data';
            return $data;
        }


    }

    public static function indentification_details($request_data,$session_string,$request){
        $pan_number = (isset($request_data->pan) ) ? trim(strtoupper($request_data->pan)) : "";
        $name = (isset($request_data->name) ) ? trim($request_data->name) : "";
        $dob = (isset($request_data->dob) ) ? $request_data->dob : "";
        $gender = (isset($request_data->gender) ) ? $request_data->gender : "";
        $application_id = (isset($request_data->application_id) ) ? $request_data->application_id : "";
        $email = (isset($request_data->email) ) ? trim($request_data->email) : "";

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

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

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

        if($gender == "" || ($gender != "MALE" && $gender != "FEMALE")){
            $data = array();
            $data['status'] = 'FAIL';
            $data['message'] = 'Please check Gender';
            return $data;
        }

        if(($dob == "" || $dob == '1970-01-01')){
            $data = array();
            $data['status'] = 'FAIL';
            $data['message'] = 'Please check Date of Birth';
            return $data;
        }
        $diff = static::calculateAge($dob);
        if($diff < 18){
            $data = array();
            $data['status'] = 'FAIL';
            $data['message'] = 'Minimum Age of Applicant should be 18 years';
            return $data;
        }
        if($diff > 65){
            $data = array();
            $data['status'] = 'FAIL';
            $data['message'] = 'Age exceed maximum age criteria';
            return $data;
        }
        if($email != "" && !filter_var($email, FILTER_VALIDATE_EMAIL)){
            $data = array();
            $data['status'] = 'FAIL';
            $data['message'] = 'Please check Email id';
            return $data;
        }
        if($pan_number != "" && static::pan_format_validation($pan_number) == "Valid" &&
            ($dob != "" && $dob != '1970-01-01') && $gender != ""){

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

            $consumer_application->email = $email;
            $consumer_application->gender = $gender;
            $consumer_application->pan_card = $pan_number;
            $consumer_application->dob = $dob;
            $consumer_application->updated_by = "Mobile App";
            if($user_type >=5){
                $consumer_application->created_by = $user_id;
            }

            $consumer_application->save();

            if($request->hasFile('document')) {
//                (new \App\Slack(new Request(['title'=>'#1 Pan', 'fields'=>['value' => $consumer_application->id]])))->send();
                static::uploadToS3("pan_card",$consumer_application->id,$request->file('document'));
            }

            if((new MerchantApiController())->checkDuplicateApplication($consumer_application) && $consumer_application->state === 'form completed'){
                $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 ' . (new MerchantApiController())->getRemainingMonths($application_id) . ' Month';
                return $data;
            }

            if(isset($consumer_application->id)){
                (new ConsumerApplicationController())->waitReminder($consumer_application->id);
            }

            if ($consumer_application->applicant_id) {
                static::sendVerificationEmail($name, $consumer_application->applicant_id);
            }
            if ($consumer_application->co_applicant_id) {
                static::sendVerificationEmail($name, $consumer_application->co_applicant_id);
            }


            $data = array();
            $data['status'] = 'OK';
            $data['message'] = 'Application saved successfully';
            $data['application_id'] = $consumer_application->id;
            return $data;
        }else{
            $data = array();
            $data['status'] = 'FAIL';
            $data['message'] = 'Please check request data';
            return $data;
        }
    }

//    public static function getStateFromGoogle($pincode){
//        $apiData = file_get_contents('https://maps.googleapis.com/maps/api/geocode/json?address=' . $pincode . '&sensor=true&key=AIzaSyDpwBBCp_3gpYQXVY8mXS1owp5k1paY3uA');
//        $apiData = json_decode($apiData, 1);
//        $results = isset($apiData['results']) ? $apiData['results'] : '';
//        foreach ($results as $addr) {
//            $address = isset($addr['address_components']) ? $addr['address_components'] : '';
//            foreach ($address as $addr_state) {
//                if (isset($addr_state['types'][0]) && $addr_state['types'][0] == "administrative_area_level_1") {
//                    return isset($addr_state['long_name']) ? $addr_state['long_name'] : '';
//                }
//            }
//        }
//        return false;
//    }

    public static function address_details($request_data,$session_string,$request){

        if(isset($request_data->address)) {
            if(isset($request_data->address->permanent_address) && isset($request_data->application_id)) {
                $application_id = $request_data->application_id;
                $permanent_address_text = (isset($request_data->address->permanent_address->address_text)) ? $request_data->address->permanent_address->address_text : "";
                $permanent_formatted_text = (isset($request_data->address->permanent_address->formatted_text)) ? $request_data->address->permanent_address->formatted_text : "";
                $permanent_city = (isset($request_data->address->permanent_address->city)) ? $request_data->address->permanent_address->city : "";
                $permanent_state = (isset($request_data->address->permanent_address->state)) ? $request_data->address->permanent_address->state : "";
                $permanent_pin_code = (isset($request_data->address->permanent_address->pin_code)) ? $request_data->address->permanent_address->pin_code : "";
                $permanent_address_type = (isset($request_data->address->permanent_address->address_type)) ? $request_data->address->permanent_address->address_type : "";
                $permanent_lat_long = (isset($request_data->address->permanent_address->lat_long)) ? "" : "";

                if(isset($request_data->address->current_address)){
                    $address_text = (isset($request_data->address->current_address->address_text)) ? $request_data->address->current_address->address_text : "";
                    $formatted_text = (isset($request_data->address->current_address->formatted_text)) ? $request_data->address->current_address->formatted_text : "";
                    $city = (isset($request_data->address->current_address->city)) ? $request_data->address->current_address->city : "";
                    $state = (isset($request_data->address->current_address->state)) ? $request_data->address->current_address->state : "";
                    $pin_code = (isset($request_data->address->current_address->pin_code)) ? $request_data->address->current_address->pin_code : "";
                    $address_type = (isset($request_data->address->current_address->address_type)) ? $request_data->address->current_address->address_type : "";
                    $lat_long = (isset($request_data->address->current_address->lat_long)) ? "" : "";
                }else{
                    $address_text = (isset($request_data->address->permanent_address->address_text)) ? $request_data->address->permanent_address->address_text : "";
                    $formatted_text = (isset($request_data->address->permanent_address->formatted_text)) ? $request_data->address->permanent_address->formatted_text : "";
                    $city = (isset($request_data->address->permanent_address->city)) ? $request_data->address->permanent_address->city : "";
                    $state = (isset($request_data->address->permanent_address->state)) ? $request_data->address->permanent_address->state : "";
                    $pin_code = (isset($request_data->address->permanent_address->pin_code)) ? $request_data->address->permanent_address->pin_code : "";
                    $address_type = (isset($request_data->address->permanent_address->address_type)) ? $request_data->address->permanent_address->address_type : "";
                    $lat_long = (isset($request_data->address->permanent_address->lat_long)) ? "" : "";
                }
//                $permanent_state = '';
//                $state = '';
//                if ($_state = static::getStateFromGoogle($permanent_pin_code)){
//                    $permanent_state = $_state;
//                }
//
//                if ($_state = static::getStateFromGoogle($pin_code)){
//                    $state = $_state;
//                }

                if (!ctype_digit($pin_code) || (strlen($pin_code)) != '6' || $state == '' ) {
                    $data = array();
                    $data['status'] = 'FAIL';
                    $data['message'] = 'Invalid current address pincode';
                    return $data;
                }

                if (!ctype_digit($permanent_pin_code) || (strlen($permanent_pin_code)) != '6' || $permanent_state == '' ) {
                    $data = array();
                    $data['status'] = 'FAIL';
                    $data['message'] = 'Invalid permanent address pincode';
                    return $data;
                }

                if ($address_text != "" && $formatted_text != "" && $city != "" && $state != "" && $address_type != "") {
                    $consumer_application = ConsumerApplication::where('id',$application_id)->first();
                    if(isset($consumer_application->id)) {
                        $consumer_application->current_address_line_1 = (strpos($address_text.",".$formatted_text, $city) != "" || strpos($address_text.",".$formatted_text, $city) != 0 ) ? substr($address_text.",".$formatted_text, 0, strpos($address_text.",".$formatted_text, $city)) : $address_text.",".$formatted_text;
                        $consumer_application->current_address_state = $state;
                        $consumer_application->current_address_city = $city;
                        $consumer_application->current_address_landmark = $formatted_text;
                        $consumer_application->current_address_pincode = $pin_code;
                        $consumer_application->current_address_status = $address_type;
                        $consumer_application->permanent_address_line_1 = (strpos($permanent_address_text.",".$permanent_formatted_text, $permanent_city) != "" || strpos($permanent_address_text.",".$permanent_formatted_text, $permanent_city) != 0 ) ? substr($permanent_address_text.",".$permanent_formatted_text, 0, strpos($permanent_address_text.",".$permanent_formatted_text, $permanent_city)) : $permanent_address_text.",".$permanent_formatted_text;
                        $consumer_application->permanent_address_state = $permanent_state;
                        $consumer_application->permanent_address_city = $permanent_city;
                        $consumer_application->permanent_address_landmark = $permanent_formatted_text;
                        $consumer_application->permanent_address_pincode = $permanent_pin_code;
                        $consumer_application->permanent_address_status = $permanent_address_type;
                        $consumer_application->save();

                        $consumer_application_elements = ConsumerApplicationElement::where('application_id',$consumer_application->id)->first();
                        if(!isset($consumer_application_elements->id)){
                            $consumer_application_elements = new ConsumerApplicationElement();
                            $consumer_application_elements->application_id = $consumer_application->id;
                        }
                        $consumer_application_elements->current_address_lat_long = $lat_long;
                        $consumer_application_elements->permanent_address_lat_long = $permanent_lat_long;
                        $consumer_application_elements->current_address_text = $address_text;
                        $consumer_application_elements->current_formatted_text = $formatted_text;
                        $consumer_application_elements->permanent_address_text = $permanent_address_text;
                        $consumer_application_elements->permanent_formatted_text = $permanent_formatted_text;
                        $consumer_application_elements->save();

                        $request_all = $_FILES;
                        $response_array = [];
                        foreach ($request_all as $key=>$file){
                            $files_type = str_replace("|0"," ",$key);
                            $files_type = str_replace("|"," ",$files_type);
                            $response = static::uploadToS3($files_type,$request_data->application_id,$request->file($key));
                            $response_array[] = ['filetype' => $files_type, 'status' => $response['status']];
                        }

                        $data = array();
                        $data['status'] = 'OK';
                        $data['message'] = 'Address saved successfully';
                        $data['application_id'] = $consumer_application->id;
                        $data['doc_response'] = $response_array;
                        return $data;
                    }
                }
            }
        }
        $data = array();
        $data['status'] = 'FAIL';
        $data['message'] = 'Please check request data';
        return $data;
    }

    public static function income_details($request_data,$session_string,$request){

        $profession_type = (isset($request_data->profession_type) ) ? $request_data->profession_type : "";
        $net_monthly_income = (isset($request_data->net_monthly_income) ) ? $request_data->net_monthly_income : 0;
        $company_name = (isset($request_data->company_name) ) ? $request_data->company_name : "";
        $company_search_key = (isset($request_data->company_search_key) ) ? $request_data->company_search_key : "";

        $designation = (isset($request_data->designation) ) ? $request_data->designation : "";
        $department = (isset($request_data->department) ) ? $request_data->department : "";
        $contact = (isset($request_data->contact) ) ? $request_data->contact : "";

        $company_type = (isset($request_data->company_type) ) ? $request_data->company_type : null;
        $doj = (isset($request_data->doj) ) ? $request_data->doj : "";


        if($profession_type != "" && (($net_monthly_income != "" && $net_monthly_income > 0 && ($company_name != "" || $company_search_key != '')) || $profession_type == "UNEMPLOYED") && isset($request_data->application_id)){
            $application_id = $request_data->application_id;

            $isExisting = Company::where('company',$company_search_key)->first(['id']);
            if (isset($isExisting->id)){
                $company_name = $isExisting->id;
            }else{
                if(empty($company_name) && !empty($company_search_key)){
                    $CompanyID = Company::insertGetId([
                        'category' => 'CAT D',
                        'company' => $company_search_key,
                    ]);
                    $company_name = $CompanyID;
                }
            }
            $consumer_application = ConsumerApplication::where('id',$application_id)->first();
            if(isset($consumer_application->id)) {
                $consumer_application->employee_status = $profession_type;
                $consumer_application->monthly_income = $net_monthly_income;
                $consumer_application->company_name = $company_name;
                /*if($consumer_application->state == 'form completed') {
                    $consumer_application->state = "in-process";
                }*/
                $consumer_application->save();

               /* StatusLogs::insert([
                    'application_id' => $consumer_application->id,
                    'user_id' => $session_string[2],
                    'status' => 'in-process',
                    'created_at' => Carbon::now()->toDateTimeString()
                ]);*/

                $consumer_application_elements = ConsumerApplicationElement::where('application_id',$consumer_application->id)->first();
                if(!isset($consumer_application_elements->id)){
                    $consumer_application_elements = new ConsumerApplicationElement();
                    $consumer_application_elements->application_id = $consumer_application->id;
                }
                $consumer_application_elements->designation = $designation;
                $consumer_application_elements->department = $department;
                $consumer_application_elements->contact = $contact;
                $consumer_application_elements->profession_type = $company_type;
                $consumer_application_elements->save();

                $consumer_verification = Checklist::where('application_id',$consumer_application->id)->first();
                if(!isset($consumer_verification->id)){
                    $consumer_verification = new Checklist();
                    $consumer_verification->application_id = $consumer_application->id;
                }
                if($doj != "") {
                    $consumer_verification->joining_date = Carbon::createFromFormat('Y-m', $doj)->toDateTimeString();
                }

                $consumer_verification->save();

                if($profession_type == "UNEMPLOYED"){
                    $data = array();
                    $data['status'] = 'OK';
                    $data['approval_status'] = 4;
                    $data['message'] = 'Thanks for applying on behalf of '.$consumer_application->name.'. Our Advisor will be in touch with you shortly to convey our decision or to request additional information.';
                    $data['application_id'] = $consumer_application->id;
                    return $data;
                }

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

                $i = 1;
                $arraydate = [5,18];
                $available_dates = array();
                do {
                    $newTime = strtotime('+'.$i++.' days',$startDate);
                    if(in_array(date('d',$newTime),$arraydate)){
                        array_push($available_dates,date('Y-m-d',$newTime));
                    }
                } while ($newTime < $endDate);
                $consumer_application->approved_amount = $consumer_application->loan_amount;
                $consumer_application->save();
                /*if(env('APP_CONNECTION') == 0 || ($consumer_application->merchant_id == 73 && ($consumer_application->mobile_number == 8384820006 || $consumer_application->mobile_number == 9820603150))) {
                    $consumer_application_elements->is_auto_approved = 1;
                    $consumer_application_elements->save();
                    $data = array();
                    $data['status'] = 'OK';
                    $data['approval_status'] = 1;
                    $data['available_dates'] = $available_dates;
//                    $data['message'] = 'We are very happy to inform you that your application for an Easy EMI plan has been approved!';
                    $data['message'] = 'Congratulations! '.$consumer_application->name.'\'s. Easy EMI plan has been approved! ';
                    $data['application_id'] = $consumer_application->id;
                    return $data;
                }*/
                $request = new Request();
                $application = ConsumerApplication::with('category', 'merchant')->where('id',$request_data->application_id)->first();
                $offer = MerchantOffers::where('id',$application->offer_id)->first(['interest_type_id']);
                $emi_date = date('d/m/Y',strtotime($available_dates[0]));
                $request->request->add(
                    [
                        'first_emi_date' =>$emi_date,
                        'user_id' => $session_string[2],
                        '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
                    ]
                );

                $consumerApplicationController = (new ConsumerApplicationController());
                $consumerApplicationController->generateEMI($request, $application, $request_data->application_id);
                static::generate_score_card($consumer_application->id);
                $testImport = new TestImport(new Request());
                $requestID = $testImport->random_strings(8);
                $grade = new GradeController(new Request(['request_ap_id' => $requestID]));
                $_grade = $grade->ApprovalCheck($consumer_application->id);

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

//                static::approvalLog($check_approval, $application_id, $requestID);

                if ($_grade && $consumer_application->state != 'approved') {
                    $consumer_application->approved_amount = 0;
                    $consumer_application->save();
                    $consumer_application_elements->is_auto_approved = 1;
                    $consumer_application_elements->save();
                    $data = array();
                    $data['status'] = 'OK';
                    $data['approval_status'] = 1;
                    $data['available_dates'] = $available_dates;
//                  $data['message'] = 'We are very happy to inform you that '.$consumer_application->name.'\'s. application for an Easy EMI plan has been approved! ';
                    $data['message'] = 'Congratulations! '.$consumer_application->name.'\'s. Easy EMI plan has been approved! ';
                    $data['application_id'] = $consumer_application->id;
                    $consumerApplicationController->checkApprovedPinCode($application_id);
//                  $grade->initAutoDocumentation($_grade, $consumer_application->id);
                    return $data;
                }elseif($grade->autoReject($_grade, $consumer_application->id)){
                    $consumer_application->state = "rejected";
                    $consumer_application->approved_amount = 0;
                    $consumer_application->save();
                    $status = 'rejected';
                    StatusLogs::insert([
                        'application_id' => $consumer_application->id,
                        'user_id' => 107,
                        'status' => $status,
                        'created_at' => Carbon::now()->toDateTimeString()
                    ]);
                    $data = array();
                    $data['status'] = 'OK';
                    $data['approval_status'] = 3;
                    $data['message'] = 'Thanks for applying on behalf of '.$consumer_application->name.'. We regret to inform you that we 
                    cannot approve their request at this time. Thanks for showing interest in Credit Fair and we\'d be happy to reconsider '.$consumer_application->name.' again after 3 months. Feel free to call us on +919967235047 or email us on ops@creditfair.in if you need any support.';
                    $data['application_id'] = $consumer_application->id;
                    static::resetEMIs($application_id);
                    try {
                        $consumerApplicationController->sendMessageToMerchant($status, $consumer_application->id);
                    }catch (\Exception $exception){

                    }
                    return $data;
//                }elseif((isset($check_approval['score']) && $check_approval['score'] < 500) || (isset($check_approval['pastDues']) && $check_approval['pastDues'] > 10000)){
//                    $data = array();
//                    $data['status'] = 'OK';
//                    $data['approval_status'] = 3;
//                    $consumer_application->state = "rejected";
//                    $consumer_application->save();
//                    $data['message'] = 'Thanks for applying on behalf of '.$consumer_application->name.'. We regret to inform you that we cannot approve your request at this time. Thanks for showing interest in Credit Fair and we hope '.$consumer_application->name.' will consider us in the future. We’d be happy to reconsider again after 3 months.';
//                    $data['application_id'] = $consumer_application->id;
//                    return $data;
                }else if($preApprovalID = $grade->pre_approvalCheck($_grade, $consumer_application->id)){
                    $document_rule_id = $grade->initAutoDocumentation($_grade, $consumer_application->id, false);
                    $consumerApplication = new ConsumerApplicationController();
                    $consumerApplication->sendPreApprovalCommunication($consumer_application->id, $document_rule_id);
                    $consumerApplication->checkApprovedPinCode($application_id);
                    $consumer_application->state = "pre approved";
                    $consumer_application->save();
                    StatusLogs::insert([
                        'application_id' => $consumer_application->id,
                        'user_id' => 107,
                        'status' => 'pre approved',
                        'created_at' => Carbon::now()->toDateTimeString()
                    ]);
                    $data = array();
                    $data['status'] = 'OK';
                    $data['approval_status'] = 3;
                    $data['message'] = 'We are very happy to inform you that '.$consumer_application->name.'\'s. application for an Easy EMI plan has been pre-approved up to Rs.'.$consumer_application->loan_amount.'subject to submission of following documents: ';
                    $data['application_id'] = $consumer_application->id;
                    return $data;
                } else{
                    $grade->initAutoDocumentation($_grade, $consumer_application->id);
                    $consumer_application->approved_amount = 0;
                    $consumer_application->save();
                    $data = array();
                    $data['status'] = 'OK';
                    $data['approval_status'] = 2;
                    $data['message'] = 'Thanks for applying on behalf of '.$consumer_application->name.'. Our Advisor will be in touch with you shortly to convey our decision or to request additional information. Feel free to call us on +919967235047 or email us on ops@creditfair.in if you need any support.';
                    $data['application_id'] = $consumer_application->id;
                    static::resetEMIs($application_id);
                    return $data;
                }

                $data = array();
                $data['status'] = 'OK';
                $data['message'] = 'Application saved successfully';
                $data['application_id'] = $consumer_application->id;
                return $data;
            }
        }
            $data = array();
            $data['status'] = 'FAIL';
            $data['message'] = 'Please check request data';
            return $data;
    }

    public static function resetEMIs($id){
        if($id > 0) {
            $emi = ApplicationEMICalculation::where('application_id', $id)->first(['id']);
            if(isset($emi->id)){
                ApplicationEMICalculation::where('application_id', $id)->delete();
            }

            $emiDueReminder = JobProvider::where('application_id',$id)->where('from','emiDueReminder')->first(['id']);
            if (isset($emiDueReminder->id)) {
                JobProvider::where('id',$emiDueReminder->id)->delete();
            }
        }
    }

    public static function approvalLog($data, $id, $requestID){
        try {
            if(isset($data['error'])) {
                $approval = Approval::where('application_id', $id)->first(['id']);
//                if (!isset($approval->id)) {

                    if (empty($data['AccountType'])) {
                        $data['AccountType'] = 0;
                    } else {
                        $data['AccountType'] = 1;
                    }
                    $data['application_id'] = $id;
                    $data['status'] = 1;
                    $data['created_at'] = Carbon::now()->toDateTimeString();
                    $data['request_id'] = isset($requestID) ? $requestID : '';
                    Approval::insert($data);
//                }
            }else{
                $data['log'] = json_encode($data);
                $data['application_id'] = $id;
                $data['status'] = 1;
                $data['created_at'] = Carbon::now()->toDateTimeString();
                $customApproval = new CustomApproval();
                $customApproval->fill($data);
                $customApproval->save();
            }
        }catch (\Exception $e){
            (new \App\Slack(new \Illuminate\Http\Request(['title'=>'Approval Log Error','fields'=>['Application ID'=>$id,'error'=>$e->getMessage(),'line'=>$e->getLine(),'trace'=>$e->getTraceAsString(),'application_id'=>$id,'id_type'=>'application_id']])))->send();
        }
    }

    public static function pan_format_validation($pannumber)
    {
        $pattern = '/^([a-zA-Z]){5}([0-9]){4}([a-zA-Z]){1}?$/';
        $result = preg_match($pattern, $pannumber);
        if ($result) {
            $findme = ucfirst(substr($pannumber, 3, 1));
            $mystring = 'CPHFATBLJG';
            $pos = strpos($mystring, $findme);
            if ($pos === false) {
                $msg = "Not valid";
            } else {
                $msg = "Valid";
            }
        } else {
            $msg = "Not Valid";
        }
        return $msg;
    }

    public static function generate_score_card($id){
        //(new ConsumerApplicationController())->generateEqifaxReport($id);
        $request = new Request();
        $request->attributes->add(['application_id'=>$id]);
        (new ConsumerApplicationController())->getScoreCard($request);
    }

    public static function isProcessed($id, $name, $score,  $id_type, $source, $user_id = 0){

        $user = Auth::user();
        $user_id = $user_id == 0 ? ($user ? $user->id : 0) : 0;

        if(!$user_id){
            if($userData = \request()->get('user')){
                $user_id  = isset($userData->id) ? $userData->id : (isset($userData['id']) ? $userData['id'] : 0);
            }
        }

        $failedScoreRequest = FailedScoreRequests::where('_id', $id)->where('id_type',$id_type)->where('name', $name)->where('source', $source)->where('user_id', $user_id)->orderBy('created_at','desc')->first(['id','counter']);

        if(isset($failedScoreRequest->id)){
            if($failedScoreRequest->counter < 2){
                FailedScoreRequests::where('id', $failedScoreRequest->id)->update(['counter' => ($failedScoreRequest->counter + 1)]);
                return true;
            }
            return false;
        }else{
            FailedScoreRequests::insert(
                [
                    '_id' => $id,
                    'id_type' => $id_type,
                    'source' => $source,
                    'user_id' => $user_id,
                    'name' => $name,
                    'score' => $score,
                    'counter' => 0,
                ]
            );
            return true;
        }
    }

    public static function uploadToS3ForMerchant($file_type, $id, $file, $password = ""){
        $fileObject = $file->getClientOriginalExtension();
        $file_path = '/merchant/' . $id . '/' . $file_type . $file->getClientOriginalExtension();
        $score = 0;

        if(strpos($file_type, 'bank_statement') === false && in_array($file->getClientOriginalExtension(), ['jpg', 'jpeg', 'gif', 'png', 'bmp', 'svg', 'svgz', 'cgm', 'djv', 'djvu', 'ico', 'ief','jpe', 'pbm', 'pgm', 'pnm', 'ppm', 'ras', 'rgb', 'tif', 'tiff', 'wbmp', 'xbm', 'xpm', 'xwd'])) {
            $imageQuality = (new ConsumerApplicationController())->checkImageQuality($file_type, $file);
            $score = round(trim($imageQuality['imageScore']), 2);
            $file = $imageQuality['file'];
            try {
                if ($score <= 150 && static::isProcessed($id, $file_type, $score, 'merchant_id','PWA')) {
                    return ['status' => 'FAIL'];
                }
            }catch (\Exception $e){
                //(new \App\Slack(new \Illuminate\Http\Request(['title'=>'Doc Error','fields'=>['Application ID'=>$id,'error'=>$e->getMessage(),'line'=>$e->getLine(),'trace'=>$e->getTraceAsString(),'application_id'=>$id,'id_type'=>'application_id']])))->send();
            }
        }

        $s3 = Storage::disk('s3');
        if ($file) {
            $s3->put($file_path, $file);
            $data['file_type'] = $file_type;
            $data['id'] = $id;
            $data['ismerchant'] = 1;
            $data['password'] = $password;
            $data['image_score'] = $score;
            (new ConsumerApplicationController())->getUploadedFileNameMultiple($s3, $file_path,$data);
//            $s3_path = (new ConsumerApplicationController())->getUploadedFileName($s3, $file_path);
//            if ($s3) {
//                $consumer_application_file                          = new ConsumerApplicationFiles();
//                $consumer_application_file->consumer_application_id = $id;
//                $consumer_application_file->file_type               = $file_type;
//                $consumer_application_file->bank_name               = '';
//                $consumer_application_file->password               = '';
//                $consumer_application_file->file_path               = ($s3_path) ? $s3_path : $file_path;
//                $consumer_application_file->save();
//            }
        }
        return ['status' => 'OK'];
    }

    public static function uploadToS3($file_type, $id, $file,$password = ""){

        $fileObject = $file->getClientOriginalExtension();
        $file_path = '/' . $id . '/' . $file_type. '.' . $fileObject;
        $score = 0;

        if(strpos($file_type, 'bank_statement') === false && in_array($fileObject, ['jpg', 'jpeg', 'gif', 'png', 'bmp', 'svg', 'svgz', 'cgm', 'djv', 'djvu', 'ico', 'ief','jpe', 'pbm', 'pgm', 'pnm', 'ppm', 'ras', 'rgb', 'tif', 'tiff', 'wbmp', 'xbm', 'xpm', 'xwd'])) {
            $imageQuality = (new ConsumerApplicationController())->checkImageQuality($file_type, $file,$fileObject);
            $score = round(trim($imageQuality['imageScore']), 2);
//            $file = $imageQuality['file'];
            try {
                if ($score <= 150 && static::isProcessed($id, $file_type, $score, 'application_id','PWA')) {
                    return ['status' => 'FAIL', 'Score' => $score, 'id' => $id];
                }
            }catch (\Exception $e){
//                    (new \App\Slack(new \Illuminate\Http\Request(['title'=>'Doc Error','fields'=>['Application ID'=>$id,'error'=>$e->getMessage(),'line'=>$e->getLine(),'trace'=>$e->getTraceAsString(),'application_id'=>$id,'id_type'=>'application_id']])))->send();
            }
        }



        $s3 = Storage::disk('s3');
        if ($file) {
            $s3->put($file_path, $file);
            if($file_type === 'nach'){
                $data['file_type'] = $file_type;
            }else {
                $data['file_type'] = $file_type;
            }
            $data['id'] = $id;
            $data['password'] = $password;
            $data['image_score'] = $score;
            (new ConsumerApplicationController())->getUploadedFileNameMultiple($s3, $file_path,$data);
//            $s3_path = (new ConsumerApplicationController())->getUploadedFileName($s3, $file_path);
//            if ($s3) {
//                $consumer_application_file                          = new ConsumerApplicationFiles();
//                $consumer_application_file->consumer_application_id = $id;
//                $consumer_application_file->file_type               = $file_type;
//                $consumer_application_file->bank_name               = '';
//                $consumer_application_file->password               = '';
//                $consumer_application_file->file_path               = ($s3_path) ? $s3_path : $file_path;
//                $consumer_application_file->save();
//            }
        }
        return ['status' => 'OK', 'score' => $score, 'file_path' => $file_path];
    }

    public static function uploadToS3Consumer($file_type, $id, $file, $getClientOriginalExtension, $password = ""){
        $originalExt = $getClientOriginalExtension;
        if($file_type == 'aadhar_card'){
            $file_path = '/' . $id . '/' . $file_type.'_masked.'. $getClientOriginalExtension;
        }else{
            $file_path = '/' . $id . '/' . $file_type. $getClientOriginalExtension;
        }
        $score = 0;

        if(strpos($file_type, 'bank_statement') === false && in_array($getClientOriginalExtension, ['jpg', 'jpeg', 'gif', 'png', 'bmp', 'svg', 'svgz', 'cgm', 'djv', 'djvu', 'ico', 'ief','jpe', 'pbm', 'pgm', 'pnm', 'ppm', 'ras', 'rgb', 'tif', 'tiff', 'wbmp', 'xbm', 'xpm', 'xwd'])) {
            $imageQuality = (new ConsumerApplicationController())->checkImageQuality($file_type, $file, $getClientOriginalExtension);
            $score = round(trim($imageQuality['imageScore']), 2);
            $file = $imageQuality['file'];
            try {
                if ($score <= 150 && static::isProcessed($id, $file_type, $score, 'application_id','PWA')) {
                    return ['status' => 'FAIL'];
                }
            }catch (\Exception $e){
                //(new \App\Slack(new \Illuminate\Http\Request(['title'=>'Doc Error','fields'=>['Application ID'=>$id,'error'=>$e->getMessage(),'line'=>$e->getLine(),'trace'=>$e->getTraceAsString(),'application_id'=>$id,'id_type'=>'application_id']])))->send();
            }
        }

        $s3 = Storage::disk('s3');
        if ($file) {
            $s3->put($file_path, $file);
            if($file_type === 'nach'){
                $data['file_type'] = $file_type;
            }else {
                $data['file_type'] = $file_type;
            }
            $data['id'] = $id;
            $data['password'] = $password;
            $data['image_score'] = $score;
            (new ConsumerApplicationController())->getUploadedFileNameMultiple($s3, $file_path,$data);
//            $s3_path = (new ConsumerApplicationController())->getUploadedFileName($s3, $file_path);
//            if ($s3) {
//                $consumer_application_file                          = new ConsumerApplicationFiles();
//                $consumer_application_file->consumer_application_id = $id;
//                $consumer_application_file->file_type               = $file_type;
//                $consumer_application_file->bank_name               = '';
//                $consumer_application_file->password               = '';
//                $consumer_application_file->file_path               = ($s3_path) ? $s3_path : $file_path;
//                $consumer_application_file->save();
//            }
        }
        return ['status' => 'OK'];
    }

    public static function convertAmountToWords($number)
    {

        $no       = round($number);
        $point    = round($number - $no, 2) * 100;
        $hundred  = null;
        $digits_1 = strlen($no);
        $i        = 0;
        $str      = array();
        $words    = array('0' => '', '1'          => 'One', '2'       => 'Two',
            '3'                   => 'Three', '4'     => 'Four', '5'      => 'Five', '6' => 'Six',
            '7'                   => 'Seven', '8'     => 'Eight', '9'     => 'Nine',
            '10'                  => 'Ten', '11'      => 'Eleven', '12'   => 'Twelve',
            '13'                  => 'Thirteen', '14' => 'Fourteen',
            '15'                  => 'Fifteen', '16'  => 'Sixteen', '17'  => 'Seventeen',
            '18'                  => 'Eighteen', '19' => 'Nineteen', '20' => 'Twenty',
            '30'                  => 'Thirty', '40'   => 'Forty', '50'    => 'Fifty',
            '60'                  => 'Sixty', '70'    => 'Seventy',
            '80'                  => 'Eighty', '90'   => 'Ninety');
        $digits = array('', 'Hundred', 'Thousand', 'Lakh', 'Crore');
        while ($i < $digits_1) {
            $divider = ($i == 2) ? 10 : 100;
            $number  = floor($no % $divider);
            $no      = floor($no / $divider);
            $i += ($divider == 10) ? 1 : 2;
            if ($number) {
                $plural  = (($counter = count($str)) && $number > 9) ? '' : null;
                $hundred = ($counter == 1 && $str[0]) ? ' and ' : null;
                $str[]   = ($number < 21) ? $words[$number] .
                    " " . $digits[$counter] . $plural . " " . $hundred
                    :
                    $words[floor($number / 10) * 10]
                    . " " . $words[$number % 10] . " "
                    . $digits[$counter] . $plural . " " . $hundred;
            } else {
                $str[] = null;
            }

        }
        $str    = array_reverse($str);
        $result = implode('', $str);
        $points = ($point) ?
            "." . $words[$point / 10] . " " .
            $words[$point = $point % 10] : '';
        $amtInWord = $result.' only';
        return preg_replace('/\s+/', ' ', $amtInWord);
    }

    public static function getAmountInLac($amount){
        $ext="";//thousand,lac, crore
        $number_of_digits = strlen(round($amount)); //this is call :)
        if($number_of_digits>3)
        {
            if($number_of_digits%2!=0)
                $divider = static::divider($number_of_digits-1);
            else
                $divider = static::divider($number_of_digits);
        }
        else
            $divider=1;

        $fraction=$amount/$divider;
        $fraction=number_format($fraction,2);
        if($number_of_digits==4 ||$number_of_digits==5)
            $ext="k";
        if($number_of_digits==6 ||$number_of_digits==7)
            $ext="Lac";
        if($number_of_digits==8 ||$number_of_digits==9)
            $ext="Cr";
        return $fraction." ".$ext;
    }

    public static function divider($number_of_digits) {
        $tens="1";

        if($number_of_digits>8)
            return 10000000;

        while(($number_of_digits-1)>0)
        {
            $tens.="0";
            $number_of_digits--;
        }
        return $tens;
    }

    public static function calculateAge($dob){
        list($year, $month, $day) = explode("-", $dob);
        $year_diff  = date("Y") - $year;
        $month_diff = date("m") - $month;
        $day_diff   = date("d") - $day;
        if ($day_diff < 0 && $month_diff==0) $year_diff--;
        if ($day_diff < 0 && $month_diff < 0) $year_diff--;
        return $year_diff;
    }

    public function sendNotification($data){

        $push_data = array('title'=>$data['title'],'body'=>$data['body'],'data'=>$data['click_action']);
        if($data['document_url']){
            $push_data['document_url'] = $data['document_url'];
        }
        $curl = curl_init();

        curl_setopt_array($curl, array(
            CURLOPT_URL => "https://fcm.googleapis.com/fcm/send",
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_ENCODING => "",
            CURLOPT_MAXREDIRS => 10,
            CURLOPT_TIMEOUT => 30,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => "POST",
            CURLOPT_POSTFIELDS => json_encode(array('registration_ids'=>$data['registration_ids'],'data'=>$data)),
            CURLOPT_HTTPHEADER => array(
                "Authorization: key=AIzaSyCgCL9NFhR7dZvFC9nZt_QoIvTjiAs5nd0",
                "Content-Type: application/json",
            ),
        ));

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

        curl_close($curl);

        if ($err) {
            echo "cURL Error #:" . $err;
        } else {
            return "success";
        }
    }

    public static function sendVerificationEmail($name, $id){
        if ($id){
            $user = Customers::where('id', $id)->first(['id','is_verified','email']);
            $user['email'] = $user->email ? wall_decrypt($user->email) : '';
            if (isset($user->id) && $user->is_verified == 0 && $user->email){
                $hash = new Hashids('Creditfair by CS', 20);
                $hash_id = $hash->encode($id);

                $link = asset('/email-verification/'.$hash_id);

                $div = '<div>Dear '.$name.',</div><div style="font-size:13px;font-family:verdana,arial;line-height:1.5">Thank you for applying for a loan from Credit fair! Please click on the link below to verify your email address </div><div align="center" style="width: 100%;margin: auto;margin-top: 22px;"><div style="width: 38%;padding: 12px;text-align: center;color: white;font-size: 14px;"><span style="display: inline-block; border-radius: 4px; background-color: rgb(46, 166, 100);">
        <span style="display: inline-block; border-radius: 4px; background-color: rgb(46, 166, 100);">
				<a href="'.$link.'" style="min-width: 196px; border-width: 13px 24px; border-style: solid; border-color: rgb(67, 217, 231); border-image: initial; border-radius: 4px; background-color: rgb(67, 217, 231); color: rgb(255, 255, 255); font-size: 16px; line-height: 18px; word-break: break-word; display: inline-block; text-align: center; font-weight: 900; text-decoration: none;" target="_blank" data-saferedirecturl="https://www.google.com/url?q=http://localhost/review&amp;source=gmail&amp;ust=1572010046231000&amp;usg=AFQjCNHg77UWaPGqO6L0IR_ZVSyfdHajKA">
                    Verify Email Address
				</a>
			</span>
			</span></div></div>';

                \Mail::send('emails.reminders.basic_reminder',
                    ['body' => $div]
                    , function ($message) use ($user) {
                        $message->to($user->email)->subject('Verify your email address!');
                    });

                return true;
            }
        }
        return false;
    }
}
