<?php

namespace App\Method\KMGP2P\Payload;

use App\ConsumerApplication;
use App\ApplicationEMICalculation;
use App\EmiPayment;
use App\Http\Controllers\Admin\ConsumerApplicationController;
use App\KMGP2PBorrowerReg;
use App\Http\Controllers\Admin\DisbursementController;
use App\Method\KMGP2P\Helpers\KMGP2PHelper;
use App\Slack;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;

class Payload implements KMGP2PHelper
{
    public $request;
    public $error = null;

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

    public function getPayload($func){
        if(method_exists($this, $func)){
            return ['payload' => $this->$func()];
        }
        return ['payload' => []];
    }

    public function borrowerRegistration($wrapper = null){
        $application = ConsumerApplication::with('bank_details','application_element','creditReport')->where('id', $this->request->get('id'))->first(['id', 'name', 'dob', 'gender', 'email', 'merchant_id', 'mobile_number','pan_card','current_address_line_1','current_address_state','current_address_city','current_address_pincode','created_at','employee_status','approved_amount','monthly_income','aadhaar_card','current_address_status','permanent_address_line_1','permanent_address_city','permanent_address_state','permanent_address_pincode','permanent_address_status','company_name','purpose','co_applicant_name','co_applicant_relationship','co_applicant_gender','co_applicant_dob','co_applicant_mobile_number','co_applicant_email','co_applicant_pan_card','co_applicant_aadhaar_card','co_applicant_address_line_1','co_applicant_address_city','co_applicant_address_state','co_applicant_address_pincode','co_applicant_address_status']);

        $name = explode(' ', $application->name);
        if (empty($application->name)){
            $error = new \stdClass();
            $error->description = 'Name is required';
            $this->error = $error;
            return $this;
        }

        if (empty($application->email)){
            $error = new \stdClass();
            $error->description = 'EMAIL is required';
            $this->error = $error;
            return $this;
        }

        if (empty($application->pan_card)){
            $error = new \stdClass();
            $error->description = 'panNumber is required';
            $this->error = $error;
            return $this;
        }

        if (empty($application->dob)){
            $error = new \stdClass();
            $error->description = 'DOB is required';
            $this->error = $error;
            return $this;
        }

        if (empty($application->gender)){
            $error = new \stdClass();
            $error->description = 'Gender is required';
            $this->error = $error;
            return $this;
        }

        if (empty($application->current_address_line_1)){
            $error = new \stdClass();
            $error->description = 'Street1 is required';
            $this->error = $error;
            return $this;
        }

        if (empty($application->current_address_city)){
            $error = new \stdClass();
            $error->description = 'City is required';
            $this->error = $error;
            return $this;
        }

        if (empty($application->current_address_state)){
            $error = new \stdClass();
            $error->description = 'State is required';
            $this->error = $error;
            return $this;
        }

        if (empty($application->current_address_pincode)){
            $error = new \stdClass();
            $error->description = 'Pincode is required';
            $this->error = $error;
            return $this;
        }

        if (empty($application->employee_status)){
            $error = new \stdClass();
            $error->description = 'Employment Status is required';
            $this->error = $error;
            return $this;
        }

        if (empty($application->bank_details->bank_name)){
            $error = new \stdClass();
            $error->description = 'Bank Name is required';
            $this->error = $error;
            return $this;
        }

        if (empty($application->bank_details->branch_name)){
            $error = new \stdClass();
            $error->description = 'Branch Name is required';
            $this->error = $error;
            return $this;
        }

        if (empty($application->bank_details->name)){
            $error = new \stdClass();
            $error->description = 'Account Holder Name is required';
            $this->error = $error;
            return $this;
        }

        if (empty($application->bank_details->ifsc_code)){
            $error = new \stdClass();
            $error->description = 'IFSC is required';
            $this->error = $error;
            return $this;
        }

        if (empty($application->bank_details->account_type)){
            $error = new \stdClass();
            $error->description = 'Account Type is required';
            $this->error = $error;
            return $this;
        }

        if (empty($application->bank_details->account_number)){
            $error = new \stdClass();
            $error->description = 'Account Number is required';
            $this->error = $error;
            return $this;
        }

        if (empty($application->approved_amount)){
            $error = new \stdClass();
            $error->description = 'Loan Amount is required';
            $this->error = $error;
            return $this;
        }

        if (empty($application->monthly_income)){
            $error = new \stdClass();
            $error->description = 'Monthly Income is required';
            $this->error = $error;
            return $this;
        }

        $kmgAppln = KMGP2PBorrowerReg::where('application_id', $this->request->get('id'))->where('result','success')->first(['kmg_loan_id']);
        $disbursementData = (new DisbursementController($this->request))->getDisbursementAmount($application);
        $netDisbAmount = isset($disbursementData) && isset($disbursementData['net_disbursement']) ? $disbursementData['net_disbursement'] : 0;
        
        return [
            "appId"                     => !empty($this->request->get('id')) ? $this->request->get('id') : 0,
            "applicationId"             => isset($kmgAppln->kmg_loan_id) ? $kmgAppln->kmg_loan_id : 0,
            "firstName"                 => isset($name[0]) ? $name[0] : '',
            "middleName"                => isset($name[1]) && isset($name[2]) ? $name[1] : '',
            "lastName"                  => !isset($name[2]) && isset($name[1]) ? $name[1] : (isset($name[1]) && isset($name[2]) ? $name[2] : ''),
            "gender"                    => isset($application->gender) ? $application->gender : null,
            "dob"                       => isset($application->dob) ? $application->dob : null,
            "phoneNumber"               => isset($application->mobile_number) ? $application->mobile_number : null,
            "email"                     => isset($application->email) ? $application->email : null,
            "panNumber"                 => isset($application->pan_card) ? $application->pan_card : null,
            "aadhar"                    => isset($application->aadhaar_card) ? $application->aadhaar_card : 0,
            "address"                   => isset($application->current_address_line_1) ? $application->current_address_line_1 : null,
            "city"                      => isset($application->current_address_city) ? $application->current_address_city : null,
            "state"                     => isset($application->current_address_state) ? $application->current_address_state : null,
            "pincode"                   => isset($application->current_address_pincode) ? $application->current_address_pincode : null,
            "addressStatus"             => isset($application->current_address_status) ? $application->current_address_status : null,
            "permanentAddress"          => isset($application->permanent_address_line_1) ? $application->permanent_address_line_1 : null,
            "permanentCity"             => isset($application->permanent_address_city) ? $application->permanent_address_city : null,
            "permanentState"            => isset($application->permanent_address_state) ? $application->permanent_address_state : null,
            "permanentPincode"          => isset($application->permanent_address_pincode) ? $application->permanent_address_pincode : null,
            "permanentAddressStatus"    => isset($application->permanent_address_status) ? $application->permanent_address_status : null,
            "loanAmount"                => isset($application->approved_amount) ? $application->approved_amount : 0,
            "netAmount"                 => $netDisbAmount,
            "employmentType"            => isset($application->employee_status) ? $application->employee_status : null,
            "companyName"               => isset($application->company_name) ? $application->company_name : null,
            "netMonthlyIncome"          => isset($application->monthly_income) ? $application->monthly_income : 0,
            "purpose"                   => isset($application->purpose) ? $application->purpose : 0,
            "bankName"                  => isset($application->bank_details->bank_name) ? $application->bank_details->bank_name : null,
            "branchName"                => isset($application->bank_details->branch_name) ? $application->bank_details->branch_name : null,
            "accountName"               => isset($application->bank_details->name) ? $application->bank_details->name : null,
            "accountType"               => isset($application->bank_details->account_type) ? strtoupper($application->bank_details->account_type) : null,
            "accountNumber"             => isset($application->bank_details->account_number) ? $application->bank_details->account_number : null,
            "ifscCode"                  => isset($application->bank_details->ifsc_code) ? $application->bank_details->ifsc_code : null,
            "applicantType"             => isset($application->bank_details->applicant_type) ? $application->bank_details->applicant_type : 1,
            "coApplicantName"           => isset($application->co_applicant_name) ? $application->co_applicant_name : null,
            "coApplicantRelationship"   => isset($application->co_applicant_relationship) ? $application->co_applicant_relationship : null,
            "coApplicantGender"         => isset($application->co_applicant_gender) ? $application->co_applicant_gender : null,
            "coApplicantDob"            => isset($application->co_applicant_dob) ? $application->co_applicant_dob : null,
            "coApplicantPhoneNumber"    => isset($application->co_applicant_mobile_number) ? $application->co_applicant_mobile_number : null,
            "coApplicantEmail"          => isset($application->co_applicant_email) ? $application->co_applicant_email : null,
            "coApplicantPanNumber"      => isset($application->co_applicant_pan_card) ? $application->co_applicant_pan_card : null,
            "coApplicantAadhar"         => isset($application->co_applicant_aadhaar_card) ? $application->co_applicant_aadhaar_card : null,
            "coApplicantAddress"        => isset($application->co_applicant_address_line_1) ? $application->co_applicant_address_line_1 : null,
            "coApplicantCity"           => isset($application->co_applicant_address_city) ? $application->co_applicant_address_city : null,
            "coApplicantState"          => isset($application->co_applicant_address_state) ? $application->co_applicant_address_state : null,
            "coApplicantPincode"        => isset($application->co_applicant_address_pincode) ? $application->co_applicant_address_pincode : null,
            "coApplicantAddressStatus"  => isset($application->co_applicant_address_status) ? $application->co_applicant_address_status : null,
            "lastEMIDate"               => isset($application->application_element->last_emi_date) ? $application->application_element->last_emi_date : null,
            "creditScore"               => isset($application->creditReport[0]) ? $application->creditReport[0]->Score : 0,
            "foir"                      => isset($application->creditReport[0]) ? $application->creditReport[0]->foirIncludingCFEMI : null,
        ];
    }

