<?php
/**
 * Created by PhpStorm.
 * User: sunil
 * Date: 10/27/18
 * Time: 2:53 PM
 */

namespace App\Http\Controllers\Admin;


use App\ConsumerApplicationElement;
use App\CampaignsJobProvider;
use App\Http\Controllers\Controller;
use App\KMGP2P;
use App\KMGP2PBorrowerReg;
use App\KMGP2PRepaymentLogs;
use App\LenderBank;
use App\LenderCategoryValidation;
use App\Lenders;
use App\MerchantCategory;
use App\Method\Homeville\Payload\Payload;
use App\QualificationMaster;
use App\Singularity\Singularity;
use App\PaymentTransaction;
use App\StateModel;
use Carbon\Carbon;
use Illuminate\Http\File;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Session;

class LenderController extends Controller
{
    private $request;

    public function __construct(Request $request){

        $this->request = $request;
    }

    public function getLenders(){
        $lenders = Lenders::paginate(10);
        return view('admin.lenders.index',['lenders'=>$lenders]);
    }

    public function addLender(){

        $data['state_list'] = StateModel::get(['name','code','id']);
        $consumerDocument = new ConsumerDocument($this->request);
        if($this->request->has('name')) {
            $lender = new Lenders();
            $lender->created_at = Carbon::now()->toDateTimeString();
            $lender->created_by = Auth::user()->id;
            $this->addEditLender($lender, $consumerDocument);
            $lender->save();
            \Session::flash('success', 'New Lender added successfully');
            return redirect()->back();
        }
        return view('admin.lenders.add', $data);
    }

    public function addEditLender($lender, $consumerDocument){
        foreach($this->request->all() as $key=>$item){
            if(!in_array($key,['_token','signature','logo','bot_app_id'/*,'brand_symbol'*/])) {
                $lender->$key = $item;
            }else if($key == 'signature' || $key == 'logo' /*|| $key == 'brand_symbol'*/){
                if($this->request->hasFile($key)) {
                    $filPath = $this->request->get('name') . '_' . $key;
                    $filPath = $consumerDocument->uploadToS3ByPath($filPath, '/' . $this->request->get('name'), $this->request->file($key), true);
                    $lender->$key = "http://s3.ap-south-1.amazonaws.com/"._env('AWS_BUCKET', 'creditfair-customer-documents')."/".$filPath;
                }
            }
        }
    }

    public function editLender($id){

        if ($this->request->has('signature')) {
        
            if($this->request->files->get('signature') != null) {
                if(filesize($this->request->files->get('signature')) > 18874368){
                Session::flash('error', 'Uploaded file is too large');
                return redirect()->back();
                }
            }
            
        }
        if ($this->request->has('logo')) {
        
            if($this->request->files->get('logo') != null) {
                if(filesize($this->request->files->get('logo')) > 18874368){
                Session::flash('error', 'Uploaded file is too large');
                return redirect()->back();
                }
            }
            
        }
        // if ($this->request->has('brand_symbol')) {
        
        //     if($this->request->files->get('brand_symbol') != null) {
        //         if(filesize($this->request->files->get('brand_symbol')) > 18874368){
        //         Session::flash('error', 'Uploaded file is too large');
        //         return redirect()->back();
        //         }
        //     }
            
        // }
        if($this->request->getMethod() == 'POST'){
            $productInfo = [
                'subvention_type' => $this->request->get('subvention_type') ?? null,
                'rate_of_interest' => $this->request->get('rate_of_interest') ?? null,
                'disbursement_phase' => $this->request->get('disbursement_phase') ?? null,
                'gst_applicable' => $this->request->get('gst_applicable') ?? null,
                'gst_not_applicable_on_subvention' => $this->request->get('gst_not_applicable_on_subvention') ?? null,
                'processing_fees' => $this->request->get('processing_fees') ?? null,
                'advance_type' => $this->request->get('advance_type') ?? null,
                'insurance_premium' => $this->request->get('insurance_premium') ?? null,
                'hold_merchant_liablility' => $this->request->get('hold_merchant_liablility') ?? null,
                'trade_advance' => $this->request->get('trade_advance') ?? null,
                'active_fldg' => $this->request->get('active_fldg') ?? null
            ];
            $this->request->request->remove('subvention_type');
            $this->request->request->remove('rate_of_interest');
            $this->request->request->remove('disbursement_phase');
            $this->request->request->remove('gst_applicable');
            $this->request->request->remove('gst_not_applicable_on_subvention');
            $this->request->request->remove('processing_fees');
            $this->request->request->remove('advance_type');
            $this->request->request->remove('insurance_premium');
            $this->request->request->remove('hold_merchant_liablility');
            $this->request->request->remove('trade_advance');
            $this->request->request->remove('active_fldg');

            $this->request->merge(['product_type_details' => json_encode($productInfo)]);
            $lender = Lenders::find($id);
            $lender->updated_at = Carbon::now()->toDateTimeString();
            $lender->updated_by = Auth::user()->id;
            $consumerDocument = new ConsumerDocument($this->request);
            $this->addEditLender($lender, $consumerDocument);
            $lender->save();
            \Session::flash('success', 'Lender details updated successfully');
            return redirect()->back();
        }
        $data['lender'] = Lenders::find($id);
        if(isset($data['lender']->product_type_details)){
            $data['productTypeInfo'] = json_decode($data['lender']->product_type_details);
        }
        $data['categories'] = MerchantCategory::all();
        $data['state_list'] = StateModel::get(['name','code','id']);
        $data['categories'] = MerchantCategory::with('tat')->get(['id','name']);

        return view('admin.lenders.add', $data);
    }

