<?php

declare(strict_types=1);

namespace App\Http\Controllers;

use App\Models\Plan;
use App\Models\SubscriptionRequest;
use Illuminate\Contracts\View\View;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;

/**
 * Pantalla de reactivación tras expirar la prueba/suscripción (Fase 3).
 *
 * Vive FUERA del panel /admin: el admin con suscripción expirada entra aquí
 * (login lo redirige, o el middleware EnsureActiveSubscription si navega a /admin)
 * y puede solicitar una suscripción. La solicitud crea un SubscriptionRequest que
 * notifica a los super_admins (canal database), quienes la revisan/activan.
 */
class SubscriptionLockController extends Controller
{
    public function show(Request $request): View|RedirectResponse
    {
        $user = $request->user();

        if (! $user) {
            return redirect()->route('filament.admin.auth.login');
        }

        // Si ya (re)cuperó el acceso, no tiene nada que hacer aquí.
        if ($user->hasActiveSubscription()) {
            return redirect('/admin');
        }

        $company = $user->company;

        return view('subscription.locked', [
            'company' => $company,
            'plan' => Plan::getTrialPlan(),
            'hasPending' => $company !== null && SubscriptionRequest::pendingForCompany($company->id) > 0,
        ]);
    }

    public function requestSubscription(Request $request): RedirectResponse
    {
        $user = $request->user();

        if (! $user) {
            return redirect()->route('filament.admin.auth.login');
        }

        if ($user->hasActiveSubscription()) {
            return redirect('/admin');
        }

        $company = $user->company;
        abort_if($company === null, 403);

        // Una sola solicitud de reactivación pendiente por empresa (anti-duplicado).
        if (! SubscriptionRequest::canCreateRequest($company->id, maxPending: 1)) {
            return redirect()->route('subscription.locked')->with('status', 'pending');
        }

        $plan = Plan::getTrialPlan();

        SubscriptionRequest::create([
            'company_id' => $company->id,
            'subscription_id' => $company->subscriptions()->orderByDesc('id')->value('id'),
            'requested_by_user_id' => $user->id,
            'request_type' => SubscriptionRequest::TYPE_UPGRADE_PLAN,
            'requested_plan_id' => $plan?->id,
            'comments' => 'El período de prueba finalizó. La empresa solicita activar la suscripción'
                .($plan ? " del plan {$plan->name}." : '.'),
            'priority' => SubscriptionRequest::PRIORITY_HIGH,
        ]);

        return redirect()->route('subscription.locked')->with('status', 'sent');
    }
}
