<?php

namespace App\Http\Controllers;

use App\Http\Requests\ProfileUpdateRequest;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Redirect;
use Illuminate\View\View;

use Illuminate\Support\Facades\Log;

use  App\Http\Controllers\Api\CwoController;
use App\Models\CarWashOwner;
use App\Models\CwoSubscription;
use App\Models\Subscription;
use App\Models\Country;
use App\Models\CurrencyMaster;
use App\Models\PreBookingType;
use App\Models\CwoPreBookingType;
use Illuminate\Support\Facades\Http;

use Illuminate\Contracts\Auth\Authenticatable;
use App\Http\Requests\Auth\LoginRequest;
use App\Providers\RouteServiceProvider;
use DB;
use Session;

class FastPayControl extends Controller
{


    public function payment(Request $request)
    {
        $dataBag['country'] = Country::select('name', 'phonecode')->orderBy('name', 'asc')->get();
        $dataBag['currency'] = CurrencyMaster::orderByRaw('IF(id = 95, 0,1)')->orderBy('id', 'asc')->get();
        $dataBag['prebooking_types'] = PreBookingType::where('is_active', 1)->orderBy('id', 'asc')->get();
        return view('fastpay.cworegister', $dataBag);
        // return view('fastpay.payment');
    }

    public function fastPay(Request $request)
    {

        $request->session()->put('payment_process', true);

        if($request->get('renew_page') == 1){
            $request->session()->put('renew_page', true);
        }

        if($request->get('register_page') == 1){
            $request->session()->put('register_page', true);
        }

        $cwo_id=$request->get('cwo_id');
        $cwo_subscription_id=$request->get('cwo_subscription_id');
        $transaction_id=$request->get('transaction_id');

        $email=$request->get('email');
        $password=$request->get('password');

        Session::put('login_email', $email);
        Session::put('login_password', $password);


        $sub= CwoSubscription::where('cwo_id', $cwo_id)
        ->where('transaction_id', $transaction_id)->first();

        $subscription= Subscription::where('id', $sub->subscription_detail_id)->first();


        $amount =$sub->amount;

        // Log IPN data
        // Log::info('fastPay(): ', $request->all());
        // return view('fastpay.payment');

        // $url="http://autoclickpartnersapp.com/payment";
        // $url="http://localhost/autoclick/public/payment";
        $url=env('PAYMENTBASEURL') . 'payment';


        $passphrase = env("PASSPHRASE");
        $data = array(
            // Merchant details
           'merchant_id' =>env('MERCHANDID'),
           'merchant_key' =>env('MERCHANDKEY'),
           'return_url' => $url.'/return?payment=1&cwo_id='. encodeC($cwo_id).'&cwo_subscription_id='.encodeC($cwo_subscription_id).'&transaction_id='.encodeC($transaction_id),
           'cancel_url' => $url.'/cancel?payment=0&cwo_id='. encodeC($cwo_id).'&cwo_subscription_id='.encodeC($cwo_subscription_id).'&transaction_id='.encodeC($transaction_id),
           'notify_url' => $url.'/notify',

            'm_payment_id' => $transaction_id,
            'amount' => number_format(sprintf('%.2f', $amount), 2, '.', ''),
            'item_name' => $subscription->subscription_title
        );

        $signature = $this->generateSignature($data, $passphrase);
        $data['signature'] = $signature;

        //dd($data);

        // If in testing mode make use of either sandbox.payfast.co.za or www.payfast.co.za
        // $testingMode = true;
        $testingMode = false;
        $pfHost = $testingMode ? 'sandbox.payfast.co.za' : 'www.payfast.co.za';

        $htmlForm='<div class="loader"></div>';
        $htmlForm .= '<form action="https://'.$pfHost.'/eng/process" method="post" id="testForm">';
        foreach($data as $name=> $value) {
            $htmlForm .= '<input name="'.$name.'" type="hidden" value=\''.$value.'\' />';
        }
        $htmlForm .= '<input type="submit" value="Pay Now" style="display:none;"/></form>';


        $htmlForm .= "<style>body{
                                    background: rgba(0, 0, 0, 0.8);
                            } .loader {
                            border: 16px solid #f3f3f3;
                            border-radius: 50%;
                            border-top: 16px solid #3498db;
                            width: 120px;
                            height: 120px;
                            -webkit-animation: spin 2s linear infinite; /* Safari */
                            animation: spin 2s linear infinite;
                            position: fixed;
                                top: 45%;
                                left: 45%;
                            }

                            /* Safari */
                            @-webkit-keyframes spin {
                            0% { -webkit-transform: rotate(0deg); }
                            100% { -webkit-transform: rotate(360deg); }
                            }

                            @keyframes spin {
                            0% { transform: rotate(0deg); }
                            100% { transform: rotate(360deg); }
                            }
                            </style>";