    public function getCategoryValidation(){
        if($this->request->get('lender_id') && $this->request->get('category_id')){
            $lenderCategoryValidation = LenderCategoryValidation::where('lender_id', $this->request->get('lender_id'))->where('category_id', $this->request->get('category_id'))->first();
            if (isset($lenderCategoryValidation->id)){
                return response()->json(['status' => 'OK', 'message' => 'category validation fetched', 'data' => $lenderCategoryValidation]);
            }
        }

        return response()->json(['status' => 'FAIL', 'message' => 'no validation found']);
    }

    public function saveCategoryValidation(){
        if($this->request->get('lender_id') && $this->request->get('category_id') && $this->request->get('max_approved_amount') && $this->request->get('max_net_tenure')){
            $lenderCategoryValidation = LenderCategoryValidation::where('lender_id', $this->request->get('lender_id'))->where('category_id', $this->request->get('category_id'))->first();
            if (isset($lenderCategoryValidation->id)){
                LenderCategoryValidation::where('lender_id', $this->request->get('lender_id'))->where('category_id', $this->request->get('category_id'))->update(['max_approved_amount' => $this->request->get('max_approved_amount'), 'max_net_tenure' => $this->request->get('max_net_tenure'), 'updated_by' => Auth::user()->id]);

                return response()->json(['status' => 'OK', 'message' => 'Details are updated successfully']);
            }else{
                $lenderCategoryValidation = new LenderCategoryValidation();
                $lenderCategoryValidation->lender_id = $this->request->get('lender_id');
                $lenderCategoryValidation->category_id = $this->request->get('category_id');
                $lenderCategoryValidation->max_approved_amount = $this->request->get('max_approved_amount');
                $lenderCategoryValidation->max_net_tenure = $this->request->get('max_net_tenure');
                $lenderCategoryValidation->created_by = Auth::user()->id;
                $lenderCategoryValidation->save();
                return response()->json(['status' => 'OK', 'message' => 'Category validation created successfully']);
            }
        }

        return response()->json(['status' => 'FAIL', 'message' => 'Failed to save validation']);
    }

    public function deleteCategoryValidation(){
        if($this->request->get('lender_id') && $this->request->get('category_id')){
            $lenderCategoryValidation = LenderCategoryValidation::where('lender_id', $this->request->get('lender_id'))->where('category_id', $this->request->get('category_id'))->first();
            if (isset($lenderCategoryValidation->id)){
                LenderCategoryValidation::where('lender_id', $this->request->get('lender_id'))->where('category_id', $this->request->get('category_id'))->update(['deleted_by' => Auth::user()->id]);
                LenderCategoryValidation::where('lender_id', $this->request->get('lender_id'))->where('category_id', $this->request->get('category_id'))->delete();
                return response()->json(['status' => 'OK', 'message' => 'Category validation deleted', 'data' => $lenderCategoryValidation]);
            }
        }

        return response()->json(['status' => 'FAIL', 'message' => 'Failed to delete validation']);
    }

    public function pushRepaymentsToLender(){
        try {
            $current_date = Carbon::now()->toDateTimeString();
            $kmgP2PLog = KMGP2PRepaymentLogs::orderBy('entry_creation_date', 'desc')->get(['payment_id']);
            $kmgP2PLogPaymentIds = [];
            foreach($kmgP2PLog as $_item){
                $kmgP2PLogPaymentIds[] = $_item->payment_id;
            }

            $created_after_at = "'" . Carbon::now()->subDays(7)->startOfDay()->toDateTimeString() . "'";
            $payment_transactions = DB::select('select id, emi_payment_id, amount, mode, trasanction_id, trasanction_acknowledgement, payment_date, status, created_at, updated_at, paid_by, collected_by, wallet_name, reason, umrn, (select kmg_loan_id from kmgp2p_borrower_reg where kmgp2p_borrower_reg.application_id = payment_transactions.application_id limit 1) as application_id, payment_for, payment_reconciliation_date, cf_transaction_id, bank_id, bank_name, deleted_at, is_deleted_at, deleted_by, refunded_at, refunded_by, collected_by_type, adjust_with_disbursement, adjusted_to, adjusted_by, differ_id, refund_maker_id, refund_maker_at, settlement_date from payment_transactions where id not in (' . implode(',', $kmgP2PLogPaymentIds) . ')  and created_at >= (' . $created_after_at . ') and application_id in (select kmgp2p_borrower_reg.application_id from cfwebbeta.kmgp2p_borrower_reg)');

            if (isset($payment_transactions[0]->emi_payment_id)) {
                $unchanged_payment_transactions = array_map(function ($item) {
                    return clone $item;
                }, $payment_transactions);
                $this->request->merge(['payments' => $this->getKMGP2PRepaymentData($payment_transactions)]);
                $kmgP2PController = new KMGP2PController($this->request);
                $response = $kmgP2PController->pushRepayments();
                $data = $response->getData();
                if ($data->status == 'OK') {
                    $this->updateKMGP2PRepaymentLogs($unchanged_payment_transactions, $current_date);
                } else {
                    return response()->json(['status' => 'FAIL', 'message' => 'Failed to push repayments', 'data' => $data->data ?? '']);
                }
                $message = 'Repayment pushed '. $current_date;
            }else{
                $message = 'All the repayments are updated';
            }
        }catch (\Exception $e){
            return response()->json(['status' => 'FAIL', 'message' => 'Failed to push repayments', 'error' => [
                'error_message' => $e->getMessage(),
                'error_location' => $e->getFile(),
                'error_line' => $e->getLine()
            ]]);
        }

        return response()->json(['status' => 'OK', 'message' => $message ?? 'Unknown Error']);
    }

