<?php

namespace App\Http\Controllers\SuperAdmin;

use App\Http\Controllers\Controller;
use App\Models\SubscriptionPayment;
use App\Models\SubscriptionRequest;
use Carbon\Carbon;
use Illuminate\Http\Request;

class SubscriptionRequestController extends Controller
{
    public function index(Request $request)
    {
        $query = SubscriptionRequest::with(['company', 'subscriptionPlan'])
            ->orderByRaw("CASE WHEN status = 'pending' THEN 0 ELSE 1 END")
            ->orderByDesc('requested_at');

        if ($request->filled('status')) {
            $query->where('status', $request->status);
        }
        if ($request->filled('search')) {
            $query->whereHas('company', function ($q) use ($request) {
                $q->where('name', 'like', '%' . $request->search . '%')
                    ->orWhere('email', 'like', '%' . $request->search . '%');
            });
        }

        $requests = $query->paginate(15)->withQueryString();
        $pendingCount = SubscriptionRequest::where('status', 'pending')->count();

        return view('superadmin.offline-requests', compact('requests', 'pendingCount'));
    }

    public function approveForm(SubscriptionRequest $subscriptionRequest)
    {
        if ($subscriptionRequest->status !== 'pending') {
            return redirect()->route('superadmin.offline-requests.index')
                ->with('error', 'Request is no longer pending.');
        }
        return view('superadmin.offline-requests-approve', compact('subscriptionRequest'));
    }

    public function approve(Request $request, SubscriptionRequest $subscriptionRequest)
    {
        if ($subscriptionRequest->status !== 'pending') {
            return redirect()->route('superadmin.offline-requests.index')
                ->with('error', 'Request is no longer pending.');
        }

        $data = $request->validate([
            'licence_expire_on' => 'required|date',
            'paid_at' => 'nullable|date',
        ]);

        $company = $subscriptionRequest->company;
        $paidAt = ! empty($data['paid_at']) ? Carbon::parse($data['paid_at']) : now();

        SubscriptionPayment::create([
            'company_id' => $company->id,
            'employee_count' => $subscriptionRequest->employee_count ?? 1,
            'amount' => $subscriptionRequest->calculated_total ?: $subscriptionRequest->amount,
            'calculated_total' => $subscriptionRequest->calculated_total ?: $subscriptionRequest->amount,
            'currency' => $subscriptionRequest->currency ?? config('app.currency_code', 'INR'),
            'selected_addons' => $subscriptionRequest->selected_addons,
            'payment_method' => 'offline',
            'status' => 'completed',
            'paid_at' => $paidAt,
            'notes' => 'Approved from offline request #' . $subscriptionRequest->id . ' (' . strtoupper($subscriptionRequest->billing_cycle ?? 'monthly') . ')',
            'meta' => [
                'billing_cycle' => $subscriptionRequest->billing_cycle ?? 'monthly',
                'addons_total' => (float) ($subscriptionRequest->addons_total ?? 0),
            ],
            'recorded_by' => auth()->id(),
        ]);

        $company->update([
            'subscription_plan_id' => $subscriptionRequest->subscription_plan_id,
            'licence_expire_on' => $data['licence_expire_on'],
            'status' => 'active',
        ]);

        $subscriptionRequest->update([
            'status' => 'approved',
            'approved_at' => now(),
            'approved_by' => auth()->id(),
        ]);

        return redirect()->route('superadmin.offline-requests.index')
            ->with('success', 'Request approved and payment recorded.');
    }

    public function reject(SubscriptionRequest $subscriptionRequest)
    {
        if ($subscriptionRequest->status !== 'pending') {
            return redirect()->route('superadmin.offline-requests.index')
                ->with('error', 'Request is no longer pending.');
        }

        $subscriptionRequest->update(['status' => 'rejected']);

        return redirect()->route('superadmin.offline-requests.index')
            ->with('success', 'Request rejected.');
    }
}