        $htmlForm .= "<script type=\"text/javascript\">
            var e = document.getElementById('testForm'); e.submit();
            </script>";
        echo $htmlForm;
    }




    public function subscriptionBillingFastPay(Request $request)
    {
        dd($request->all());
        $request->session()->put('renew_subscription_page', true);

        if($request->get('renew_page') == 1){
            $request->session()->put('renew_page', true);
        }

        if($request->get('register_page') == 1){
            $request->session()->put('register_page', true);
        }
        if($request->get('renew_subscription_page') == 1){
            $request->session()->put('renew_subscription_page', true);
        }

        $cwo_id=$request->get('cwo_id');
        $cwo_subscription_id=$request->get('cwo_subscription_id');
        $transaction_id=$request->get('transaction_id');

        $email=$request->get('email');
        $password=$request->get('password');

        Session::put('login_email', $email);
        Session::put('login_password', $password);


        $sub= CwoSubscription::where('cwo_id', $cwo_id)
        ->where('transaction_id', $transaction_id)->first();

        $subscription= Subscription::where('id', $sub->subscription_detail_id)->first();


        $amount =$sub->amount;
        $whatsapp_amount =$sub->whatsapp_amount;
        $total_amount =$sub->amount+$whatsapp_amount;

        // Log IPN data
        // Log::info('fastPay(): ', $request->all());
        // return view('fastpay.payment');

        // $url="http://autoclickpartnersapp.com/payment";
        // $url="http://localhost/autoclick/public/payment";
        $url=env('PAYMENTBASEURL') . 'payment';


        $passphrase = env("PASSPHRASE");
        $data = array(
            // Merchant details
           'merchant_id' =>env('MERCHANDID'),
           'merchant_key' =>env('MERCHANDKEY'),
           'return_url' => $url.'/return?payment=1&cwo_id='. encodeC($cwo_id).'&cwo_subscription_id='.encodeC($cwo_subscription_id).'&transaction_id='.encodeC($transaction_id),
           'cancel_url' => $url.'/cancel?payment=0&cwo_id='. encodeC($cwo_id).'&cwo_subscription_id='.encodeC($cwo_subscription_id).'&transaction_id='.encodeC($transaction_id),
           'notify_url' => $url.'/notify',

            'm_payment_id' => $transaction_id,
            'amount' => number_format(sprintf('%.2f', $total_amount), 2, '.', ''),
            'item_name' => $subscription->subscription_title
        );

        $signature = $this->generateSignature($data, $passphrase);
        $data['signature'] = $signature;

        //dd($data);

        // If in testing mode make use of either sandbox.payfast.co.za or www.payfast.co.za
         $testingMode = true;
       // $testingMode = false;
        $pfHost = $testingMode ? 'sandbox.payfast.co.za' : 'www.payfast.co.za';

        $htmlForm='<div class="loader"></div>';
        $htmlForm .= '<form action="https://'.$pfHost.'/eng/process" method="post" id="testForm">';
        foreach($data as $name=> $value) {
            $htmlForm .= '<input name="'.$name.'" type="hidden" value=\''.$value.'\' />';
        }
        $htmlForm .= '<input type="submit" value="Pay Now" style="display:none;"/></form>';


        $htmlForm .= "<style>body{
                                    background: rgba(0, 0, 0, 0.8);
                            } .loader {
                            border: 16px solid #f3f3f3;
                            border-radius: 50%;
                            border-top: 16px solid #3498db;
                            width: 120px;
                            height: 120px;
                            -webkit-animation: spin 2s linear infinite; /* Safari */
                            animation: spin 2s linear infinite;
                            position: fixed;
                                top: 45%;
                                left: 45%;
                            }

                            /* Safari */
                            @-webkit-keyframes spin {
                            0% { -webkit-transform: rotate(0deg); }
                            100% { -webkit-transform: rotate(360deg); }
                            }

                            @keyframes spin {
                            0% { transform: rotate(0deg); }
                            100% { transform: rotate(360deg); }
                            }
                            </style>";



        $htmlForm .= "<script type=\"text/javascript\">
            var e = document.getElementById('testForm'); e.submit();
            </script>";
        echo $htmlForm;
    }


    public function generateSignature($data, $passPhrase = null)
    {
        // Create parameter string
        $pfOutput = '';
        foreach($data as $key => $val) {
            if($val !== '') {
                $pfOutput .= $key .'='. urlencode(trim($val)) .'&';
            }
        }
        // Remove last ampersand
        $getString = substr($pfOutput, 0, -1);
        if($passPhrase !== null) {
            $getString .= '&passphrase='. urlencode(trim($passPhrase));
        }
        return md5($getString);
    }


    public function return(Request $request)
    {
        // Log IPN data
        // Log::info('return(): ', $request->all());
       
        if($request->session()->has('renew_page')){
            // echo "renew success";exit;
            $paymentStatus=$request->get('payment');
            $cwo_id=decodeC($request->get('cwo_id'));
            $cwo_subscription_id=decodeC($request->get('cwo_subscription_id'));
            $updatedcwoid=$cwo_subscription_id;
            $transaction_id=decodeC($request->get('transaction_id'));
            CwoSubscription::where(['cwo_id'=> $cwo_id,'transaction_id'=>$transaction_id])
            ->update(["status"=>1]);
            $getCwoSubs = CwoSubscription::where('id', $cwo_subscription_id)->select('start_date', 'end_date')->orderBy('id', 'desc')->take(1)->get();
            // print_r ($getCwoSubs->toArray());exit;
            // CarWashOwner::where(["id"=>$cwo_id])->update(["is_paid"=>1,'end_date'=>$getCwoSubs[0]['end_date'],'cwo_subscription_id'=>$cwo_subscription_id]);
            // echo $cwo_id;exit;
            // echo $getCwoSubs[0]['end_date'];exit;
            $cwoDetails = CarWashOwner::findOrFail($cwo_id);
            // print_r($cwoDetails->toArray());exit;
            $cwoDetails->update([
                'cwo_subscription_id'=> $cwo_subscription_id,
                // 'start_date'=> date('Y-m-d'),
                'start_date'=> $getCwoSubs[0]['start_date'],
                'end_date'=> $getCwoSubs[0]['end_date'],
                'is_paid'=> 1,
                'free_trial'=> 0
                ]);

            $request->session()->forget('payment_process');
            $request->session()->forget('renew_page');

            return view('fastpay.return', ['data'=>$request->all()]);

        } if($request->session()->has('payment_process')) {
            $paymentStatus=$request->get('payment');
            $cwo_id=decodeC($request->get('cwo_id'));
            $cwo_subscription_id=decodeC($request->get('cwo_subscription_id'));
            $transaction_id=decodeC($request->get('transaction_id'));

            CarWashOwner::where(["id"=>$cwo_id])->update(["is_paid"=>1]);

            CwoSubscription::where(['cwo_id'=> $cwo_id,'transaction_id'=>$transaction_id])
            ->update(["status"=>1]);

            $request->session()->forget('payment_process');

            // Auth::loginUsingId($cwo_id, true);

            $user_id = $cwo_id;
            $login_email = Session::get('login_email');
            $login_password = Session::get('login_password');
            $post = array('password' => $login_password, 'email' => $login_email);
            // Auth::loginUsingId($user_id);
            Auth::attempt($post,true);
            // return redirect()->route('owner.dashboard');

            return view('fastpay.return', ['data'=>$request->all()]);
            // return redirect()->route('login');
            // if (Auth::attempt(['email' => 'tamashree.dey123@gmail.com', 'password' => '123456'])) {
                // return view('fastpay.return', ['data'=>$request->all()]);
                // return redirect()->route('login');
                // $request->authenticate();
                // $request->session()->regenerate();
                // return redirect()->route('owner.dashboard');
            // }

        } 
        if($request->session()->has('renew_subscription_page')) {
            
            $paymentStatus=$request->get('payment');
            $cwo_id=decodeC($request->get('cwo_id'));
            $cwo_subscription_id=decodeC($request->get('cwo_subscription_id'));
            $transaction_id=decodeC($request->get('transaction_id'));

            CarWashOwner::where(["id"=>$cwo_id])->update(["is_paid"=>1]);

            CwoSubscription::where(['cwo_id'=> $cwo_id,'transaction_id'=>$transaction_id])
            ->update(["status"=>1]);

           

            // Auth::loginUsingId($cwo_id, true);

            $user_id = $cwo_id;
            $login_email = Session::get('login_email');
            $login_password = Session::get('login_password');
            $post = array('password' => $login_password, 'email' => $login_email);
            // Auth::loginUsingId($user_id);
            Auth::attempt($post,true);
            // return redirect()->route('owner.dashboard');
            $cwoDetails = CarWashOwner::findOrFail($cwo_id);
            // print_r($cwoDetails->toArray());exit;
            $getCwoSubs = CwoSubscription::where('id', $cwo_subscription_id)->select('start_date', 'end_date')->orderBy('id', 'desc')->take(1)->get();
            
            $cwoDetails->update([
                'cwo_subscription_id'=> $cwo_subscription_id,
                // 'start_date'=> date('Y-m-d'),
                'start_date'=> $getCwoSubs[0]['start_date'],
                'end_date'=> $getCwoSubs[0]['end_date'],
                'is_paid'=> 1,
                'free_trial'=> 0
                ]);
                
            $updatecwosubid=DB::table('cwo_master')->where('id',$cwo_id)->update(['cwo_subscription_id'=>$cwo_subscription_id,'is_bill_generated'=>0]);
            $updateinvoice=DB::table('invoice')->where('id',$cwo_id)->update(['is_paid'=>1,'paid_date'=>date('d-m-Y')]);
                $request->session()->forget('renew_subscription_page');
            return view('fastpay.return', ['data'=>$request->all()]);
            // return redirect()->route('login');
            // if (Auth::attempt(['email' => 'tamashree.dey123@gmail.com', 'password' => '123456'])) {
                // return view('fastpay.return', ['data'=>$request->all()]);
                // return redirect()->route('login');
                // $request->authenticate();
                // $request->session()->regenerate();
                // return redirect()->route('owner.dashboard');
            // }

        }
        else {
            return redirect()->route('payment.payment');

        }

    }

    /*public function cancel(Request $request)
    {
        // Log IPN data
        Log::info('cancel(): ', $request->all());

        return view('fastpay.cancel', $request->all());

    }*/

    public function cancel(Request $request)
    {
        // Log IPN data
        // Log::info('cancel(): ', $request->all());
        // echo "<pre>";print_r($request->all());exit;
        $payment=$request->get('payment');
        $cwo_id=decodeC($request->get('cwo_id'));
        $cwo_subscription_id=decodeC($request->get('cwo_subscription_id'));
        $transaction_id=decodeC($request->get('transaction_id'));

        // echo $request->session()->get('renew_page');exit;
        // if($request->session()->has('renew_page')){
        //     echo "renew";exit;
        // } else {
        //     echo "register";exit;
        // }

        // if($request->session()->get('renew_page') == 1){
        //     return view('fastpay.cancel', $request->all());
        //     $request->session()->forget('payment_process');
        //     $request->session()->forget('renew_page');
        // }
        if($request->session()->has('register_page')){
            $cwoDetails = CarWashOwner::findOrFail($cwo_id);
            $time = strtotime(date("Y-m-d"));
            $trial_expiry_date = date("Y-m-d", strtotime("+7 day", $time));
            $cwoDetails->update([
                    'cwo_subscription_id'=> 0,
                    'start_date'=> date('Y-m-d'),
                    'end_date'=> $trial_expiry_date,
                    'trial_expiry_date'=> $trial_expiry_date,
                    'is_paid'=> 1,
                    'free_trial'=> 1,
                    // 'updated_at'=>$dt->toDayDateTimeString()
                    ]);

            $request->session()->forget('register_page');
        }
        return view('fastpay.cancel', $request->all());
        

        // return view('fastpay.cancel', $request->all());

    }

    public function notify(Request $request)
    {
        $data = $request->all();
        // Log::info('PayFast IPN data received: ', $data);
        // Tell Payfast that this page is reachable by triggering a header 200
        header('HTTP/1.0 200 OK');
        flush();

        // Step 1: Verify that the request comes from PayFast
        /*  if (!$this->validateIP($request->ip())) {
              Log::error('Invalid IP address');
              return response('Invalid IP address', 400);
          }

          // Step 2: Verify the signature
          if (!$this->verifySignature($data)) {
              Log::error('Invalid signature');
              return response('Invalid signature', 400);
          }

          // Step 3: Verify payment data with PayFast
          if (!$this->validateDataWithPayFast($data)) {
              Log::error('Data validation with PayFast failed');
              return response('Data validation failed', 400);
          }

          // Step 4: Check payment status and update the order
          if ($data['payment_status'] === 'COMPLETE') {
              // Payment is successful, update your order status in the database
              Log::info('Payment successful: ' . $data['m_payment_id']);
              // Example: Order::where('id', $data['m_payment_id'])->update(['status' => 'complete']);
          }

          return response('OK', 200);*/
    }

    private function validateIP($ip)
    {
        $validIps = ['www.payfast.co.za', 'sandbox.payfast.co.za', 'w1w.payfast.co.za', 'w2w.payfast.co.za'];
        foreach ($validIps as $validIp) {
            if ($ip === gethostbyname($validIp)) {
                return true;
            }
        }
        return false;
    }

    private function verifySignature($data)
    {
        $pfParamString = '';
        foreach ($data as $key => $val) {
            if ($key !== 'signature') {
                $pfParamString .= $key . '=' . urlencode($val) . '&';
            }
        }
        $pfParamString = substr($pfParamString, 0, -1);
        $signature = md5($pfParamString);
        return $signature === $data['signature'];
    }

    private function validateDataWithPayFast($data)
    {
        $url = 'https://sandbox.payfast.co.za/eng/query/validate';
        $response = Http::asForm()->post($url, $data);
        return $response->body() === 'VALID';
    }

    public function renew(Request $request)
    {
        $account_no = $request->input('account_no');
        // echo $account_no;exit;
        $dataBag['cwo'] = CarWashOwner::where('account_no', $account_no)->first();
        return view('fastpay.cworenew', $dataBag);
    }
    



}
