<?php

namespace Kylin\LawCase\Services;

use Illuminate\Support\Facades\Crypt;
use Illuminate\Support\Facades\Log;

/**
 * 加密服务
 *
 * 对敏感数据（如案件细节、客户隐私）进行加密存储和解密读取。
 * 基于 Laravel Crypt 组件的 AES-256 加密。
 *
 * 依据《个人信息保护法》第五十一条，处理敏感个人信息应采取加密等保护措施；
 * 依据《律师法》第三十八条，律师对在执业中知悉的委托人隐私负有保密义务。
 * 解密操作涉及敏感数据访问，需记录审计日志便于追溯。
 */
class EncryptionService
{
    public function encrypt(string $value): string
    {
        return Crypt::encryptString($value);
    }

    public function decrypt(string $value): string
    {
        $decrypted = Crypt::decryptString($value);

        // 解密操作涉及敏感数据访问，记录审计日志
        $this->auditDecryption();

        return $decrypted;
    }

    /**
     * 记录解密操作审计日志
     *
     * 依据《个人信息保护法》和《律师法》，
     * 敏感案件数据解密访问需记录审计日志，便于追溯。
     * 注意：不记录解密后的明文内容，仅记录访问行为。
     */
    private function auditDecryption(): void
    {
        if (! class_exists(\Kylin\AuditLog\Models\AuditLog::class)) {
            return;
        }

        try {
            \Kylin\AuditLog\Models\AuditLog::create([
                'event' => 'sensitive_data_decrypted',
                'model_type' => 'encryption',
                'model_id' => 0,
                'new_values' => [
                    'action' => 'decrypt',
                    'timestamp' => now()->toIso8601String(),
                ],
                'old_values' => null,
                'user_id' => auth()->id(),
                'ip' => request()?->ip(),
                'url' => request()?->fullUrl(),
                'tag' => 'law-case-encryption',
            ]);
        } catch (\Throwable $e) {
            Log::warning('解密审计日志写入失败', [
                'error' => $e->getMessage(),
            ]);
        }
    }
}
