<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Session;

class BKashPaymentController extends Controller
{
    private $baseUrl;

    public function __construct()
    {
        // Sandbox নাকি Live URL সেট করা
        if (config('bkash.sandbox')) {
            $this->baseUrl = 'https://tokenized.sandbox.bka.sh/v1.2.0-beta/tokenized/checkout';
        } else {
            $this->baseUrl = 'https://tokenized.pay.bka.sh/v1.2.0-beta/tokenized/checkout';
        }
    }

    /**
     * বিকাশের টোকেন জেনারেট করা
     */
    private function getToken()
    {
        Session::forget('bkash_token');

        $response = Http::withHeaders([
            'username' => config('bkash.username'),
            'password' => config('bkash.password'),
            'content-type' => 'application/json'
        ])->post($this->baseUrl . '/token/grant', [
            'app_key'    => config('bkash.app_key'),
            'app_secret' => config('bkash.app_secret')
        ]);

        $result = $response->json();

        if (isset($result['id_token'])) {
            Session::put('bkash_token', $result['id_token']);
            return $result['id_token'];
        }

        return null;
    }

    /**
     * ১. পেমেন্ট তৈরি করা (Create Payment)
     */
    public function createPayment(Request $request)
    {
        $token = $this->getToken();

        if (!$token) {
            return redirect()->back()->with('error', 'বিকাশ টোকেন জেনারেট করতে ব্যর্থ হয়েছে!');
        }

        $amount = 90; // NID কপির জন্য ৯০ টাকা (বা আপনার প্রয়োজন অনুযায়ী $request->amount)
        $invoiceNumber = 'INV-' . strtoupper(uniqid());

        $body = [
            'mode'                  => '0011',
            'payerReference'        => auth()->user()->phone ?? '01700000000',
            'callbackURL'           => config('bkash.callback_url'),
            'amount'                => (string)$amount,
            'currency'              => 'BDT',
            'intent'                => 'sale',
            'merchantInvoiceNumber' => $invoiceNumber
        ];

        $response = Http::withHeaders([
            'Authorization' => $token,
            'X-APP-Key'     => config('bkash.app_key'),
            'content-type'  => 'application/json'
        ])->post($this->baseUrl . '/create', $body);

        $result = $response->json();

        dd($result);

        if (isset($result['statusCode']) && $result['statusCode'] == '0000') {
            // পেমেন্ট আইডি সেশনে সেভ করে রাখা
            Session::put('paymentID', $result['paymentID']);
            
            // বিকাশের অফিসিয়াল পেমেন্ট পেজে রিডাইরেক্ট করা
            return redirect()->away($result['bkashURL']);
        }

        return redirect()->back()->with('error', $result['statusMessage'] ?? 'পেমেন্ট প্রসেস শুরু করা যায়নি!');
    }

    /**
     * ২. বিকাশ কলব্যাক হ্যান্ডেল করা (Execute Payment)
     */
    public function callback(Request $request)
    {
        $status = $request->get('status');
        $paymentID = $request->get('paymentID');

        // ইউজার পেমেন্ট ক্যানসেল করলে
        if ($status === 'cancel') {
            return redirect()->route('home')->with('error', 'আপনি বিকাশ পেমেন্ট বাতিল করেছেন!');
        }

        // পেমেন্ট ফেইল করলে
        if ($status === 'failure') {
            return redirect()->route('home')->with('error', 'পেমেন্ট ব্যর্থ হয়েছে! অনুগ্রহ করে আবার চেষ্টা করুন।');
        }

        // পেমেন্ট সফল হলে Execute API কল করা
        if ($status === 'success') {
            $token = Session::get('bkash_token');

            $response = Http::withHeaders([
                'Authorization' => $token,
                'X-APP-Key'     => config('bkash.app_key'),
                'content-type'  => 'application/json'
            ])->post($this->baseUrl . '/execute', [
                'paymentID' => $paymentID
            ]);

            $result = $response->json();

            if (isset($result['statusCode']) && $result['statusCode'] == '0000') {
                
                $trxID = $result['trxID'];
                $amount = $result['amount'];

                // ৩. ডাটাবেজে পেমেন্টের তথ্য এবং রিচার্জ সেভ করা
                DB::transaction(function () use ($trxID, $amount) {
                    
                    // Recharges টেবিলে সেভ
                    DB::table('recharges')->insert([
                        'user_id'        => auth()->id(),
                        'payment_method' => 'bkash_merchant',
                        'amount'         => $amount,
                        'sender_number'  => auth()->user()->phone ?? 'N/A',
                        'transaction_id' => $trxID,
                        'status'         => 'approved',
                        'created_at'     => now(),
                        'updated_at'     => now(),
                    ]);

                    // ইউজারের একাউন্টে ব্যালেন্স যোগ (যদি প্রয়োজন হয়)
                    DB::table('users')
                        ->where('id', auth()->id())
                        ->increment('balance', $amount);
                });

                return redirect()->route('home')->with('success', 'পেমেন্ট সফল হয়েছে! TrxID: ' . $trxID);
            }

            return redirect()->route('home')->with('error', $result['statusMessage'] ?? 'পেমেন্ট কনফার্ম করা যায়নি!');
        }

        return redirect()->route('home')->with('error', 'অজানা কোনো সমস্যা হয়েছে!');
    }
}