<?php

namespace App\Observers;

use App\Models\Boards\File;
use App\Models\Tenants\Tenant;
use Illuminate\Support\Facades\Log;

/**
 * 파일 생성/삭제 시 테넌트 저장소 사용량 자동 업데이트
 */
class FileObserver
{
    /**
     * 파일 생성 시 - 테넌트 storage_used 증가
     */
    public function created(File $file): void
    {
        $this->updateTenantStorage($file->tenant_id, $file->file_size);
    }

    /**
     * 파일 소프트 삭제 시 - 테넌트 storage_used 감소
     */
    public function deleted(File $file): void
    {
        $this->updateTenantStorage($file->tenant_id, -$file->file_size);
    }

    /**
     * 파일 복원 시 - 테넌트 storage_used 증가
     */
    public function restored(File $file): void
    {
        $this->updateTenantStorage($file->tenant_id, $file->file_size);
    }

    /**
     * 파일 영구 삭제 시 - 이미 deleted에서 처리되므로 추가 작업 불필요
     * forceDelete는 deleted 이벤트를 트리거하지 않으므로 별도 처리
     */
    public function forceDeleting(File $file): void
    {
        // 소프트 삭제되지 않은 상태에서 바로 forceDelete하는 경우만 처리
        if (! $file->trashed()) {
            $this->updateTenantStorage($file->tenant_id, -$file->file_size);
        }
    }

    /**
     * 테넌트 저장소 사용량 업데이트
     */
    private function updateTenantStorage(?int $tenantId, int $sizeDelta): void
    {
        if (! $tenantId || $sizeDelta === 0) {
            return;
        }

        try {
            $tenant = Tenant::find($tenantId);
            if ($tenant) {
                // 음수가 되지 않도록 보호
                $newSize = max(0, ($tenant->storage_used ?? 0) + $sizeDelta);
                $tenant->storage_used = $newSize;
                $tenant->save();

                Log::debug("Tenant {$tenantId} storage updated: {$sizeDelta} bytes (total: {$newSize})");
            }
        } catch (\Exception $e) {
            Log::error("Failed to update tenant storage: {$e->getMessage()}", [
                'tenant_id' => $tenantId,
                'size_delta' => $sizeDelta,
            ]);
        }
    }
}
