<?php

declare(strict_types=1);


namespace Plugins\Neatstudio\Membership\Services;

use App\Models\User;
use Plugins\Neatstudio\Membership\Models\Subscription;

class MembershipService
{
    public function isMember(?User $user): bool
    {
        if (! $user) {
            return false;
        }

        return Subscription::query()
            ->where('user_id', $user->id)
            ->where('status', 'active')
            ->where('ends_at', '>', now())
            ->exists();
    }

    /**
     * 是否有权阅读某篇文章（会员 或 作者 或 已单篇解锁）。
     */
    public function canReadPost(?User $user, \App\Models\Post $post): bool
    {
        if ($user && $post->user_id === $user->id) {
            return true;
        }

        $meta = $post->meta ?? [];

        // 单篇解锁：meta.unlocked_user_ids
        if ($user && in_array($user->id, $meta['unlocked_user_ids'] ?? [], true)) {
            return true;
        }

        // 会员专享文章
        if (! empty($meta['members_only'])) {
            return $user !== null && $this->isMember($user);
        }

        return true;
    }

    /**
     * 是否有权阅读 [paid] 付费块：会员 或 作者 或 已单篇解锁。
     */
    public function canReadPaidContent(?User $user, \App\Models\Post $post): bool
    {
        if ($user && $post->user_id === $user->id) {
            return true;
        }

        if ($user && in_array($user->id, $post->meta['unlocked_user_ids'] ?? [], true)) {
            return true;
        }

        return $user !== null && $this->isMember($user);
    }

    public function hasPermission(User $user, string $permission): bool
    {
        if (! $this->isMember($user)) {
            return false;
        }

        $subscription = Subscription::query()
            ->where('user_id', $user->id)
            ->where('status', 'active')
            ->where('ends_at', '>', now())
            ->with('plan')
            ->latest()
            ->first();

        return $subscription && in_array($permission, $subscription->plan?->permissions ?? [], true);
    }
}
