<?php

namespace XZD\AI\V5\REST\Middleware;

use XZD\AI\V5\Core\Config;

/**
 * REST 认证中间件 — 支持 WP Cookie / Application Password / API Key
 */
class AuthMiddleware
{
    /**
     * 获取当前经过认证的用户ID
     *
     * @return int 用户ID，0表示未登录
     */
    public static function currentUserId(): int
    {
        $userId = get_current_user_id();
        if ($userId) {
            return $userId;
        }

        // 尝试 API Key 认证
        $apiKey = $_SERVER['HTTP_X_XZD_API_KEY'] ?? '';
        if ($apiKey) {
            return self::authenticateApiKey($apiKey);
        }

        return 0;
    }

    /**
     * 获取当前用户的角色分组
     *
     * @return string guest|user|vip|admin
     */
    public static function currentRole(): string
    {
        $userId = self::currentUserId();
        if ($userId === 0) {
            return 'guest';
        }

        $user = get_userdata($userId);
        if (!$user) {
            return 'guest';
        }

        if (in_array('administrator', $user->roles, true)) {
            return 'admin';
        }

        // 委托给 UserHelper 统一入口（内部走适配器）
        return \XZD\AI\V5\Core\UserHelper::getRole($userId);
    }

    /**
     * 获取当前用户的操作身份（AI绑定的用户）
     *
     * @return int 用户ID或0
     */
    public static function operatorId(): int
    {
        $config = Config::instance();
        return $config->int('ai_identity.user_id', 0);
    }

    /**
     * 确保用户登录
     *
     * @return int|false 用户ID或false
     */
    public static function requireLogin(): int|false
    {
        $userId = self::currentUserId();
        return $userId > 0 ? $userId : false;
    }

    /**
     * 确保管理员权限
     *
     * @return int|false 用户ID或false
     */
    public static function requireAdmin(): int|false
    {
        $userId = self::currentUserId();
        if ($userId === 0) {
            return false;
        }
        return current_user_can('manage_options') ? $userId : false;
    }

    /**
     * API Key 认证
     */
    private static function authenticateApiKey(string $key): int
    {
        // 从设置中验证 API Key
        $config = Config::instance();
        $storedKey = $config->get('api.internal_key', '');
        if ($storedKey && hash_equals($storedKey, $key)) {
            // 返回AI绑定的用户ID
            return $config->int('ai_identity.user_id', 0);
        }
        return 0;
    }
}
