<?php

namespace App\Http\Controllers\SuperAdmin;

use App\Http\Controllers\Controller;
use App\Models\SubscriptionPayment;
use App\Models\SubscriptionRequest;
use App\Models\User;
use App\Notifications\SubscriptionRequestApprovedNotification;
use App\Notifications\SubscriptionRequestRejectedNotification;
use App\Services\CouponService;
use App\Services\HrmsNotificationService;
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, HrmsNotificationService $notifier, CouponService $couponService)
    {
        if ($subscriptionRequest->status !== 'pending') {
            return redirect()->route('superadmin.offline-requests.index')
                ->with('error', 'Request is no longer pending.');
        }

        $data = $request->validate([
            'licence_expire_on' => 'nullable|date',
            'paid_at' => 'nullable|date',
        ]);

        $company = $subscriptionRequest->company;
        $paidAt = ! empty($data['paid_at']) ? Carbon::parse($data['paid_at']) : now();
        $isUpgrade = (bool) $subscriptionRequest->is_upgrade;

        $licenceExpireOn = $data['licence_expire_on']
            ?? ($isUpgrade && $company->licence_expire_on
                ? $company->licence_expire_on->format('Y-m-d')
                : now()->addYear()->format('Y-m-d'));

        $payment = SubscriptionPayment::create([
            'company_id' => $company->id,
            'subscription_plan_id' => $subscriptionRequest->subscription_plan_id,
            'subscription_request_id' => $subscriptionRequest->id,
            'coupon_id' => $subscriptionRequest->coupon_id,
            'checkout_mode' => $isUpgrade ? 'upgrade' : 'renew',
            'is_upgrade' => $isUpgrade,
            'plan_discount_amount' => $subscriptionRequest->plan_discount_amount ?? 0,
            'coupon_discount_amount' => $subscriptionRequest->coupon_discount_amount ?? 0,
            'apply_plan_on_success' => true,
            'extend_licence_on_success' => ! $isUpgrade,
            '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 . ' (YEARLY' . ($isUpgrade ? ' upgrade' : '') . ')',
            'meta' => [
                'billing_cycle' => 'yearly',
                'addons_total' => (float) ($subscriptionRequest->addons_total ?? 0),
                'days_remaining' => $subscriptionRequest->days_remaining,
                'unused_credit' => $subscriptionRequest->unused_credit,
                'upgrade_gross' => $subscriptionRequest->upgrade_gross,
            ],
            'recorded_by' => auth()->id(),
        ]);

        $company->forceFill([
            'subscription_plan_id' => $subscriptionRequest->subscription_plan_id,
            'licence_expire_on' => $licenceExpireOn,
            'status' => 'active',
            'package_type' => 'yearly',
        ])->save();

        $subscriptionRequest->update([
            'status' => 'approved',
            'approved_at' => now(),
            'approved_by' => auth()->id(),
        ]);

        if ($subscriptionRequest->coupon_id) {
            $subscriptionRequest->loadMissing('coupon');
            if ($subscriptionRequest->coupon) {
                $couponService->redeem(
                    $subscriptionRequest->coupon,
                    $company,
                    $payment->id,
                    $subscriptionRequest->id
                );
            }
        }

        $subscriptionRequest->load('subscriptionPlan');
        $this->notifyCompanyAdmins($subscriptionRequest, $notifier, new SubscriptionRequestApprovedNotification($subscriptionRequest));

        return redirect()->route('superadmin.offline-requests.index')
            ->with('success', 'Request approved and payment recorded.');
    }

    public function reject(SubscriptionRequest $subscriptionRequest, HrmsNotificationService $notifier)
    {
        if ($subscriptionRequest->status !== 'pending') {
            return redirect()->route('superadmin.offline-requests.index')
                ->with('error', 'Request is no longer pending.');
        }

        $subscriptionRequest->update(['status' => 'rejected']);

        $subscriptionRequest->load('subscriptionPlan');
        $this->notifyCompanyAdmins($subscriptionRequest, $notifier, new SubscriptionRequestRejectedNotification($subscriptionRequest));

        return redirect()->route('superadmin.offline-requests.index')
            ->with('success', 'Request rejected.');
    }

    protected function notifyCompanyAdmins(SubscriptionRequest $subscriptionRequest, HrmsNotificationService $notifier, $notification): void
    {
        $companyId = (int) $subscriptionRequest->company_id;
        if ($companyId <= 0) {
            return;
        }

        $notifier->notifyUsersWithAnyPermission($companyId, ['manage_settings'], $notification);

        $requester = User::withoutGlobalScopes()
            ->where('company_id', $companyId)
            ->where('is_superadmin', false)
            ->orderBy('id')
            ->first();

        $requester?->notify($notification);
    }
}
