<?php

namespace App\Policies;

use App\Models\Document;
use App\Models\User;
use App\Services\SecurityLogger;
use Illuminate\Auth\Access\Response;

class DocumentPolicy
{
    /**
     * 安全日志记录器
     */
    protected SecurityLogger $securityLogger;

    /**
     * 构造函数
     */
    public function __construct(SecurityLogger $securityLogger)
    {
        $this->securityLogger = $securityLogger;
    }

    /**
     * 判断用户是否可以查看文档列表
     * 需求：权限检查 + 分组访问控制
     *
     * @param User $user
     * @return bool
     */
    public function viewAny(User $user): bool
    {
        // 检查用户是否有查看文档的权限
        return $user->can('document.view');
    }

    /**
     * 判断用户是否可以查看特定文档
     * 需求：3.1, 3.4, 7.1, 7.2, 7.3 + 权限检查
     * - 首先检查用户是否有 document.view 权限
     * - 全局文档：所有用户都可以查看
     * - 专用文档：只有所属分组的用户可以查看
     * - 记录未授权访问尝试
     *
     * @param User $user
     * @param Document $document
     * @return bool
     */
    public function view(User $user, Document $document): bool
    {
        return $user->can('document.view');
    }

    /**
     * 判断用户是否可以创建文档
     * 需求：权限检查
     *
     * @param User $user
     * @return bool
     */
    public function create(User $user): bool
    {
        return $user->can('document.create');
    }

    /**
     * 判断用户是否可以更新文档
     * 需求：7.3 + 权限检查
     * - 首先检查用户是否有 document.update 权限
     * - 只有文档的上传者可以更新文档
     *
     * @param User $user
     * @param Document $document
     * @return bool
     */
    public function update(User $user, Document $document): bool
    {
        // 首先检查用户是否有更新文档的权限
        if (!$user->can('document.update')) {
            $this->securityLogger->logUnauthorizedAccess($user, $document, 'update');
            return false;
        }

        // 只有文档的上传者可以更新
        $canUpdate = $document->uploaded_by === $user->id;
        
        // 如果没有权限，记录未授权访问尝试
        if (!$canUpdate) {
            $this->securityLogger->logUnauthorizedAccess($user, $document, 'update');
        }
        
        return $canUpdate;
    }

    /**
     * 判断用户是否可以删除文档
     * 需求：7.3 + 权限检查
     * - 首先检查用户是否有 document.delete 权限
     * - 只有文档的上传者可以删除文档
     *
     * @param User $user
     * @param Document $document
     * @return bool
     */
    public function delete(User $user, Document $document): bool
    {
        // 首先检查用户是否有删除文档的权限
        if (!$user->can('document.delete')) {
            $this->securityLogger->logUnauthorizedAccess($user, $document, 'delete');
            return false;
        }

        // 只有文档的上传者可以删除
        $canDelete = $document->uploaded_by === $user->id;
        
        // 如果没有权限，记录未授权访问尝试
        if (!$canDelete) {
            $this->securityLogger->logUnauthorizedAccess($user, $document, 'delete');
        }
        
        return $canDelete;
    }

    /**
     * 判断用户是否可以下载文档
     * 需求：4.1, 4.2, 7.1, 7.2, 7.3 + 权限检查
     * - 首先检查用户是否有 document.download 权限
     * - 下载权限与查看权限相同：
     *   - 全局文档：所有用户都可以下载
     *   - 专用文档：只有所属分组的用户可以下载
     * - 记录未授权下载尝试
     *
     * @param User $user
     * @param Document $document
     * @return bool
     */
    public function download(User $user, Document $document): bool
    {
        return $user->can('document.download');
    }

    /**
     * 判断用户是否可以恢复已删除的文档
     * 需求：7.3
     *
     * @param User $user
     * @param Document $document
     * @return bool
     */
    public function restore(User $user, Document $document): bool
    {
        // 只有文档的上传者可以恢复
        $canRestore = $document->uploaded_by === $user->id;
        
        // 如果没有权限，记录未授权访问尝试
        if (!$canRestore) {
            $this->securityLogger->logUnauthorizedAccess($user, $document, 'restore');
        }
        
        return $canRestore;
    }

    /**
     * 判断用户是否可以永久删除文档
     * 需求：7.3
     *
     * @param User $user
     * @param Document $document
     * @return bool
     */
    public function forceDelete(User $user, Document $document): bool
    {
        // 只有文档的上传者可以永久删除
        $canForceDelete = $document->uploaded_by === $user->id;
        
        // 如果没有权限，记录未授权访问尝试
        if (!$canForceDelete) {
            $this->securityLogger->logUnauthorizedAccess($user, $document, 'forceDelete');
        }
        
        return $canForceDelete;
    }
}