    public function uploadDocument($wrapper = null){
        $applicationId = $this->request->get('id'); 
        $kmgLoanId = $this->request->get('kmg_loan_id'); 
        $file_path = $this->request->get('file_path');
        $param = $this->request->get('param');
        $s3 = Storage::disk('s3');
        if ($s3->exists($file_path)){
            $file = $s3->get($file_path);
        }elseif($param == "AADHAR" || $param == "VOTER_ID" || $param == "DRIVING_LICENSE"){
            $error = new \stdClass();
            $error->description = 'Aadhar Card or Voter ID or Driving License not masked';
            $this->error = $error;
            return $this;
        }else{
            $s3 = Storage::disk('s3_temp');
            if($s3->exists($file_path)){
                $file = $s3->get($file_path);
            }else{
                $error = new \stdClass();
                $error->description = 'File is missing';
                $this->error = $error;
                return $this;
            }
        }
        $fileArray = explode("/", $file_path);
        $file_name = $fileArray[1];
        $file_name_arr = explode(".", $file_name);
        $file_extension = $file_name_arr[1] ?? '';
        if($file_extension == ""){
            $file_name_1 = $fileArray[2];
            $file_name_arr_1 = explode(".", $file_name_1);
            $file_extension = $file_name_arr_1[1];
            $file_name = $file_name.$file_extension;
            $file_tmp_path = storage_path().'/'.$file_name;
        }else{
            $file_tmp_path = storage_path().'/'.$file_name;
        }
        file_put_contents($file_tmp_path,$file);
        $mime = "";
        if($file_extension == "jpg" || $file_extension == "jpeg"){
            $mime = "image/jpeg";
        }
        if($file_extension == "png"){
            $mime = "image/png";
        }
        if($file_extension == "pdf"){
            $mime = "application/pdf";
        }
        if($file_extension == "webm"){
            $mime = "video/webm";
        }

        if($mime == ""){
            $error = new \stdClass();
            $error->description = 'Incorrect File Type';
            $this->error = $error;
            return $this;
        }
        return [
            "appId"         => !empty($applicationId) ? $applicationId : 0,
            "applicationId" => $kmgLoanId,
            'docName'       => $file_name,
            'docFormat'     => $file_extension,
            'docContent'    => base64_encode($file),
        ];
    }

