<?php

namespace App\Models;

use App\Enums\PlanTier;
use Database\Factories\PlanFactory;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Cache;

class Plan extends Model
{
    /** @use HasFactory<PlanFactory> */
    use HasFactory;

    protected $fillable = [
        'name',
        'stripe_price_id',
        'features',
        'active',
    ];

    /**
     * Resolve the active plan for a user.
     * Falls back to the free plan when no active Cashier subscription exists.
     */
    public static function resolveForUser(User $user): self
    {
        $cache = Cache::supportsTags() ? Cache::tags(['plans']) : Cache::store();

        return $cache->remember(
            "plan_for_user_{$user->id}",
            3600,
            function () use ($user): self {
                $priceId = null;

                if (method_exists($user, 'subscriptions')) {
                    $subscription = $user->subscriptions()->active()->first();
                    $priceId = $subscription?->stripe_price ?? null;
                }

                if ($priceId) {
                    $plan = static::where('stripe_price_id', $priceId)->where('active', true)->first();

                    if ($plan) {
                        return $plan;
                    }
                }

                return static::where('name', PlanTier::Free->value)->firstOrFail();
            }
        );
    }

    protected static function booted(): void
    {
        static::saved(function (): void {
            if (Cache::supportsTags()) {
                Cache::tags(['plans'])->flush();
            }
        });
    }

    protected function casts(): array
    {
        return [
            'features' => 'array',
            'active' => 'boolean',
        ];
    }
}
