<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use Illuminate\Http\RedirectResponse;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Log;

class StorageSyncController extends Controller
{
    /**
     * ينشر محتوى storage/app/public إلى public:
     * - يحاول أولاً `php artisan storage:link` (الطريقة الموصى بها على لينكس).
     * - إن تعذّر الرابط أو كان المسار مجلداً عادياً، يُنسخ المحتوى فعلياً إلى public/storage.
     */
    public function syncToPublic(): RedirectResponse
    {
        $source = storage_path('app/public');
        $dest = public_path('storage');

        if (! File::exists($source)) {
            File::makeDirectory($source, 0755, true);
        }

        // رابط رمزي سليم
        if (is_link($dest) && is_dir($dest)) {
            return redirect()->back()->with(
                'success',
                'المسار public/storage مفعّل كرابط إلى التخزين — لا حاجة لإعادة النشر.'
            );
        }

        // رابط معطوب: إزالته ثم إعادة المحاولة
        if (is_link($dest)) {
            @unlink($dest);
        }

        // إن كان public/storage مجلداً عادياً (مثلاً بعد نسخ سابق): دمج/تحديث الملفات
        if (File::isDirectory($dest)) {
            try {
                File::copyDirectory($source, $dest);

                return redirect()->back()->with(
                    'success',
                    'تم نسخ/تحديث ملفات storage/app/public داخل المجلد public/storage.'
                );
            } catch (\Throwable $e) {
                Log::error('Storage copyDirectory: '.$e->getMessage());

                return redirect()->back()->with(
                    'error',
                    'تعذر نسخ الملفات: '.$e->getMessage()
                );
            }
        }

        // المحاولة القياسية: رابط رمزي
        try {
            Artisan::call('storage:link');
            $output = trim(Artisan::output());
            if (is_link($dest) || File::isDirectory($dest)) {
                $msg = $output !== '' ? $output : 'تم تنفيذ ربط التخزين (storage:link).';

                return redirect()->back()->with('success', $msg);
            }
        } catch (\Throwable $e) {
            Log::warning('storage:link: '.$e->getMessage());
        }

        // بديل: نسخ فعلي (استضافات بدون symlink أو ويندوز)
        try {
            File::makeDirectory($dest, 0755, true);
            File::copyDirectory($source, $dest);

            return redirect()->back()->with(
                'success',
                'تم نسخ ملفات storage/app/public إلى public/storage (لم يُنشأ رابط رمزي — تم استخدام النسخ الفعلي).'
            );
        } catch (\Throwable $e) {
            Log::error('Storage fallback copy: '.$e->getMessage());

            return redirect()->back()->with(
                'error',
                'تعذر ربط التخزين أو نسخه. راجع صلاحيات المجلدات أو سجل الأخطاء. '.$e->getMessage()
            );
        }
    }
}
