<?php

namespace App\Http\Controllers;

use App\Models\Plan;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class SubscriptionController extends Controller
{
    /**
     * Afișează pagina de planuri disponibile
     */
    public function index()
    {
        $plans = Plan::where('is_active', true)
            ->whereNotNull('stripe_price_id')
            ->orderBy('price', 'asc')
            ->get();

        $user = Auth::user();
        $currentSubscription = $user->subscription('default');

        return view('subscriptions.index', compact('plans', 'currentSubscription'));
    }

    /**
     * Creează o sesiune Stripe Checkout
     */
    public function checkout(Request $request, Plan $plan)
    {
        $user = Auth::user();

        // Verifică dacă planul are Stripe Price ID
        if (!$plan->stripe_price_id) {
            return redirect()->back()->with('error', 'Acest plan nu este disponibil pentru achiziție online.');
        }

        try {
            // Creează sesiunea de checkout
            return $user->newSubscription('default', $plan->stripe_price_id)
                ->checkout([
                    'success_url' => route('subscription.success') . '?session_id={CHECKOUT_SESSION_ID}',
                    'cancel_url' => route('subscription.cancel'),
                    'metadata' => [
                        'plan_id' => $plan->id,
                        'plan_name' => $plan->name,
                    ],
                ]);
        } catch (\Exception $e) {
            return redirect()->back()->with('error', 'Eroare la procesarea plății: ' . $e->getMessage());
        }
    }

    /**
     * Pagina de succes după plată
     */
    public function success(Request $request)
    {
        $sessionId = $request->get('session_id');
        
        if ($sessionId) {
            $user = Auth::user();
            
            // Actualizează planul utilizatorului
            $subscription = $user->subscription('default');
            if ($subscription && $subscription->stripe_price) {
                $plan = Plan::where('stripe_price_id', $subscription->stripe_price)->first();
                if ($plan) {
                    $user->update(['plan_id' => $plan->id]);
                }
            }
        }

        return view('subscriptions.success');
    }

    /**
     * Pagina de anulare
     */
    public function cancel()
    {
        return view('subscriptions.cancel');
    }

    /**
     * Portal de gestionare abonament
     */
    public function billingPortal()
    {
        $user = Auth::user();

        return $user->redirectToBillingPortal(route('dashboard'));
    }

    /**
     * Anulează abonamentul
     */
    public function cancelSubscription()
    {
        $user = Auth::user();
        $subscription = $user->subscription('default');

        if ($subscription) {
            $subscription->cancel();
            return redirect()->route('subscription.index')
                ->with('success', 'Abonamentul tău va fi anulat la sfârșitul perioadei de facturare.');
        }

        return redirect()->route('subscription.index')
            ->with('error', 'Nu ai un abonament activ.');
    }

    /**
     * Reia abonamentul anulat
     */
    public function resumeSubscription()
    {
        $user = Auth::user();
        $subscription = $user->subscription('default');

        if ($subscription && $subscription->onGracePeriod()) {
            $subscription->resume();
            return redirect()->route('subscription.index')
                ->with('success', 'Abonamentul tău a fost reluat cu succes!');
        }

        return redirect()->route('subscription.index')
            ->with('error', 'Nu poți relua acest abonament.');
    }

    /**
     * Schimbă planul
     */
    public function swap(Request $request, Plan $plan)
    {
        $user = Auth::user();
        $subscription = $user->subscription('default');

        if (!$subscription) {
            return redirect()->route('subscription.checkout', $plan)
                ->with('info', 'Nu ai un abonament activ. Te rugăm să achiziționezi un plan.');
        }

        if (!$plan->stripe_price_id) {
            return redirect()->back()->with('error', 'Acest plan nu este disponibil.');
        }

        try {
            // Verifică dacă este upgrade (plan mai scump) sau downgrade
            $currentPlan = $user->plan;
            $isUpgrade = $plan->price > ($currentPlan ? $currentPlan->price : 0);

            if ($isUpgrade) {
                // Pentru upgrade, anulează abonamentul curent și redirecționează la checkout
                $subscription->cancelNow();
                
                return redirect()->route('subscription.checkout', $plan)
                    ->with('info', 'Abonamentul curent a fost anulat. Te rugăm să finalizezi achiziția noului plan.');
            } else {
                // Pentru downgrade, schimbă la sfârșitul perioadei de facturare
                $subscription->swap($plan->stripe_price_id);
                $user->update(['plan_id' => $plan->id]);

                return redirect()->route('subscription.index')
                    ->with('success', 'Planul tău va fi actualizat la sfârșitul perioadei de facturare.');
            }
        } catch (\Exception $e) {
            return redirect()->back()->with('error', 'Eroare la schimbarea planului: ' . $e->getMessage());
        }
    }
}
