<?php

namespace App\Http\Controllers\SuperAdmin;

use App\Http\Controllers\Controller;
use App\Models\Company;
use App\Models\OfflinePaymentMode;
use App\Models\SubscriptionPayment;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\File;
use Razorpay\Api\Api;

class PaymentController extends Controller
{
    private function getRazorpayKeys(): array
    {
        $path = storage_path('app/superadmin_settings.json');
        if (File::exists($path)) {
            $data = json_decode(File::get($path), true);
            if (is_array($data)) {
                $keyId = $data['razorpay_key_id'] ?? null;
                $keySecret = $data['razorpay_key_secret'] ?? null;
                if ($keyId && $keySecret) {
                    return [$keyId, $keySecret];
                }
            }
        }
        return [config('razorpay.key_id'), config('razorpay.key_secret')];
    }

    public function index()
    {
        $companies = Company::orderBy('name')->get();
        $offlinePaymentModes = OfflinePaymentMode::orderBy('name')->get();
        [$razorpayKeyId] = $this->getRazorpayKeys();

        $subscriptionPayments = SubscriptionPayment::with('company')
            ->orderByDesc('created_at')
            ->paginate(20, ['*'], 'sub_page');

        $totalSubscriptionThisMonth = SubscriptionPayment::where('status', 'completed')
            ->whereMonth('paid_at', now()->month)
            ->whereYear('paid_at', now()->year)
            ->sum('amount');

        $totalSubscriptionAll = SubscriptionPayment::where('status', 'completed')->sum('amount');

        return view('superadmin.payments', compact(
            'companies',
            'offlinePaymentModes',
            'razorpayKeyId',
            'subscriptionPayments',
            'totalSubscriptionThisMonth',
            'totalSubscriptionAll'
        ));
    }

    public function storeOffline(Request $request)
    {
        $data = $request->validate([
            'company_id' => 'required|exists:companies,id',
            'amount' => 'required|numeric|min:0.01',
            'currency' => 'nullable|string|max:10',
            'paid_at' => 'nullable|date',
            'notes' => 'nullable|string|max:1000',
            'offline_payment_mode_id' => 'nullable|exists:offline_payment_modes,id',
        ]);

        SubscriptionPayment::create([
            'company_id' => $data['company_id'],
            'amount' => $data['amount'],
            'currency' => $data['currency'] ?? config('razorpay.currency', 'INR'),
            'payment_method' => 'offline',
            'offline_payment_mode_id' => $data['offline_payment_mode_id'] ?? null,
            'status' => 'completed',
            'paid_at' => isset($data['paid_at']) ? Carbon::parse($data['paid_at']) : now(),
            'notes' => $data['notes'] ?? null,
            'recorded_by' => auth()->id(),
        ]);

        return redirect()->route('superadmin.payments.index')->with('success', 'Offline payment recorded.');
    }

    public function createRazorpayOrder(Request $request)
    {
        $data = $request->validate([
            'company_id' => 'required|exists:companies,id',
            'amount' => 'required|numeric|min:0.01',
        ]);

        [$keyId, $keySecret] = $this->getRazorpayKeys();
        if (! $keyId || ! $keySecret) {
            return response()->json(['message' => 'Razorpay is not configured.'], 500);
        }

        $api = new Api($keyId, $keySecret);
        $amountPaise = (int) round($data['amount'] * 100);
        $currency = config('razorpay.currency', 'INR');

        $order = $api->order->create([
            'amount' => $amountPaise,
            'currency' => $currency,
            'receipt' => 'sub_' . $data['company_id'] . '_' . time(),
        ]);

        $payment = SubscriptionPayment::create([
            'company_id' => $data['company_id'],
            'amount' => $data['amount'],
            'currency' => $currency,
            'payment_method' => 'razorpay',
            'status' => 'pending',
            'razorpay_order_id' => $order['id'],
            'recorded_by' => auth()->id(),
        ]);

        return response()->json([
            'order_id' => $order['id'],
            'amount' => $order['amount'],
            'currency' => $order['currency'],
            'company_id' => (int) $data['company_id'],
            'payment_id' => $payment->id,
            'key' => $keyId,
        ]);
    }

    public function verifyRazorpay(Request $request)
    {
        $data = $request->validate([
            'razorpay_order_id' => 'required|string',
            'razorpay_payment_id' => 'required|string',
            'razorpay_signature' => 'required|string',
        ]);

        [$keyId, $keySecret] = $this->getRazorpayKeys();
        if (! $keySecret) {
            return redirect()->route('superadmin.payments.index')->with('error', 'Razorpay is not configured.');
        }

        $api = new Api($keyId, $keySecret);

        try {
            $api->utility->verifyPaymentSignature([
                'razorpay_order_id' => $data['razorpay_order_id'],
                'razorpay_payment_id' => $data['razorpay_payment_id'],
                'razorpay_signature' => $data['razorpay_signature'],
            ]);
        } catch (\Exception $e) {
            SubscriptionPayment::where('razorpay_order_id', $data['razorpay_order_id'])->update([
                'status' => 'failed',
                'razorpay_payment_id' => $data['razorpay_payment_id'],
            ]);

            return redirect()->route('superadmin.payments.index')->with('error', 'Payment verification failed.');
        }

        SubscriptionPayment::where('razorpay_order_id', $data['razorpay_order_id'])->update([
            'status' => 'completed',
            'razorpay_payment_id' => $data['razorpay_payment_id'],
            'razorpay_signature' => $data['razorpay_signature'],
            'paid_at' => now(),
        ]);

        return redirect()->route('superadmin.payments.index')->with('success', 'Payment received successfully.');
    }
}