    public function saveEMI($wrapper = null){
        $emiCalc = ApplicationEMICalculation::where('application_id', $this->request->get('id'))->first();
        return [
            'appId'                     => !empty($this->request->get('id')) ? $this->request->get('id') : 0,
            'application_id'            => !empty($this->request->get('kmLoanId')) ? $this->request->get('kmLoanId') : 0,
            'offer_id'                  => !empty($emiCalc->offer_id) ? $emiCalc->offer_id : 0, 
            'tenure'                    => !empty($emiCalc->tenure) ? $emiCalc->tenure : 0, 
            'remaining_emi'             => !empty($emiCalc->remaining_emi) ? $emiCalc->remaining_emi : 0, 
            'advance_emi'               => !empty($emiCalc->advance_emi) ? $emiCalc->advance_emi : 0, 
            'interest_rate'             => !empty($emiCalc->interest_rate) ? $emiCalc->interest_rate : 0, 
            'processing_fee'            => !empty($emiCalc->processing_fee) ? $emiCalc->processing_fee : 0, 
            'emi'                       => !empty($emiCalc->emi) ? $emiCalc->emi : 0, 
            'emi_date'                  => !empty($emiCalc->emi_date) ? $emiCalc->emi_date : NULL, 
            'upfront_from_customer'     => !empty($emiCalc->upfront_from_customer) ? $emiCalc->upfront_from_customer : 0, 
            'upfront_from_credit_fair'  => !empty($emiCalc->upfront_from_credit_fair) ? $emiCalc->upfront_from_credit_fair : 0, 
            'received_by_merchant'      => !empty($emiCalc->received_by_merchant) ? $emiCalc->received_by_merchant : 0, 
            'payable_by_customer'       => !empty($emiCalc->payable_by_customer) ? $emiCalc->payable_by_customer : 0, 
            'status'                    => !empty($emiCalc->status) ? $emiCalc->status : NULL, 
            'subvention'                => !empty($emiCalc->subvention) ? $emiCalc->subvention : 0,
            'subvention_igst'           => !empty($emiCalc->subvention_igst) ? $emiCalc->subvention_igst : 0, 
            'subvention_cgst'           => !empty($emiCalc->subvention_cgst) ? $emiCalc->subvention_cgst : 0, 
            'subvention_sgst'           => !empty($emiCalc->subvention_sgst) ? $emiCalc->subvention_sgst : 0, 
            'rate'                      => !empty($emiCalc->rate) ? $emiCalc->rate : 0, 
            'annualised_interest'       => !empty($emiCalc->annualised_interest) ? $emiCalc->annualised_interest : 0, 
            'irr_rate'                  => !empty($emiCalc->irr_rate) ? $emiCalc->irr_rate : 0, 
            'annualised_irr'            => !empty($emiCalc->annualised_irr) ? $emiCalc->annualised_irr : 0, 
            'payment_frequency'         => !empty($emiCalc->payment_frequency) ? $emiCalc->payment_frequency : NULL, 
            'disbursement_method'       => !empty($emiCalc->disbursement_method) ? $emiCalc->disbursement_method : NULL, 
            'net_loan_amount'           => !empty($emiCalc->net_loan_amount) ? $emiCalc->net_loan_amount : 0, 
        ];
    }

