<?php

namespace App\Http\Controllers\SuperAdmin;

use App\Http\Controllers\Controller;
use App\Models\Company;
use App\Models\SubscriptionPayment;
use App\Models\SubscriptionPlan;
use App\Services\RazorpaySubscriptionPaymentService;
use Carbon\Carbon;
use Illuminate\Http\Request;

class PaymentController extends Controller
{
    public function __construct(
        protected RazorpaySubscriptionPaymentService $razorpay
    ) {}

    public function index()
    {
        $companies = Company::orderBy('name')->get();
        $plans = SubscriptionPlan::query()
            ->where('active', true)
            ->orderBy('base_price_yearly')
            ->orderBy('name')
            ->get();
        [$razorpayKeyId] = $this->razorpay->getKeys();

        $subscriptionPayments = SubscriptionPayment::with(['company', 'subscriptionPlan'])
            ->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',
            'plans',
            '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',
            'subscription_plan_id' => 'nullable|exists:subscription_plans,id',
            'apply_plan' => 'sometimes|boolean',
            'extend_licence' => 'sometimes|boolean',
        ]);

        $payment = SubscriptionPayment::create([
            'company_id' => $data['company_id'],
            'subscription_plan_id' => $data['subscription_plan_id'] ?? null,
            'amount' => $data['amount'],
            'calculated_total' => $data['amount'],
            'currency' => $data['currency'] ?? config('razorpay.currency', 'INR'),
            'payment_method' => 'offline',
            'status' => 'completed',
            'paid_at' => isset($data['paid_at']) ? Carbon::parse($data['paid_at']) : now(),
            'notes' => $data['notes'] ?? null,
            'recorded_by' => auth()->id(),
            'apply_plan_on_success' => $request->boolean('apply_plan'),
            'extend_licence_on_success' => $request->boolean('extend_licence'),
        ]);

        if ($request->boolean('apply_plan') || $request->boolean('extend_licence')) {
            $this->razorpay->applyEntitlements($payment);
        }

        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',
            'subscription_plan_id' => 'nullable|exists:subscription_plans,id',
            'apply_plan' => 'sometimes|boolean',
            'extend_licence' => 'sometimes|boolean',
        ]);

        $company = Company::findOrFail($data['company_id']);
        $plan = ! empty($data['subscription_plan_id'])
            ? SubscriptionPlan::findOrFail($data['subscription_plan_id'])
            : ($company->subscriptionPlan ?? SubscriptionPlan::query()->where('active', true)->first());

        if (! $plan) {
            return response()->json(['message' => 'Select a plan for this payment.'], 422);
        }

        $quote = [
            'mode' => $request->boolean('extend_licence') ? 'renew' : 'purchase',
            'total' => (float) $data['amount'],
            'plan_discount_amount' => 0,
            'coupon_discount_amount' => 0,
            'is_upgrade' => false,
            'coupon' => null,
            'days_remaining' => null,
            'unused_credit' => null,
            'upgrade_gross' => null,
        ];

        try {
            $order = $this->razorpay->createOrderForCompany(
                $company,
                $plan,
                $quote,
                auth()->id(),
                $request->boolean('apply_plan'),
                $request->boolean('extend_licence')
            );
        } catch (\Throwable $e) {
            return response()->json(['message' => $e->getMessage()], 500);
        }

        return response()->json($order);
    }

    public function verifyRazorpay(Request $request)
    {
        $data = $request->validate([
            'razorpay_order_id' => 'required|string',
            'razorpay_payment_id' => 'required|string',
            'razorpay_signature' => 'required|string',
        ]);

        $result = $this->razorpay->verifyAndFulfill(
            $data['razorpay_order_id'],
            $data['razorpay_payment_id'],
            $data['razorpay_signature']
        );

        if (! ($result['ok'] ?? false)) {
            return redirect()->route('superadmin.payments.index')
                ->with('error', $result['message'] ?? 'Payment verification failed.');
        }

        return redirect()->route('superadmin.payments.index')
            ->with('success', 'Payment received successfully.');
    }
}
