<?php

namespace App\Console\Commands;

use App\Services\VirtualTryonImageService;
use App\VirtualTryonResult;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Storage;

class CleanExpiredTryonResults extends Command
{
    protected $signature = 'tryon:clean-expired';

    protected $description = 'Delete expired virtual try-on results (90-day retention)';

    public function handle(VirtualTryonImageService $imageService)
    {
        try {
            $disk = $imageService->diskName();
        } catch (\Throwable $e) {
            // Fail fast: in production this means DO_SPACES is misconfigured.
            // We must not silently fall back to the public disk (leaks PII).
            $this->error('Private storage is not configured: ' . $e->getMessage());
            Log::error('CleanExpiredTryonResults aborted', ['error' => $e->getMessage()]);
            return 1;
        }

        $count = 0;
        VirtualTryonResult::where('expires_at', '<', now())
            ->chunkById(200, function ($results) use (&$count, $disk) {
                foreach ($results as $result) {
                    try {
                        if ($result->result_image) {
                            Storage::disk($disk)->delete($result->result_image);
                        }
                        $result->delete();
                        $count++;
                    } catch (\Exception $e) {
                        Log::error('Failed to clean expired tryon result', [
                            'result_id' => $result->id,
                            'error' => $e->getMessage(),
                        ]);
                    }
                }
            });

        $this->info("Cleaned {$count} expired try-on results.");
        Log::info("Cleaned {$count} expired try-on results.");

        return 0;
    }
}