    private function getKMGP2PRepaymentData($payment_transactions){
        $data = [];
        foreach($payment_transactions as $payment){
            $process = true;
            if ($payment->mode == 'Razorpay' && !$payment->settlement_date){
                $process = false;
            }
            if ($process) {
                unset($payment->id);
                $data[] = $payment;
            }
        }

        return $data;
    }

    private function updateKMGP2PRepaymentLogs($payment_transactions, $current_date){
        foreach($payment_transactions as $payment){
            $process = true;
            if ($payment->mode == 'Razorpay' && !$payment->settlement_date){
                $process = false;
            }
            if ($process) {
                $data[] = [
                    'payment_id' => $payment->id,
                    'entry_creation_date' => $payment->created_at,
                    'created_at' => $current_date,
                ];
            }
        }

        if (isset($data) && $data) {
            KMGP2PRepaymentLogs::insert($data);
        }
    }

    public function storeBankDetails($id, $bank_id = 0){
        if ($bank_id) {
            $bankDetails = LenderBank::where('id', $bank_id)->first(['id']);
            if (isset($bankDetails->id)) {
                $bankDetails->fill($this->request->all());
                $bankDetails->updated_by = Auth::user()->id;
                $bankDetails->save();
                Session::flash('success', 'Bank details are updated!');
                return redirect()->back();
            }
        }

        $bank = new LenderBank();
        $bank->fill($this->request->all());
        $bank->created_by = Auth::user()->id;
        $bank->created_at = Carbon::now()->toDateTimeString();
        $bank->save();
        Session::flash('success', 'Bank details are added!');
        return redirect()->to('/admin/lender/add-bank-details/'.$id);

    }

    public function createBankDetails($id){
        if (!$this->request->has('status')) {
            $data['lender'] = Lenders::with('banks')->find($id);
        }
        $data['sidebar']           = 'lenders';
        $data['lender_id'] = $id;
        return view('admin.lenders.bank.add',$data);
    }

    public function getLenderData(){

        $response = [];
        if ($this->request->has('lender_id') && $this->request->get('lender_id') == Singularity::$lender_id) {

            $qualificationMaster = QualificationMaster::get();

            if (!isset($qualificationMaster[0]->id)){
                $instance = (new Payload())->getInstance();
                $wrapperRes = $instance['wrapperMethods']->getQualificationMaster($instance['wrapper']);
            }else{
                $wrapperRes = $this->getQualificationMaster($qualificationMaster);
            }

            if ($this->request->get('id')){
                $existingData = $this->loadExistingData();
            }

            $qualificationMasterOptions = '';
            if (isset($wrapperRes->response->status) && $wrapperRes->response->status == 'success') {
                $qualificationMaster = $wrapperRes->response->data;
                foreach ($qualificationMaster as $qualification) {
                    $selected = isset($existingData) && $existingData['element']['qualificationMaster'] == $qualification->id ? 'selected' : '';
                    $qualificationMasterOptions .= '<option name="' . $qualification->id . '" '.$selected.'>' . $qualification->name . '</option>';
                }
                $response['qualificationMaster'] = $qualificationMasterOptions;
            }
        }
        return response()->json(['status' => 'OK', 'data' => $response], 200);
    }

    public function loadExistingData(){
        $applicationElement = ConsumerApplicationElement::where('application_id', $this->request->get('id'))->first(['education_level']);
        return ['element' => ['qualificationMaster' => $applicationElement->education_level ?? '']];
    }

    public function getQualificationMaster($qualificationMaster){

        $data = [];
        foreach ($qualificationMaster as $item){
            $data[] = [
                'id' => $item->id,
                'name' => $item->name,
            ];
        }

        return json_decode(json_encode([
            'response' => [
                'status' => 'success',
                'data' => $data
            ]
        ]));
    }
}