<?php

use App\Http\Controllers\Admin;
use App\Http\Controllers\Api;
use App\Http\Controllers\Front;
use App\Http\Controllers\SitemapController;
use Illuminate\Support\Facades\Route;
use App\Models\News;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Storage;

Route::get('/', Front\HomeController::class)->name('home');

Route::get('/admin/api/settings', [Api\SettingController::class, 'index'])->name('api.settings.index');

Route::get('/sitemap.xml', [SitemapController::class, 'index']);

Route::middleware('auth')->group(function () {

    Route::get('/admin', Admin\DashboardController::class)->name('dashboard');
    Route::get('/admin/setting', Admin\SettingController::class)->name('admin.setting');
    Route::get('/admin/news', Admin\NewsController::class)->name('admin.news');
    Route::get('/admin/file_upload', Admin\FileUploadController::class)->name('admin.file_upload');
    Route::get('/admin/search', Admin\SearchController::class)->name('admin.search');
    Route::get('/admin/search_pancingan', Admin\SearchPancinganController::class)->name('admin.search_pancingan');
    Route::get('/admin/search_block', Admin\SearchBlockController::class)->name('admin.search_block');

    Route::get('/admin/profile', [Admin\ProfileController::class, 'edit'])->name('profile.edit');
    Route::patch('/admin/profile', [Admin\ProfileController::class, 'update'])->name('profile.update');
    Route::delete('/admin/profile', [Admin\ProfileController::class, 'destroy'])->name('profile.destroy');

    // API Resource Routes
    Route::apiResource('/admin/api/pages', Api\PageController::class);
    Route::patch('/admin/api/settings', [Api\SettingController::class, 'update'])->name('api.settings.update');
    Route::apiResource('/admin/api/widgets', Api\WidgetController::class);
    Route::apiResource('/admin/api/newss', Api\NewsController::class);
    Route::apiResource('/admin/api/tabs', Api\TabController::class);
    Route::apiResource('/admin/api/file_uploads', Api\FileUploadController::class);
    Route::apiResource('/admin/api/searchs', Api\SearchController::class);
    Route::apiResource('/admin/api/search_pancingans', Api\SearchPancinganController::class);
    Route::apiResource('/admin/api/search_blocks', Api\SearchBlockController::class);

    Route::get('/admin/run-command/{command}', function($command) {
        try {
            Artisan::call($command);
            return "Command $command executed successfully";
        } catch (\Exception $e) {
            return "Error executing command $command : " . $e->getMessage();
        }
    })->name('admin.run-command');

    Route::get('/admin/clone-public-to-s3', function() {
        $fileCloned = [];
        $disk = Storage::disk('s3');
        $files = Storage::disk('public')->allFiles();
        $files = array_filter($files, fn($file) => $file != '.gitignore');
        foreach ($files as $file) {
            $fileCloned[] = $file;
            $disk->put($file, Storage::disk('public')->get($file));
        }

        $fileImgs = glob(public_path('img/*'));
        foreach ($fileImgs as $file) {
            $fileCloned[] = 'img/' . basename($file);
            $disk->put('img/' . basename($file), file_get_contents($file));
        }

        return response()->json([
            'message' => 'File berhasil di clone dari storage public ke s3',
            'data' => $fileCloned
        ]);
    })->name('admin.clone-public-to-s3');
});

require __DIR__.'/auth.php';
Route::get('/institut-kesenian-jakarta.htm', function () {
    abort(403, 'Forbidden');
});

Route::get('{slug}.html', [Front\SearchController::class, 'show_pancingan'])
    ->where('slug', '[A-Za-z0-9\-]+')
    ->name('search.show_pancingan');

Route::get('{slug}.htm', [Front\SearchController::class, 'show'])
    ->where('slug', '[A-Za-z0-9\-]+')
    ->name('search.show');

Route::get('index.php', [Front\NewsController::class, 'show_page_id'])
    ->where('id', '\d+')
    ->name('news.show_page_id_index');

Route::get('info/{id}', [Front\NewsController::class, 'show_page_id'])
    ->where('id', '\d+')
    ->name('news.show_page_id');

Route::get('page_view.php', [Front\NewsController::class, 'show_by_id'])
    ->where('idpage', '\d+')
    ->name('news.show_by_id');

// Routing fallback slug
Route::get('{slug}', function ($slug) {
    // Jika slug persis ada di database
    if (News::where('permalink', $slug)->exists()) {
        return app(Front\NewsController::class)->show($slug);
    }

    // Jika slug dengan prefix 'kelas-karyawan-' ada
    $kelasSlug = 'kelas-karyawan-' . $slug;
    if (News::where('permalink', $kelasSlug)->exists()) {
        return redirect("/$kelasSlug", 301);
    }

    // Jika slug.html ada
    $slugHtml = $slug . '.html';
    if (News::where('permalink', $slugHtml)->exists()) {
        return redirect("/$slugHtml", 301);
    }

    // Jika slug.htm ada
    $slugHtm = $slug . '.htm';
    if (News::where('permalink', $slugHtm)->exists()) {
        return redirect("/$slugHtm", 301);
    }

    // Jika semua tidak ditemukan, tetap redirect ke .htm
    return redirect("/$slug.htm", 301);
})->where('slug', '[A-Za-z0-9\-]+')->name('news.show');