<?php

namespace App\Http\Controllers;

use App\Benificiary;
use App\Http\Controllers\Comission\AddPayoutSurcharge;
use App\Http\Controllers\Comission\RefundFromPayout;
use App\Http\Controllers\Paytm\PaytmChecksum;
use App\Payout;
use App\PayoutSurcharge;
use App\User;
use App\Wallet;
use App\VirtualTransactions;
use App\VirtualAccountUser;
use Carbon\Carbon;
use function GuzzleHttp\json_decode;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Crypt;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Session;

use Exception;

class PayoutController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */

    public function render($request, Exception $exception)
    {
        if ($exception instanceof CustomException) {
            return response()->view('errors.custom', [], 500);
        }
     
        return parent::render($request, $exception);
    }
	
    private function decrypt($encrypted, $key, $iv)
    {
        $method = 'aes-256-cbc';

        return $decrypted = openssl_decrypt(base64_decode($encrypted), $method, $key, OPENSSL_RAW_DATA, $iv);

    }

    private function encrypt($json_data, $key, $iv)
    {
        $plaintext = $json_data;

        $method = 'aes-256-cbc';

        return $encrypted = base64_encode(openssl_encrypt($plaintext, $method, $key, OPENSSL_RAW_DATA, $iv));
    }
	
	public function __construct() {
		
        
		$token = Http::withHeaders([
            "Accept" => "application/json",
            "Content-Type" => "application/json",
        ])->timeout(30)->post(env('AepsUrl') . "api/auth/login", [
            "email" => env("AepsUser"),
            "password" => env("AepsPassword"),
            "domain" => url("/") . "/",

        ]);
		$tokenResponse = $token->json();
		
        if ($token->ok()) {
            $tokenResponse = $token->json();
			$services = $tokenResponse["userservice"];
			foreach ($services as $key => $se) {
                $this->services[] = $se["service"];
                $this->services_sta[$se["service"]] = $se["status"];

            }
			if (in_array("virtual", $this->services) && $this->services_sta["virtual"] == 1) {
                $this->token = $tokenResponse["access_token"];
                $this->exp_time = $tokenResponse["expires_in"];
                $this->aepsToken = $tokenResponse["aepsToken"];
                $this->parentUser = $tokenResponse["id"];
            } else {
                abort(401);
            }
			
			
		}
		else 
		{

            abort(500);
        }

    }

    public function index(Request $request){
       $url = env('APP_URL');   
       
        if (request()->role != "") {            
            $user = User::find(Auth::user()->id);
            if ($user->payout_status == 0) {                          
                return view("payout.create", compact("user","url"));
            } 
			else 
			{                
                $users = User::with("wallet")->where(["id" => Auth::user()->id])->get();                 
				return view("payout.index", compact("users","url"));
            }

        } 
		else 
		{
            // dd('hello');
            $payout = Payout::with("user")->newQuery();
            if ($request->has("loginId") && $request->input("loginId") != '') {

                $payout->whereHas('user', function ($q) {

                    $loginId = request()->input("loginId");
                    $q->where("loginId", 'LIKE', "%$loginId%");
                });
            }
            if ($request->has("OrderId") && $request->input("OrderId") != '') {
                $OrderId = $request->input("OrderId");
                $payout->where("OrderId", 'LIKE', "%$OrderId%");
            }
            if ($request->has("ErrorDescription") && $request->input("ErrorDescription") != '') {
                $ErrorDescription = $request->input("ErrorDescription");
                $payout->where("ErrorDescription", 'LIKE', "%$ErrorDescription%");
            }
            if ($request->has("from_date") && $request->input("from_date") != '') {
                $from_date = $request->input("from_date");
                $from_date = Carbon::parse($from_date)->format("Y-m-d H:i:s");
                $payout->where("updated_at", '>=', "$from_date");
            }
            if ($request->has("to_date") && $request->input("to_date") != '') {
                $to_date = $request->input("to_date");
                $to_date = Carbon::parse(request()->input('to_date'))->format("Y-m-d 23:59:59");
                $payout->where("updated_at", '<=', "$to_date");
            }
            if ($_GET == null) {
                $date = date("Y-m-d");
                $payout->whereDate("updated_at", ">=", $date);
            }
            $payouts = $payout->orderBy('id', 'DESC')->paginate(10);
            return view('payout.view', compact("payouts"));
        }
    }
    
	public function view(Request $request){
        $module = request()->input("userMoules");
        if (!in_array("payout", $module)) {
            return redirect("home");
        }
        $payout = Payout::with("user")->where("user_id", "=", Auth::user()->id)->newQuery();

        if ($request->has("OrderId") && $request->input("OrderId") != '') {
            $OrderId = $request->input("OrderId");
            $payout->where("OrderId", 'LIKE', "%$OrderId%");
        }
        if ($request->has("ErrorDescription") && $request->input("ErrorDescription") != '') {
            $ErrorDescription = $request->input("ErrorDescription");
            $payout->where("ErrorDescription", 'LIKE', "%$ErrorDescription%");
        }
        if ($request->has("from_date") && $request->input("from_date") != '') {
            $from_date = $request->input("from_date");
            $from_date = Carbon::parse($from_date)->format("Y-m-d H:i:s");
            $payout->where("updated_at", '>=', "$from_date");
        }
        if ($request->has("to_date") && $request->input("to_date") != '') {
            $to_date = $request->input("to_date");
            $to_date = Carbon::parse(request()->input('to_date'))->format("Y-m-d 23:59:59");
            $payout->where("updated_at", '<=', "$to_date");
        }
		if ($_GET == null) {
			$date = date("Y-m-d");
			$payout->whereDate("updated_at", ">=", $date);
		}
        $payouts = $payout->paginate(10);
        return view('payout.view2', compact("payouts"));
    }

    public function getPayoutReciept(){
        $transactionHistory = Payout::with("user")->where(['id'=>request()->id])->first();         
        return view('payout.reciept',compact('transactionHistory'));
    }

    public function Calculate(){
        $amount = request()->input("amount");
        $user = User::find(Auth::user()->id);
        $pay = PayoutSurcharge::where(["member_type_id" => $user->member_type])->where("start", "<=", $amount)->where("end", ">=", $amount)->first();
		$surcharge=0;
		if(!empty($pay)){
			$surcharge = $pay->is_flat == 0 ? (($amount) * $pay->surcharge / 100) : $pay->surcharge;
		}
        
        $walletremaining = request()->input("walletBalance") - $amount - $surcharge;
        return response()->json(["amount" => number_format($amount + $surcharge, 2, '.', ''), "surcharge" => number_format($surcharge, 2, '.', ''), "wallet" => request()->input("walletBalance"), "remaining" => number_format($walletremaining, 2, '.', '')]);
    }

    public function checkStatus(){
        $OrderId = request()->input("OrderId");
        $request = [
            "orderId" => "$OrderId",
        ];

        $post_data = json_encode($request, JSON_UNESCAPED_SLASHES);

        $checksum = PaytmChecksum::generateSignature($post_data, env("PAYTM_MERCHANT_KEY"));

        $response = Http::withHeaders([
            'Content-Type' => 'application/json',
            'x-mid' => env('PAYTM_MERCHANT_ID'),
            'x-checksum' => $checksum,
        ])->post(env('TransactionURL').'disburse/order/query', $request);

        $paymentStatus = json_decode(json_encode($response->json()));
  
        if ($paymentStatus->status == "SUCCESS"|| $paymentStatus->status == "PENDING") {
            $payount = Payout::where(["OrderId" => $OrderId])->first();
            Payout::where(["OrderId" => $OrderId])->update([
                "TransactionRefNo" => $paymentStatus->result->paytmOrderId,
                "XpressID" => $paymentStatus->result->rrn,
                "TransactionMessage" => $paymentStatus->statusMessage,
                "ErrorDescription" => $paymentStatus->status,
            ]);

            Session::flash("success", ($paymentStatus->statusMessage));

        } else {
            
            $payout = Payout::where(["OrderId" => $OrderId])->first();
            Payout::where(["OrderId" => $OrderId])->update([
                "TransactionRefNo" => $paymentStatus->result->paytmOrderId,
                "XpressID" => $paymentStatus->result->rrn,
                "TransactionMessage" => $paymentStatus->statusMessage,
                "ErrorDescription" => $paymentStatus->status,
            ]);
            Wallet::insert(["user_id" => $payout->user_id, "method" => "Payout Refund", "type" => 0, "amount" => $payout->Amount, "order_id" => $payout->OrderId, "transaction_id" => $payout->OrderId, "created_at" => date("Y-m-d H:i:s"), "updated_at" => date("Y-m-d H:i:s")]);
            $RefundFromPayout = new RefundFromPayout();
            $RefundFromPayout->index($payout->Amount, $payout->user_id,$OrderId);

            Session::flash("error", $paymentStatus->statusMessage);
        }
        return back();
    }
	
	public function approvePayoutStatus($orderId = null,$paytmOrderId = null,$rrn = null,$statusMessage = null,$status = null){
		$payout = Payout::where(["OrderId" => $orderId])->first();
		if($payout->OrderId==$orderId){
            Payout::where(["OrderId" => $orderId])->update([
                "TransactionRefNo" => $paytmOrderId,
                "XpressID" => $rrn,
                "TransactionMessage" => $statusMessage,
                "ErrorDescription" => $status,
            ]);
			return response()->json([
					"status" => 1,
					"message" => "successfull",
				]);
		}
		else
		{
			return response()->json([
                "status" => 0,
                "message" => "something went wrong",
            ]);
		}
	}
	
	public function rejectPayoutStatus($orderId = null,$paytmOrderId = null,$rrn = null,$statusMessage = null,$status = null){
		$payout = Payout::where(["OrderId" => $orderId])->first();
		if($payout->OrderId==$orderId){
			Payout::where(["OrderId" => $orderId])->update([
                "TransactionRefNo" => $paytmOrderId,
                "XpressID" => $rrn,
                "TransactionMessage" => $statusMessage,
                "ErrorDescription" => $status,
            ]);
			Wallet::insert(["user_id" => $payout->user_id, "method" => "Payout Refund", "type" => 0, "amount" => $payout->Amount, "order_id" => $payout->OrderId, "transaction_id" => $payout->OrderId, "created_at" => date("Y-m-d H:i:s"), "updated_at" => date("Y-m-d H:i:s")]);
			$RefundFromPayout = new RefundFromPayout();
			$RefundFromPayout->index($payout->Amount, $payout->user_id,$orderId);
			return response()->json([
					"status" => 1,
					"message" => "successfull",
				]);
		}
		else
		{
			return response()->json([
                "status" => 0,
                "message" => "something went wrong",
            ]);
		}
		
		
	}


    public function otpVerify($id){

        $user = User::where('id', Crypt::decrypt(request()->input("code")))->first();

        if ($user->payout_otp == request()->input("otp")) {

            $payoutSta = $this->addToContact($user);

            if (($payoutSta) != null) {
                if ($payoutSta["statusCode"] == "DE_002") {
                    $user->where(["id" => Auth::user()->id])->update(["payout_status" => 1]);
                    Session::flash("success", ($payoutSta["statusMessage"]));
                } else {
                    Session::flash("error", $payoutSta["statusMessage"]);
                }
            } else {
                Session::flash("error", "Something went wrong ! Please try again");
            }
            return redirect("/payout");
        } else {
            Session::flash("error", "Invalid OTP, Please try again");
            return back();
        }
    }

    private function addToContact(User $user){

        $request = [
            "user_id" => Auth::user()->id,
            "orderId" => "ORDER_" . time(),
            "subwalletGuid" => env("PAYTM_SUBWALLET_ID"),
            "beneficiaryAccount" => "$user->account_no",
            "beneficiaryIFSC" => "$user->ifsc_code",

        ];
        $post_data = json_encode($request, JSON_UNESCAPED_SLASHES);
 

        $checksum = PaytmChecksum::generateSignature($post_data, env("PAYTM_MERCHANT_KEY"));
 
 
        $response = Http::withHeaders([
            'Content-Type' => 'application/json',
            'x-mid' => env('PAYTM_MERCHANT_ID'),
            'x-checksum' => $checksum,
        ])->post(env('TransactionURL').'beneficiary/validate', $request);
 
        $addBenificiary = $response->json();
 
        $create = ["responseStatus" => $addBenificiary["status"], "statusMessage" => $addBenificiary["statusMessage"], "created_at" => date("Y-m-d H:i:s"), "updated_at" => date("Y-m-d H:i:s")];
        $request = array_merge($request, $create);
        Benificiary::create($request);

        return $addBenificiary;

    }

  
    /**Checking Disusrsal account balance Paytm */
    private function checkDisbursalAccountBalance(){
        $paytmParams = array("subwalletGuid" => env("PAYTM_SUBWALLET_ID"));

        $post_data = json_encode($paytmParams, JSON_UNESCAPED_SLASHES);

        $checksum = PaytmChecksum::generateSignature($post_data, env("PAYTM_MERCHANT_KEY"));

        $response = Http::withHeaders([
            'Content-Type' => 'application/json',
            'x-mid' => env('PAYTM_MERCHANT_ID'),
            'x-checksum' => $checksum,
        ])->post(env('TransactionURL').'account/list', $paytmParams);

        return json_decode(json_encode($response->json()));
    }
    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create(){

        $users = User::with("wallet")->where(["id" => Auth::user()->id])->get();
        if ($users[0]->payout_payment_otp != request()->otp) {
            Session::flash("error", "Invalid Otp)");
            return back();
        }
        $debit = 0.00;
        $credit = 0.00;
        foreach ($users[0]->wallet as $key => $user) {
            if ($user->type == 0) {
                $credit = $credit + $user->amount;
            } else {
                $debit = $debit + $user->amount;
            }
        }

        if ($users[0]->payout_status == 0 || $users[0]->payout_status == null) {
            Session::flash("error", "You are not authorished to use this process (आप इस प्रक्रिया का उपयोग करने के लिए अधिकृत नहीं हैं)");
            return back();
        }
        $balance = $credit - $debit;

        $amount = request()->input("amount");

        $user = User::find(Auth::user()->id);
        $pay = PayoutSurcharge::where(["member_type_id" => $user->member_type])->first();

        $surcharge = $pay->is_flat == 0 ? (($amount) * $pay->surcharge / 100) : $pay->surcharge;
        $walletremaining = request()->input("walletBalance") - $amount - $surcharge;

        if ($balance < $amount || $walletremaining < 0) {
            Session::flash("error", "Kindly enter amount less than total balance (कुल बैलेंस से कम राशि दर्ज करें)");
            return redirect("/payout");
        }
        $princeRemainingBalance = $this->checkDisbursalAccountBalance();

        if ((float) $princeRemainingBalance->result[0]->walletBalance < (float) $amount) {
            Session::flash("error", "Service down from bank, Contact Administrator");
            return redirect("/payout");
        }
        $apiResponse = $this->makePayout(request(), $users);

        //$paytmParams = ["subwalletGuid" => env("PAYTM_SUBWALLET_ID"),"beneficiaryPhoneNo"=> $users[0]->contact, "transferMode" => $request->input("payment_type"), "orderId" => $orderId, "beneficiaryAccount" => $users[0]->account_no, "beneficiaryIFSC" => $users[0]->ifsc_code, "amount" => $request->input("amount"), "purpose" => "OTHERS", "comments" => "Payout Transfer" . $users[0]->loginId, "date" => date("Y-m-d")];

        if ($apiResponse->statusCode == "DE_002") {
            $payout = Payout::create([
                'user_id' => Auth::user()->id,
                'XpressID' => "",
                'OrderId' => request()->input("orderId"),
                'TransactionRefNo' => "",
                'BankRefNo' => "",
                'TransactionMessage' => $apiResponse->statusMessage,
                'AccountNo' => $users[0]->account_no,
                'CompanyName' => $users[0]->name,
                'ErrorDescription' => $apiResponse->status,
                'Amount' => $amount,
            ]);
            $this->deductFromWallet($amount, request()->input("orderId"));
            if ((float) $amount !== 0) {
                $AddDmrSurcharge = new AddPayoutSurcharge();
                $AddDmrSurcharge->index(Auth::user()->id, $amount);

            }
            if ($payout) {
                Session::flash("success", "Your Request Has Been Accepted");
                return redirect('payout');
            } else {
                Session::flash("error", "Something went wrong (कुछ गलत हो गया है। कृपया बाद में दोबारा प्रयास करें)");
                return redirect('payout');
            }
        } else {
            Session::flash("error", $apiResponse->statusMessage);
            return redirect('payout');
        }

        return redirect('payout');

    }

    private function deductFromWallet($amount, $orderID){
        Wallet::insert(["user_id" => Auth::user()->id, "method" => "Payout Order", "type" => 1, "amount" => $amount, "order_id" => $orderID, "transaction_id" => $orderID, "created_at" => date("Y-m-d H:i:s"), "updated_at" => date("Y-m-d H:i:s")]);
    }

    private function makePayout(Request $request, $users,$orderId) {

         

        $paytmParams = ["subwalletGuid" => env("PAYTM_SUBWALLET_ID"), "transferMode" => $request->input("payment_type"), "orderId" => $orderId, "beneficiaryAccount" => $users[0]->account_no, "beneficiaryIFSC" => $users[0]->ifsc_code, "amount" => $request->input("amount"), "purpose" => "OTHERS", "comments" => "Payout Transfer" . $users[0]->loginId, "date" => date("Y-m-d")];

        $post_data = json_encode($paytmParams, JSON_UNESCAPED_SLASHES);

        $checksum = PaytmChecksum::generateSignature($post_data, env("PAYTM_MERCHANT_KEY"));

        $response = Http::withHeaders([
            'Content-Type' => 'application/json',
            'x-mid' => env('PAYTM_MERCHANT_ID'),
            'x-checksum' => $checksum,
        ])->post(env('TransactionURL').'disburse/order/bank', $paytmParams);

        $requestApproval = $response->json();
        return json_decode(json_encode($requestApproval));
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */

    public function store(Request $request, User $user) {
        $otp = mt_rand(1000, 99999);
        $message = urlencode("Your OTP for Dios Payout Signup is $otp, OTPs are secret.Do NOT disclose it to anyone. We never asks for OTP");

        $response = Http::get('http://dnd.saakshisoftware.com/api/mt/SendSMS?user=PRINCECOMPUTERCENTER&password=46328488&senderid=GLOBAL&channel=Trans&DCS=0&flashsms=0&number=91' . $request->input("contact") . '&text=' . $message . '&route=15');
        $curlData = $response->json();

        if ($curlData["ErrorCode"] == "000") {
            $data = $user->where(["email" => $request->input("email")])->update(["gst_number" => $request->input("gst_number"), "payout_otp" => $otp, "account_no" => $request->input("account"), "ifsc_code" => $request->input("ifsc"), "shop_name" => $request->input("shop_name"), "shop_address" => $request->input("shop_address")]);
            Wallet::insert(["user_id" => Auth::user()->id, "method" => "Payout SMS charges", "type" => 1, "amount" => 1.50, "created_at" => date("Y-m-d H:i:s"), "updated_at" => date("Y-m-d H:i:s")]);

            return view("payout.otp", [
                "id" => Auth::user()->id,
            ]);
        } else {
            Session::flash("error", $curlData["ErrorMessage"]);
            return back();
        }
    }
    
	public function resendOtp(User $user){

        $otp = mt_rand(1000, 99999);
        $user->where(["id" => Auth::user()->id])->update(["payout_otp" => $otp]);
        $user = User::find(Auth::user()->id);
        $message = urlencode("Your OTP for Dios Payout Signup is $otp, OTPs are secret.Do NOT disclose it to anyone. We never asks for OTP");
        $ch = curl_init('http://dnd.saakshisoftware.com/api/mt/SendSMS?user=PRINCECOMPUTERCENTER&password=46328488&senderid=GLOBAL&channel=Trans&DCS=0&flashsms=0&number=91' . $user->contact . '&text=' . $message . '&route=15');
        Wallet::insert(["user_id" => Auth::user()->id, "method" => "SMS charges", "type" => 1, "amount" => 1.50, "created_at" => date("Y-m-d H:i:s"), "updated_at" => date("Y-m-d H:i:s")]);

        $curlData = curl_exec($ch);

        $curlData = json_decode($curlData);
        echo "success";
    }
    
	public function resendOtpPay(User $user) {

        $otp = mt_rand(1000, 99999);
        $user->where(["id" => Auth::user()->id])->update(["payout_payment_otp" => $otp]);
        $user = User::find(Auth::user()->id);
        $message = urlencode("Your OTP for Dios Payout Payment is $otp, OTPs are secret.Do NOT disclose it to anyone. We never asks for OTP");
        $ch = curl_init('http://dnd.saakshisoftware.com/api/mt/SendSMS?user=PRINCECOMPUTERCENTER&password=46328488&senderid=GLOBAL&channel=Trans&DCS=0&flashsms=0&number=91' . $user->contact . '&text=' . $message . '&route=15');
        Wallet::insert(["user_id" => Auth::user()->id, "method" => "SMS charges For Payout", "type" => 1, "amount" => 1.50, "created_at" => date("Y-m-d H:i:s"), "updated_at" => date("Y-m-d H:i:s")]);

        $curlData = curl_exec($ch);

        $curlData = json_decode($curlData);
        echo "success";
    }

    /**
     * Display the specified resource.
     *
     * @param  \App\Payout  $payout
     * @return \Illuminate\Http\Response
     */
    public function show(Payout $payout) {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  \App\Payout  $payout
     * @return \Illuminate\Http\Response
     */
    public function edit(Payout $payout) {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\Payout  $payout
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, Payout $payout){
        //
    }
	
	private function getRandomString($length = 8) {
		$characters = '0123456789';
		$string = '';
		for ($i = 0; $i < $length; $i++) {
			$string .= $characters[mt_rand(0, strlen($characters) - 1)];
		}

		return $string;
	}

    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\Payout  $payout
     * @return \Illuminate\Http\Response
     */
    public function destroy(Payout $payout)
    {
        //
    }
	
	public function paymentOtpVerify(){
        // return request()->all();
        // time duration of 3 minutes
        $date = date("Y-m-d");
        $checkWalletData = Wallet::where([
            'user_id' => Auth()->user()->id,
            'amount' => request()->input("amount"),
            'type' => 1
        ])->whereDate("updated_at", ">=", $date)->orderBy('created_at', 'DESC')->first();
        if ($checkWalletData) {
            $diffTimeInMinutes = $checkWalletData->created_at->diffInMinutes(Carbon::now());        
            if ($diffTimeInMinutes < 3) {
                Session::flash("error", "Please be at least 3 minutes between the 1st and 2nd payouts! ( कृपया पहले और दूसरे पेआउट में कम से कम ३ मिनट का समय होना चाहिए )");
                return back();
            }
        }  

        if (request()->input("payment_type") == 'RTGS' || request()->input("payment_type") == null || request()->input("payment_type") == 'rtgs') {
            Session::flash("error", "Please select patement type with proper value!");
                return back();
        }     
        
        $amount = request()->input("amount");
		$account_no = request()->input("account_no");
		$ifsc_code = request()->input("ifsc_code");
        $user_member_type=Auth::User()->member_type;
        $paymentType = request()->input("payment_type");
        $data =  PayoutSurcharge::where(["member_type_id" => $user_member_type, "type" => $paymentType])->where("start", "<=", $amount)->where("end", ">=", $amount)->first();
		$surcharge=0;
        
        if(empty($data)){
            Session::flash("error", "You cannot payout more than Rs.100000 ( आप १००००० रूपये से ज़्यादा का पेआउट नहीं कर सकते हे )");
            return back();
        }
		
		if(!empty($data)){
			$start=$data->start;
			$end=$data->end;
			$surcharge = $data->is_flat == 0 ? (($amount) *  $data->surcharge / 100) :  $data->surcharge;
			if($amount<$start || $amount>$end){
				Session::flash("error", "Given amount is out of range.");
				return back();
			}
		}
        
		$tpin = request()->input("tpin");
		$userInfo = User::where(["id" => Auth::user()->id])->first();
		if(!empty($userInfo->tpin)){
			if($userInfo->tpin!=$tpin){
				Session::flash("error", "Tpin Invalid.you can generate forgot tpin on login form.");
				return redirect("/payout");
			}
			
		}
		else
		{
			Session::flash("error", "Tpin Invalid.you can generate forgot tpin on login form.");
			return redirect("/payout");
		}
		
		
		
		
		$today_date=date('Y-m-d');
		$users = User::with("wallet")->where(["id" => Auth::user()->id])->get();
        $debit = 0.00;$credit = 0.00;
        foreach ($users[0]->wallet as $key => $user) {
            if ($user->type == 0) {
                $credit = $credit + $user->amount;
            } else {
                $debit = $debit + $user->amount;
            }
        }

        if ($users[0]->payout_status == 0 || $users[0]->payout_status == null) {
            Session::flash("error", "You are not authorished to use this process (आप इस प्रक्रिया का उपयोग करने के लिए अधिकृत नहीं हैं)");
            return back();
        }
        $balance = $credit - $debit;
		$user = User::find(Auth::user()->id);
        $walletremaining = request()->input("walletBalance") - $amount - $surcharge;        
        $payment_type = request()->payment_type;
        if ($balance < request()->input("amount") || $walletremaining < 0) {
            Session::flash("error", "Kindly enter amount less than total balance (कुल बैलेंस से कम राशि दर्ज करें)");
            return back();
        }        
        $orderId = "ORDER_" . time();
		$users = User::with("wallet")->where(["id" => Auth::user()->id])->get();
		$debit = 0.00;
		$credit = 0.00;
		foreach ($users[0]->wallet as $key => $user) {
			if ($user->type == 0) {
				$credit = $credit + $user->amount;
			} else {
				$debit = $debit + $user->amount;
			}
		}

		if ($users[0]->payout_status == 0 || $users[0]->payout_status == null) {
			Session::flash("error", "You are not authorished to use this process (आप इस प्रक्रिया का उपयोग करने के लिए अधिकृत नहीं हैं)");
			return back();
		}
		$balance = $credit - $debit;
		$amount = request()->input("amount");
		$user = User::find(Auth::user()->id);
        $apiProPayout = Http::withToken($this->token)->withHeaders([
    					"Accept" => "application/json",
    					"Content-Type" => "application/json",
				    ])->timeout(30)->post(env('AepsUrl') . "api/auth/getPayoutUserBalance", [
    					'amount' => $amount,
    					'user_id' => $this->parentUser,
					]);
		$apiProPayout = json_decode($apiProPayout->body());

        if($apiProPayout->status == 0)
        {
            Session::flash("error", "Time out from bank, Contact Administrator");
            return redirect("/payout");
        }	
        $this->deductFromWallet($amount, $orderId);	
		//check from api pro account api
		if ($apiProPayout->status == 1) {
			$surchargeAmount = $apiProPayout->surchargeAmount;
			$totalPayoutAmount = $amount+$surchargeAmount;
			$walletremaining1 = $apiProPayout->balance-$totalPayoutAmount;
			$princeRemainingBalance = $apiProPayout->iciciBalance;
			if ($walletremaining1 < 0) {
				Session::flash("error", "Service down from bank, Contact Administrator");
				 return redirect("/payout");
			}
			if ((float) $princeRemainingBalance < (float) $amount) {
				Session::flash("error", "Service down from bank, Contact Administrator");
				return redirect("/payout");
			}
			
		}
		// end check from api pro account api
        $payoutSurcharge = PayoutSurcharge::where('member_type_id', $users[0]->member_type)->where('start', '<=', $amount)->where('end', '>=', $amount)->get();
        
        if($payoutSurcharge)
        {
            $payout = Payout::create([
                    'user_id' => Auth::user()->id,
                    'XpressID' => "",
                    'OrderId' =>  $orderId,
                    // 'TransactionRefNo' => $TransactionRefNo,
                    // 'BankRefNo' => $BankRefNo,
                    // 'rrn_no' => $payoutTransactions->rrn_number,
                    'ifsc_code' => $ifsc_code,
                    'TransactionMessage' => 'PENDING',
                    'AccountNo' => $account_no,
                    'CompanyName' => $users[0]->name,
                    'ErrorDescription' => 'PENDING',
                    'Amount' => $amount,
                ]);
            
            $payoutTransactions = Http::withToken($this->token)->withHeaders([
                        "Accept" => "application/json",
                        "Content-Type" => "application/json",])->timeout(30)->post(env('AepsUrl') . "api/auth/payout/store_payout_user", [
                        'user_id' => $this->parentUser,
                        'loginId' => Auth::user()->loginId,
                        'XpressID' => "",
                        'OrderId' =>  $orderId,
                        'AccountNo' => $account_no,
                        'CompanyName' => $users[0]->name,
                        'Amount' => $amount,
                        'bankType' => request()->input("bankType"),
                        'payment_type' => request()->input("payment_type"),
                        'ifsc_code' => $ifsc_code
                    ]);
                
            $payoutTransactions = json_decode($payoutTransactions->body());
            if ($payoutTransactions->status == 1) {
                $TransactionRefNo = $payoutTransactions->TransactionRefNo;
                $BankRefNo = $payoutTransactions->BankRefNo;
                $TransactionMessage = $payoutTransactions->TransactionMessage;
                $ErrorDescription = $payoutTransactions->ErrorDescription;
                
                $payoutUpdate = Payout::find($payout->id);
                $payoutUpdate->TransactionRefNo = $TransactionRefNo;
                $payoutUpdate->BankRefNo = $BankRefNo;
                $payoutUpdate->rrn_no = $payoutTransactions->rrn_number;
                $payoutUpdate->TransactionMessage = $TransactionMessage;
                $payoutUpdate->ErrorDescription = $ErrorDescription;
                // $payout = Payout::create([
                //     'user_id' => Auth::user()->id,
                //     'XpressID' => "",
                //     'OrderId' =>  $orderId,
                //     'TransactionRefNo' => $TransactionRefNo,
                //     'BankRefNo' => $BankRefNo,
                //     'rrn_no' => $payoutTransactions->rrn_number,
                //     'ifsc_code' => $ifsc_code,
                //     'TransactionMessage' =>  $TransactionMessage,
                //     'AccountNo' => $account_no,
                //     'CompanyName' => $users[0]->name,
                //     'ErrorDescription' => $ErrorDescription,
                //     'Amount' => $amount,
                // ]);
                
                if ((float) $amount !== 0) {
                    $AddDmrSurcharge = new AddPayoutSurcharge();
                    $AddDmrSurcharge->index(Auth::user()->id, $amount, $orderId, $paymentType);

                }
                if ($payoutUpdate->save()) {
                    Session::flash("success", "Your Request Has Been Accepted");
                    return redirect('/payout');
                } 
                else 
                {
                    Session::flash("error", "Something went wrong (कुछ गलत हो गया है। कृपया बाद में दोबारा प्रयास करें)");
                    return redirect('/payout');
                }
            }
            else
            {
                Session::flash("error", $payoutTransactions->message);
                return redirect('/payout');
            }
        }
        else
        {
            Session::flash("error", "Please enter valid amount! not more then 100000");
            return redirect('/payout');
        }
		
		
    }
	
	
	
	public function geticiciCollection(Request $request){
        
        $data1 = $request->all();
        $response = json_encode($data1);
        file_put_contents('collectionicici.txt',json_encode($data1));
        $resp = json_decode($response);
        
        if(!empty($resp->VirtualAccountNumber) && !empty($resp->BankInternalTransactionNumber)){
            $virtualAccountNumber = $resp->VirtualAccountNumber;
            $virtualData = VirtualAccountUser::where('virtual_account',$virtualAccountNumber)->first();
            
            if(!empty($virtualData)){
                $userId = $virtualData->user_id;
                $utr = $resp->UTR;
                $transId = $resp->BankInternalTransactionNumber;
                $virTransData = VirtualTransactions::where(["user_id" => $userId,"RetailerTxnId"=>$transId,"RRN"=>$utr])->first();
                if(!empty($virTransData)){
                    $requestArr = array("status"=>2,"message"=>"Duplicate UTR");
                }
                else
                {
                    $recharge = VirtualTransactions::create([
                        "user_id" => $userId,
                        "virtualAccountNumber" => $virtualAccountNumber,
                        "payer_name" => $resp->PayerName,
                        "tra_message" => $resp->SenderRemark,
                        "account_number" => $resp->PayerAccNumber,
                        "ifsc" => $resp->PayerBankIFSC,
                        "payment_mode" => $resp->Mode,
                        "RRN" => $utr,
                        "amount" => $resp->Amount,
                        "txnDate" => $resp->PayerPaymentDate,
                        "RetailerTxnId" => $transId,
                        "created_at" => date("Y-m-d H:i:s"),
                        "updated_at" => date("Y-m-d H:i:s"),
                    ]);
                    if ($recharge) {
                        Wallet::insert(["user_id" => $userId, "method" => "Virtual Account Transaction", "type" => 0, "amount" => $resp->Amount, "created_at" => date("Y-m-d H:i:s"), "updated_at" => date("Y-m-d H:i:s")]);
                        $requestArr = array("status"=>1,"message"=>"Request submited successfully");
                        // now add virtual account to diosm.in
                        $user = User::where(["id" => $userId])->first();  
                        $payoutTransactions = Http::withToken($this->token)->withHeaders([
                            "Accept" => "application/json",
                            "Content-Type" => "application/json",])->timeout(30)->post(env('AepsUrl') . "api/auth/payout/store_virtual_amount", [
                            'user_id' => $this->parentUser,
                            'loginId' => $user->loginId,
                            "virtualAccountNumber" => $virtualAccountNumber,
                            "payer_name" => $resp->PayerName,
                            "tra_message" => $resp->SenderRemark,
                            "account_number" => $resp->PayerAccNumber,
                            "ifsc" => $resp->PayerBankIFSC,
                            "payment_mode" => $resp->Mode,
                            "RRN" => $utr,
                            "amount" => $resp->Amount,
                            "txnDate" => $resp->PayerPaymentDate,
                            "RetailerTxnId" => $transId,
                        ]);
                        // end 
                        
                        
                        
                        
                        
                        
                    }
                }
            }
            else
            {
                $requestArr = array("status"=>1,"message"=>"Request submited successfully");
            }
            
        }
        else
        {
            $requestArr = array("status"=>1,"message"=>"Request submited successfully");
        }
        $signatureEncoded = json_encode($requestArr);
        echo $signatureEncoded;exit;    
        
        
        
        /*$resp = json_decode($response);
        $data = base64_decode($resp->encryptedData);
        $randomNumber = time().$this->getRandomString(6);
        $iv = substr($data,0,16);

        $sessionKey = $this->DecryptData($resp->encryptedKey);
        if(16 !== strlen($sessionKey)){
            $sessionKey = hash('MD5', $sessionKey, true);
        }
            $data = @mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $sessionKey, $data, MCRYPT_MODE_CBC, $iv);
            $padding = ord($data[strlen($data) - 1]);
            $response = substr($data, 0, -$padding); 
            $response = substr($response, 16);
            
            $finalDecryptResponse = json_decode($response,true);
            echo '<pre>';
            print_r($finalDecryptResponse);
            
            //$jsonResponseicici = json_encode($response);
            // Now make encrypted request
            $requestArr = array("Response"=>"Success","Code"=>"11");
            //$requestArr = $finalDecryptResponse;
            $requestEncoded = json_encode($requestArr);
            //echo $dataEncoded = base64_encode($requestEncoded);echo "<br>";
            //$iv_size = @mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
            //$iv = @mcrypt_create_iv($iv_size, MCRYPT_RAND);echo "<br>";
            //$iv_size = @mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
            //$iv = @mcrypt_create_iv($iv_size, MCRYPT_RAND);
            //$iv = str_repeat("\0", 16);
            //$iv = "00001111222233334444";
            //$padding = 16 - (strlen($requestEncoded) % 16);
            //$requestEncoded .= str_repeat(chr($padding), $padding);
            $zeroPack = pack('i*', 0);
            $iv = str_repeat($zeroPack, 4);
            @mcrypt_create_iv(@mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC), MCRYPT_RAND);
            $ciphertext = @mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $randomNumber, $this->pkcs5_pad($requestEncoded, mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC)), MCRYPT_MODE_CBC,$iv);
            $ciphertext = base64_encode($iv.$ciphertext);
            $encryptedData = base64_encode($ciphertext);
            
            
            
            
            
            $encryptedKey = $this->EncryptData($randomNumber);
            
            $requestArr123 = array("requestId"=>$randomNumber,"service"=>"E-Collection","encryptedKey"=>$encryptedKey,"oaepHashingAlgorithm"=>"NONE", "iv"=>$iv, "encryptedData"=>$encryptedData,"clientInfo"=>"", "optionalParam"=>"");
            echo $signatureEncoded = json_encode($requestArr123);
            */
            //$requestArr = array("Response"=>"Success","Code"=>"11");
            //$requestArr = $finalDecryptResponse;
            //$signatureEncoded = json_encode($requestArr);
            
            
            /*$headers = [
                'Content-Type: application/json',
                
            ];
        
        $ch = curl_init('https://apigwuat.icicibank.com:8443/api/v2/Profunds/Ecollection');
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch, CURLOPT_ENCODING, "");
        curl_setopt($ch, CURLOPT_PORT, "8443");
        
        
        curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $signatureEncoded);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $result = curl_exec($ch);
        if(curl_exec($ch) === false)
        {
            echo 'Curl error: ' . curl_error($ch);
        }*/
        //echo $signatureEncoded;exit;
        
    }
    
    public function pkcs5_pad ($text, $blocksize)
    {
        $pad = $blocksize - (strlen($text) % $blocksize);
        return $text . str_repeat(chr($pad), $pad);
    }
    
    public function EncryptData($sessionKey){
        //$fp=fopen("testpub.pem","r");
        $fp=fopen("icicipub.pem","r");
        $publicKey=fread($fp,8192);
        fclose($fp);
        
        $result23 = openssl_public_encrypt($sessionKey, $encrypted, $publicKey,OPENSSL_PKCS1_PADDING);
        return base64_encode($encrypted);

    }
    
    public function EncryptData1($sessionKey){
        //$fp=fopen("testpub.pem","r");
        $fp=fopen("testpub.pem","r");
        $publicKey=fread($fp,8192);
        fclose($fp);
        
        $result23 = openssl_public_encrypt($sessionKey, $encrypted, $publicKey,OPENSSL_PKCS1_PADDING);
        return base64_encode($encrypted);

    }

    private function DecryptData($source){
        $fp=fopen("liveprivatekey.pem","r");
        $priv_key=fread($fp,8192);
        fclose($fp);
        $res = openssl_get_privatekey($priv_key, "");
        openssl_private_decrypt(base64_decode($source), $newsource, $res);  // newsource is output after decryption
        return $newsource;
    } 

    public function payoutExport()
    {
        $orderId = request()->input('OrderId');   
        $errorDescription = request()->input('ErrorDescription');       
        $fromDate = request()->input('from_date'); 
        $toDate = request()->input('to_date');  

        $payout = Payout::with("user")->where("user_id", "=", Auth::user()->id)->newQuery();
        if ($orderId && $orderId != '') {            
            $payout->where("OrderId", 'LIKE', "%$orderId%");
        }
        if ($errorDescription && $errorDescription != '') {            
            $payout->where("ErrorDescription", 'LIKE', "%$errorDescription%");
        }
        if ($fromDate && $fromDate != '') {           
            $from_date = Carbon::parse($fromDate)->format("Y-m-d H:i:s");
            $payout->where("updated_at", '>=', "$from_date");
        }
        if ($toDate && $toDate != '') {            
            $to_date = Carbon::parse($toDate)->format("Y-m-d 23:59:59");
            $payout->where("updated_at", '<=', "$to_date");
        }     
        if(!$orderId && (!$errorDescription) && (!$fromDate) && (! $toDate)){
            $date = date("Y-m-d");
            $payout->whereDate("updated_at", "<=", $date);
        }
        $payouts = $payout->get();

        $datatbl = '';
        $datatbl .= '<table collspacing="2" collpadding="5" style="border:2px;text-align:center;" border="1" width="100%">';
        $datatbl .= '<tr>  
            <th style="text-align:center;">Id</th>
            <th style="text-align:center;">User Id</th>
            <th style="text-align:center;">MemberId</th>            
            <th style="text-align:center;">OrderId</th> 
            <th style="text-align:center;">AccountNo</th> 
            <th style="text-align:center;">IFSC Code</th>           
            <th style="text-align:center;">RRN Number</th>
            <th style="text-align:center;">CompanyName</th>
            <th style="text-align:center;">Amount</th>   
            <th style="text-align:center;">Status</th>     
            <th style="text-align:center;">TransactionMessage</th>       
            <th style="text-align:center;">Transaction Date Time</th>               
            </tr>';        
        // return $getFackData;
        //var_dump($getRegisterByData);
        foreach ($payouts as $key => $value) {    
        $datatbl .=         
            '<tr>
                <td style="text-align:center;">'.$value->id.'</td>
                <td style="text-align:center;">'.$value->user_id.'</td>
                <td style="text-align:center;">'.$value->user->loginId.'</td>
                <td style="text-align:center;">'.$value->OrderId.'</td>  
                <td style="text-align:center;">'.$value->AccountNo.'</td>               
                <td style="text-align:center;">'.$value->ifsc_code.'</td> 
                <td style="text-align:center;">'.$value->rrn_no.'</td>  
                <td style="text-align:center;">'.$value->CompanyName.'</td>
                <td style="text-align:center;">'.$value->amount.'</td>  
                <td style="text-align:center;">'.$value->ErrorDescription.'</td>   
                <td style="text-align:center;">'.$value->TransactionMessage.'</td>             
                <td style="text-align:center;">'.$value->created_at->format("d, M Y, H:i:s").'</td>
            </tr>';
        } 
        $datatbl .= '</table>';    
            header("Content-Type: application/force-download");     
            header("Content-disposition: attachment; filename=PayoutExportData.xls");
            header("Pragma: ");  
            header("Cache-Control: ");
            echo $datatbl;
            die;
    }
 
    public function getPayoutStatus(){
        //return $this->token;
        $validator = \Validator::make(request()->all(), [
                'OrderId' => 'required'
            ]); 
        if ($validator->fails()) {
            $responseArr['error'] = '301';
            $responseArr['message'] = $validator->errors()->first();
            return response()->json($responseArr);
        }
        
        $OrderId = request()->input("OrderId");
        
        $payoutDetail = Payout::where('OrderId',$OrderId )->first();
        
        //return  env('AepsUrl') . "api/cib/payoutStatus";
        if(isset($payoutDetail) && !empty($payoutDetail)){
            
            $user_id = $payoutDetail['user_id'];
            $amount = $payoutDetail['Amount'];
            $users = User::where(["id" => $user_id])->get('member_type');
        
            if(isset($payoutDetail['TransactionMessage']) && $payoutDetail['TransactionMessage'] == 'PENDING'){
                Payout::where(["OrderId" => $OrderId,"TransactionMessage" => "PENDING"])->update(["TransactionMessage" => "CHECKING"]);
                $apiProPayout = Http::withToken($this->token)->withHeaders([
                    "Accept" => "application/json",
                    "Content-Type" => "application/json",
                ])->timeout(30)->post(env('AepsUrl') . "api/cib/payoutStatus", [
                    'OrderId' => $OrderId,
                ]); 
                $res = $apiProPayout->body();
                $resArr = (isset($res) && !empty($res)) ? json_decode($res,true) : '';
                if(isset($resArr['id']) && !empty($resArr['id'])){
                    if(isset($resArr['TransactionMessage']) && $resArr['TransactionMessage']=="SUCCESS"){
                        $data = [
                                    "TransactionMessage" => $resArr['TransactionMessage'],
                                    "ErrorDescription" => $resArr['TransactionMessage'],
                                    "BankRefNo" => $resArr['BankRefNo'],
                                    "rrn_no" => $resArr['rrn_number'],
                                    "XpressID" => $resArr['XpressID'],
                                ];
                        Payout::where(["OrderId" => $OrderId,"TransactionMessage" => "CHECKING"])->update($data);
                        if ((float) $amount !== 0) {
                            $AddDmrSurcharge = new AddPayoutSurcharge();
                            //$AddDmrSurcharge->index($user_id, $amount, $OrderId, "IMPS");

                        }
                    }
                    else if(isset($resArr['TransactionMessage']) && $resArr['TransactionMessage']=="FAILURE"){
                        
                        Payout::where(["OrderId" => $OrderId,"TransactionMessage" => "CHECKING"])->update(["TransactionMessage" => "FAILURE","ErrorDescription" => "FAILURE"]);
                        
                        Wallet::insert(["user_id" => $user_id, "method" => "Payout Refund", "type" => 0, "amount" => $amount, "order_id" => $OrderId, "transaction_id" => $OrderId, "created_at" => date("Y-m-d H:i:s"), "updated_at" => date("Y-m-d H:i:s")]);
                    }
                    else {
                        Payout::where(["OrderId" => $OrderId,"TransactionMessage" => "CHECKING"])->update(["TransactionMessage" => "PENDING"]);
                    }
                    $responseArr['res_code'] = '200';
                    $responseArr['message'] = $resArr['TransactionMessage'];
                    $responseArr['data'] = $resArr;
                    return response()->json($responseArr);                  
                } else {
                    $responseArr['res_code'] = '301';
                    $responseArr['message'] = "Order Not Found!";
                    return response()->json($responseArr);
                }
            } else {    
                $responseArr['res_code'] = '200';
                $responseArr['message'] = $payoutDetail['TransactionMessage'];
                return response()->json($responseArr);
                
            }
            return $payoutDetail;
        } else {    
            $responseArr['res_code'] = '301';
            $responseArr['message'] = "Order Id Not Found!";
            $responseArr['token'] = $this->token;;
            return response()->json($responseArr);
        }
        
        
        
    }
} 
