<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Str;
use App\Models\Deposit;
use App\Models\DepositCoin;

class PaystackController extends Controller
{
    // Initialize a Paystack transaction
    public function initialize(Request $request)
    {
        $request->validate([
            'amount' => 'required|numeric|min:1',
        ]);

        $user = Auth::user();
        $amount = $request->amount * 100; // convert to kobo
        $reference = 'PSK_' . strtoupper(Str::random(10));

        $response = Http::withToken(env('PAYSTACK_SECRET_KEY'))->post(env('PAYSTACK_PAYMENT_URL') . '/transaction/initialize', [
            'email' => $user->email,
            'amount' => $amount,
            'reference' => $reference,
            'callback_url' => route('paystack.callback'),
        ]);

        if ($response->failed()) {
            return response()->json(['message' => 'Failed to initialize payment.'], 500);
        }

        // Save deposit as pending
        $deposit = new Deposit();
        $deposit->user_id = $user->id;
        $deposit->amount = $request->amount;
        $deposit->ref = $reference;
        $deposit->status = 'waiting';
        $deposit->currency = 'NGN';
        $deposit->payment_id = 'paystack';
        $deposit->network = 'paystack';
        $deposit->payment_wallet = 'paystack';
        $deposit->save();

        return response()->json([
            'redirect_url' => $response['data']['authorization_url'],
        ]);
    }

    // Callback route after payment
    public function callback(Request $request)
    {
        $reference = $request->query('reference');

        if (!$reference) {
            return redirect()->route('user.deposits')->with('error', 'Reference not found');
        }

        return redirect()->route('paystack.verify', ['reference' => $reference]);
    }

    // Verify transaction
    public function verify(Request $request)
    {
        $reference = $request->reference;

        $response = Http::withToken(env('PAYSTACK_SECRET_KEY'))
            ->get(env('PAYSTACK_PAYMENT_URL') . '/transaction/verify/' . $reference);

        if ($response->failed()) {
            return redirect()->route('user.deposits')->with('error', 'Could not verify transaction.');
        }

        $data = $response['data'];

        if ($data['status'] == 'success') {
            $deposit = Deposit::where('ref', $reference)->first();
            if (!$deposit || $deposit->status === 'finished') {
                return redirect()->route('user.deposits')->with('error', 'Invalid or already processed.');
            }

            $deposit->status = 'finished';
            $deposit->converted_amount = $data['amount'] / 100; // in naira
            $deposit->save();

            // Process wallet credit
            processDeposit($deposit->id, 'approve');

            return redirect()->route('user.deposits')->with('success', 'Deposit successful!');
        }

        return redirect()->route('user.deposits')->with('error', 'Payment failed or cancelled.');
    }
}