    public function updateLoan($wrapper = null){
        (new Slack(new Request(['title'=>"KMGP2P update loan payload", 'fields'=>['Message' => json_encode($this->request->all())]])))->send();
        $application = ConsumerApplication::with( 'proFormaInvoice', 'application_element.merchant_center', 'merchant_bank_details')->where('id', $this->request->get('id'))->first();

        $bank_details = (new ConsumerApplicationController())->getBankAccountDetails($application);

        $merchant_bank = [
            'account_holder' => $bank_details['beneficiaryName'],
            'account_number' => wall_decrypt($bank_details['beneficiaryAccount']),
            'branch_name' => $bank_details['beneficiaryBranchName'],
            'ifsc_code' => $bank_details['beneficiaryIFSC'],
            'bank_name' => $bank_details['beneficiaryBankName']
        ];

        if (isset($application->proFormaInvoice)) {
            unset($application->proFormaInvoice->id);
            unset($application->proFormaInvoice->application_id);
        }

        $emails = wall_decrypt($application->merchant->email);
        $emailList = explode(',', $emails);

        return [
            'appId'                     => !empty($this->request->get('id')) ? $this->request->get('id') : 0,
            'applicationId'            => !empty($this->request->get('kmLoanId')) ? $this->request->get('kmLoanId') : 0,
            'merchant' => [
                'merchant_name' => $application->merchant->merchant_name,
                'slug' => $application->merchant->slug,
                'contact_number' => wall_decrypt($application->merchant->contact_number),
                'status' =>  $application->merchant->status,
                'email' => $emailList[0] ?? $application->merchant->email,
                'address' => $application->merchant->address,
                'category_id' => $application->merchant->category_id,
                'owner_name' => $application->merchant->owner_name
            ],
            'proFormaInvoice' => $application->proFormaInvoice,
            'merchant_bank' => $merchant_bank
        ];
    }

    public function savePaymentTransactions(){
        return $this->request->all();
    }
}
