<?php

/*
 * File ini bagian dari:
 *
 * OpenDK
 *
 * Aplikasi dan source code ini dirilis berdasarkan lisensi GPL V3
 *
 * Hak Cipta 2017 - 2025 Perkumpulan Desa Digital Terbuka (https://opendesa.id)
 *
 * Dengan ini diberikan izin, secara gratis, kepada siapa pun yang mendapatkan salinan
 * dari perangkat lunak ini dan file dokumentasi terkait ("Aplikasi Ini"), untuk diperlakukan
 * tanpa batasan, termasuk hak untuk menggunakan, menyalin, mengubah dan/atau mendistribusikan,
 * asal tunduk pada syarat berikut:
 *
 * Pemberitahuan hak cipta di atas dan pemberitahuan izin ini harus disertakan dalam
 * setiap salinan atau bagian penting Aplikasi Ini. Barang siapa yang menghapus atau menghilangkan
 * pemberitahuan ini melanggar ketentuan lisensi Aplikasi Ini.
 *
 * PERANGKAT LUNAK INI DISEDIAKAN "SEBAGAIMANA ADANYA", TANPA JAMINAN APA PUN, BAIK TERSURAT MAUPUN
 * TERSIRAT. PENULIS ATAU PEMEGANG HAK CIPTA SAMA SEKALI TIDAK BERTANGGUNG JAWAB ATAS KLAIM, KERUSAKAN ATAU
 * KEWAJIBAN APAPUN ATAS PENGGUNAAN ATAU LAINNYA TERKAIT APLIKASI INI.
 *
 * @package    OpenDK
 * @author     Tim Pengembang OpenDesa
 * @copyright  Hak Cipta 2017 - 2025 Perkumpulan Desa Digital Terbuka (https://opendesa.id)
 * @license    http://www.gnu.org/licenses/gpl.html    GPL V3
 * @link       https://github.com/OpenSID/opendk
 */

use App\Http\Controllers\Api\TokenController;
use App\Http\Controllers\BackEnd\ThemesController;
use App\Http\Controllers\Counter\CounterController;
use App\Http\Controllers\DashboardController;
use App\Http\Controllers\Data\ArsipController;
use App\Http\Controllers\FrontEnd\PageController;
use App\Http\Controllers\Installer\InstallerController;
use App\Http\Controllers\Kerjasama\PendaftaranKerjasamaController;
use App\Http\Controllers\LogViewerController;
use App\Http\Controllers\Role\RoleController;
use App\Http\Controllers\Setting\AplikasiController;
use App\Http\Controllers\Setting\COAController;
use App\Http\Controllers\Setting\JenisDokumenController;
use App\Http\Controllers\Setting\JenisPenyakitController;
use App\Http\Controllers\Setting\KategoriKomplainController;
use App\Http\Controllers\Setting\NavigationController;
use App\Http\Controllers\Setting\NavMenuController;
use App\Http\Controllers\Setting\PengaturanDatabaseController;
use App\Http\Controllers\Setting\SlideController;
use App\Http\Controllers\Setting\TipePotensiController;
use App\Http\Controllers\Setting\TipeRegulasiController;
use App\Http\Controllers\SitemapController;
use App\Http\Controllers\TestEmailController;
use App\Http\Controllers\User\UserController;
use App\Http\Livewire\Kerjasama\PendaftaranKerjasama;
use App\Http\Livewire\Widget\WidgetController;
use App\Models\DataDesa;
use App\Models\Penduduk;
use App\Models\User;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Cookie;
use Illuminate\Support\Facades\Route;
use UniSharp\LaravelFilemanager\Lfm;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
// Route untuk dokumentasi API
Route::get('/docs', function () {
    return view('swagger');
})->name('swagger');
// Custom Installer Routes (menggantikan rachidlaasri/laravel-installer)
// Menggunakan sintaks modern Laravel 13 — namespace string sudah dihapus di L10+
Route::prefix('install')->group(function () {
    Route::get('/', [InstallerController::class, 'welcome'])->name('installer.welcome');
    Route::get('/requirements', [InstallerController::class, 'requirements'])->name('installer.requirements');
    Route::get('/permissions', [InstallerController::class, 'permissions'])->name('installer.permissions');
    Route::get('/environment', [InstallerController::class, 'environment'])->name('installer.environment');
    Route::get('/environment/wizard', [InstallerController::class, 'environmentWizard'])->name('installer.environmentWizard');
    Route::get('/environment/classic', [InstallerController::class, 'environmentClassic'])->name('installer.environmentClassic');
    Route::post('/environment/saveWizard', [InstallerController::class, 'environmentSaveWizard'])->name('installer.environmentSaveWizard');
    Route::post('/environment/saveClassic', [InstallerController::class, 'environmentSaveClassic'])->name('installer.environmentSaveClassic');
    Route::get('/database', [InstallerController::class, 'database'])->name('installer.database');
    Route::get('/final', [InstallerController::class, 'final'])->name('installer.final');
    Route::post('/final', [InstallerController::class, 'performInstallation'])->name('installer.performInstallation');
});

// Pest Browser Testing — Quick login route (hanya untuk environment testing)
if (app()->environment('testing')) {
    Route::get('/_pest/login/{userId}', function ($userId) {
        $user = User::findOrFail($userId);
        Auth::login($user);

        return response('', 200);
    })->middleware('web')->name('pest.login');
}

// Redirect if apps not installed
Route::group(['middleware' => ['installed', 'xss_sanitization']], function () {
    Auth::routes([
        'register' => false,
    ]);

    // OTP Routes
    Route::namespace('\App\Http\Controllers\Auth')->middleware('otp.enabled')->group(function () {
        // OTP Activation (requires auth)
        Route::middleware('auth')->group(function () {
            // Redirect old individual activate page to unified page
            Route::get('/otp/activate', function () {
                return redirect()->route('otp2fa.index');
            })->name('otp.activate');
            Route::post('/otp/request-activation', 'OtpController@requestActivation')->name('otp.request-activation');
            Route::get('/otp/verify-activation', 'OtpController@showVerifyActivationForm')->name('otp.verify-activation');
            Route::post('/otp/verify-activation', 'OtpController@verifyActivation');
            Route::get('/otp/deactivate', 'OtpController@deactivate')->name('otp.deactivate');
        });

        // OTP Login (guest only)
        Route::middleware('guest')->group(function () {
            Route::get('/otp/login', 'OtpController@showLoginForm')->name('otp.login');
            Route::post('/otp/request-login', 'OtpController@requestLoginOtp')->name('otp.request-login');
            Route::get('/otp/verify-login', 'OtpController@showVerifyLoginForm')->name('otp.verify-login');
            Route::post('/otp/verify-login', 'OtpController@loginWithOtp');
        });

        // OTP Resend (both auth and guest)
        Route::post('/otp/resend', 'OtpController@resendOtp')->name('otp.resend');
    });

    // 2FA Routes
    Route::namespace('\App\Http\Controllers\Auth')->middleware('auth')->group(function () {
        // Combined OTP & 2FA management page
        Route::get('/otp-2fa', 'OtpController@index')->name('otp2fa.index');
        Route::get('/otp-2fa/settings', 'OtpController@showSettingsForm')->name('otp2fa.settings');
        Route::post('/otp-2fa/settings', 'OtpController@saveSettings')->name('2fa.save-settings');
        Route::get('/otp-2fa/verify-settings', 'OtpController@showVerifySettingsForm')->name('otp2fa.verify-settings');
        Route::post('/otp-2fa/verify-settings', 'OtpController@verifySettings')->name('otp2fa.verify-settings.post');

        // Redirect old 2fa activate page to unified page
        Route::get('/2fa/activate', function () {
            return redirect()->route('otp2fa.index');
        })->name('2fa.activate');

        Route::post('/2fa/request-activation', 'TwoFactorController@requestActivation')->name('2fa.request-activation');
        Route::get('/2fa/verify-activation', 'TwoFactorController@showVerifyActivationForm')->name('2fa.verify-activation');
        Route::post('/2fa/verify-activation', 'TwoFactorController@verifyActivation');
        Route::get('/2fa/deactivate', 'TwoFactorController@deactivate')->name('2fa.deactivate');
    });

    // Profile Routes (User Profile Management)
    Route::namespace('\App\Http\Controllers\Auth')->prefix('profile')->middleware('auth')->group(function () {
        Route::get('password', 'ProfileController@password')->name('profile.password');
        Route::post('password', 'ProfileController@updatePassword')
            ->middleware('throttle:5,1')
            ->name('profile.password.update');
    });

    // 2FA Login Routes (guest access)
    Route::namespace('\App\Http\Controllers\Auth')->middleware('guest')->group(function () {
        Route::get('/2fa/verify-login', 'TwoFactorController@showVerifyLoginForm')->name('2fa.verify-login');
        Route::post('/2fa/verify-login', 'TwoFactorController@verifyLogin');
    });

    Route::group(['prefix' => 'filemanager', 'middleware' => ['auth:web', 'action_permission:access.setting']], function () {
        Lfm::routes();
    });

    // Route::group(['middleware' => 'maintenance'], function () {
    Route::group(['middleware' => ['maintenance', 'track.visitors']], function () {
        /**
         * Group Routing for Halaman Website
         */
        Route::namespace('\App\Http\Controllers\FrontEnd')->group(function () {
            Route::get('/', 'PageController@index')->name('beranda');
            Route::get('berita-desa', 'PageController@beritaDesa')->name('berita-desa');
            Route::get('filter-berita-desa', 'PageController@filterFeeds')->name('filter-berita-desa');            

            /* route kategori */
            // Redirect dari /kategori ke halaman home secara permanent
            Route::redirect('kategori', '/', 301);
            // kategori artikel aka berita dengan slug
            Route::get('kategori/{slug}', 'PageController@kategori')->name('berita-kategori');

            Route::group(['prefix' => 'berita'], function () {
                Route::permanentRedirect('/', '/');
                Route::get('{slug}', 'PageController@detailBerita')->name('berita.detail');
                Route::get('/kategori/{slug}', 'PageController@kategoriBerita')->name('berita.kategori');
            });

            // Route untuk survei
            Route::get('/survei', [PageController::class, 'survei'])->name('survei.index');
            Route::post('/survei', [PageController::class, 'surveiSubmit'])->name('survei.submit');

            Route::group(['prefix' => 'publikasi'], function () {
                Route::get('galeri', 'PublikasiController@album')->name('publik.publikasi.album');
                Route::get('galeri/{slug}', 'PublikasiController@galeri')->name('publik.publikasi.galeri');
                Route::get('galeri/detail/{slug}', 'PublikasiController@galeri_detail')->name('publik.publikasi.galeri.detail');
            });

            // Rute untuk kirim dan balas komentar artikel
            Route::post('comments/store', [PageController::class, 'kirimKomentar'])->name('comments.store');
            Route::get('comments/modal', [PageController::class, 'modalKirimBalasan'])->name('comments.modal');
            Route::post('comments/reply', [PageController::class, 'kirimBalasan'])->name('comments.modal.store');

            Route::group(['prefix' => 'profil'], function () {
                Route::get('letak-geografis', 'ProfilController@LetakGeografis')->name('profil.letak-geografis');
                Route::get('struktur-pemerintahan', 'ProfilController@StrukturPemerintahan')->name('profil.struktur-pemerintahan');
                Route::get('visi-dan-misi', 'ProfilController@VisiMisi')->name('profil.visi-misi');
                Route::get('visi-misi', 'ProfilController@VisiMisi')->name('profil.visi-misi');
                Route::get('tipologi', 'ProfilController@tipologi')->name('profil.tipologi');
                Route::get('sejarah', 'ProfilController@sejarah')->name('profil.sejarah');
                Route::get('sambutan', 'ProfilController@Sambutan')->name('profil.sambutan');
                Route::get('struktur-organisasi', 'ProfilController@StrukturOrganisasi')->name('profil.struktur-organisasi');
                Route::get('struktur-organisasi-ajax', 'ProfilController@ajaxBaganPublic')->name('profil.struktur-organisasi-ajax');
            });

            Route::group(['prefix' => 'event'], function () {
                Route::permanentRedirect('/', '/');
                Route::get('{slug}', 'PageController@eventDetail')->name('event.detail');
            });

            Route::group(['prefix' => 'desa'], function () {
                Route::permanentRedirect('/', '/');
                Route::get('desa-{slug}', 'PageController@DesaShow')->name('desa.show');
            });

            Route::group(['prefix' => 'potensi'], function () {
                Route::permanentRedirect('/', '/');
                Route::get('{slug}', 'PageController@PotensiByKategory')->name('potensi.kategori');
                Route::get('{kategori}/{slug}', 'PageController@PotensiShow')->name('potensi.kategori.show');
            });

            Route::any('refresh-captcha', 'PageController@refresh_captcha')->name('refresh-captcha');

            Route::group(['prefix' => 'statistik'], function () {
                Route::get('kependudukan', 'KependudukanController@showKependudukan')->name('statistik.kependudukan');
                Route::get('show-kependudukan', 'KependudukanController@showKependudukanPartial')->name('statistik.show-kependudukan');

                Route::get('pendidikan', 'PendidikanController@showPendidikan')->name('statistik.pendidikan');

                Route::get('program-dan-bantuan', 'ProgramBantuanController@showProgramBantuan')->name('statistik.program-bantuan');

                Route::get('anggaran-dan-realisasi', 'AnggaranRealisasiController@showAnggaranDanRealisasi')->name('statistik.anggaran-dan-realisasi');

                Route::get('anggaran-desa', 'AnggaranDesaController@showAnggaranDesa')->name('statistik.anggaran-desa');

                Route::get('kesehatan', 'KesehatanController@showKesehatan')->name('statistik.kesehatan');
            });

            Route::group(['prefix' => 'unduhan'], function () {
                Route::permanentRedirect('/', '/');

                Route::group(['prefix' => 'prosedur'], function () {
                    Route::permanentRedirect('/', '/');
                    Route::get('/', 'DownloadController@indexProsedur')->name('unduhan.prosedur');
                    Route::get('{file}/download', 'DownloadController@downloadProsedur')->name('unduhan.prosedur.download');
                });

                Route::group(['prefix' => 'regulasi'], function () {
                    Route::permanentRedirect('/', '/');
                    Route::get('/', 'DownloadController@indexRegulasi')->name('unduhan.regulasi');
                    Route::get('{file}/download', 'DownloadController@downloadRegulasi')->name('unduhan.regulasi.download');
                });

                Route::group(['prefix' => 'form-dokumen'], function () {
                    Route::permanentRedirect('/', '/');
                    Route::get('/', 'DownloadController@indexFormDokumen')->name('unduhan.form-dokumen');
                    Route::get('getdata', 'DownloadController@getDataDokumen')->name('unduhan.form-dokumen.getdata');
                    Route::get('unduh/{file}', 'DownloadController@downloadDokumen')->name('unduhan.form-dokumen.download');
                    Route::get('/jenis-dokumen/{slug}', 'DownloadController@indexJenisDokumen')->name('unduhan.form-dokumen.jenis-dokumen');
                    Route::get('getData/jenis-dokumen/{slug}', 'DownloadController@getDataByJenisDokumen')->name('unduhan.form-dokumen.getdatabyjenisdokumen');
                });
            });

            Route::get('faq', 'WebFaqController@index')->name('faq');

            Route::group(['prefix' => 'sistem-komplain'], function () {
                Route::get('/', ['as' => 'sistem-komplain.index', 'uses' => 'SistemKomplainController@index']);
                Route::get('kirim', ['as' => 'sistem-komplain.kirim', 'uses' => 'SistemKomplainController@kirim']);
                Route::post('store', ['as' => 'sistem-komplain.store', 'uses' => 'SistemKomplainController@store']);
                Route::get('komplain/{slug}', ['as' => 'sistem-komplain.komplain', 'uses' => 'SistemKomplainController@show']);
                Route::get('komplain/kategori/{slug}', ['as' => 'sistem-komplain.kategori', 'uses' => 'SistemKomplainController@indexKategori']);
                Route::get('komplain-sukses', ['as' => 'sistem-komplain.komplain-sukses', 'uses' => 'SistemKomplainController@indexSukses']);
                Route::post('tracking', ['as' => 'sistem-komplain.tracking', 'uses' => 'SistemKomplainController@tracking']);
                Route::post('reply/{id}', ['as' => 'sistem-komplain.reply', 'uses' => 'SistemKomplainController@reply']);
                Route::get('jawabans', ['as' => 'sistem-komplain.jawabans', 'uses' => 'SistemKomplainController@getJawabans']);
            });
        });
    });

    /**
     * Group Routing for Halaman Dahsboard
     */
    Route::group(['middleware' => ['auth:web', 'complete_profile']], function () {
        // Route::get('logout', ['as' => 'logout', 'uses' => 'Auth\AuthController@logout']);

        Route::get('/dashboard', DashboardController::class)->middleware(['auth:web', 'action_permission:access.dashboard'])->name('dashboard');

        Route::namespace('\App\Http\Controllers\Auth')->group(function () {
            Route::group(['prefix' => 'changedefault'], function () {
                Route::get('/', 'ChangeDefaultController@index')->name('change-default');
                Route::post('store', ['as' => 'changedefault.store', 'uses' => 'ChangeDefaultController@store']);
            });
        });

        /**
         * Group Routing for Informasi
         */
        Route::namespace('\App\Http\Controllers\BackEnd')->group(function () {
            Route::group(['prefix' => 'informasi', 'middleware' => ['action_permission:access.informasi']], function () {
                // Event
                Route::group(['prefix' => 'event', 'middleware' => ['action_permission:access.informasi.event']], function () {
                    Route::get('/', ['as' => 'informasi.event.index', 'uses' => 'EventController@index']);
                    Route::get('getdata', ['as' => 'informasi.event.getdata', 'uses' => 'EventController@datatables']);
                    Route::get('create', ['as' => 'informasi.event.create', 'uses' => 'EventController@create']);
                    Route::post('store', ['as' => 'informasi.event.store', 'uses' => 'EventController@store']);
                    Route::get('edit/{event}', ['as' => 'informasi.event.edit', 'uses' => 'EventController@edit']);
                    Route::put('update/{event}', ['as' => 'informasi.event.update', 'uses' => 'EventController@update']);
                    Route::delete('destroy/{event}', ['as' => 'informasi.event.destroy', 'uses' => 'EventController@destroy']);
                    Route::get('download/{event}', ['as' => 'informasi.event.download', 'uses' => 'EventController@download']);
                    Route::get('preview/{event}', ['as' => 'informasi.event.preview', 'uses' => 'EventController@preview']);
                });
            });
        });
        /**
         * Group Routing for Informasi
         */
        Route::namespace('\App\Http\Controllers\Informasi')->group(function () {
            Route::group(['prefix' => 'informasi', 'middleware' => ['action_permission:access.informasi']], function () {
                // Prosedur
                Route::group(['prefix' => 'prosedur', 'middleware' => ['action_permission:access.informasi.prosedur']], function () {
                    Route::get('/', ['as' => 'informasi.prosedur.index', 'uses' => 'ProsedurController@index']);
                    Route::get('show/{prosedur}', ['as' => 'informasi.prosedur.show', 'uses' => 'ProsedurController@show']);
                    Route::get('getdata', ['as' => 'informasi.prosedur.getdata', 'uses' => 'ProsedurController@getDataProsedur']);
                    Route::get('create', ['as' => 'informasi.prosedur.create', 'uses' => 'ProsedurController@create']);
                    Route::post('store', ['as' => 'informasi.prosedur.store', 'uses' => 'ProsedurController@store']);
                    Route::get('edit/{prosedur}', ['as' => 'informasi.prosedur.edit', 'uses' => 'ProsedurController@edit']);
                    Route::put('update/{prosedur}', ['as' => 'informasi.prosedur.update', 'uses' => 'ProsedurController@update']);
                    Route::delete('destroy/{prosedur}', ['as' => 'informasi.prosedur.destroy', 'uses' => 'ProsedurController@destroy']);
                    Route::get('download/{prosedur}', ['as' => 'informasi.prosedur.download', 'uses' => 'ProsedurController@download']);
                    Route::get('preview/{prosedur}', ['as' => 'informasi.prosedur.preview', 'uses' => 'ProsedurController@preview']);
                });

                // Regulasi
                Route::group(['prefix' => 'regulasi', 'middleware' => ['action_permission:access.informasi.regulasi']], function () {
                    Route::get('/', ['as' => 'informasi.regulasi.index', 'uses' => 'RegulasiController@index']);
                    Route::get('show/{regulasi}', ['as' => 'informasi.regulasi.show', 'uses' => 'RegulasiController@show']);
                    Route::get('getdata', ['as' => 'informasi.regulasi.getdata', 'uses' => 'RegulasiController@getDataRegulasi']);
                    Route::get('create', ['as' => 'informasi.regulasi.create', 'uses' => 'RegulasiController@create']);
                    Route::post('store', ['as' => 'informasi.regulasi.store', 'uses' => 'RegulasiController@store']);
                    Route::get('edit/{regulasi}', ['as' => 'informasi.regulasi.edit', 'uses' => 'RegulasiController@edit']);
                    Route::put('update/{regulasi}', ['as' => 'informasi.regulasi.update', 'uses' => 'RegulasiController@update']);
                    Route::delete('destroy/{regulasi}', ['as' => 'informasi.regulasi.destroy', 'uses' => 'RegulasiController@destroy']);
                    Route::get('download/{regulasi}', ['as' => 'informasi.regulasi.download', 'uses' => 'RegulasiController@download']);
                });

                // FAQ
                Route::prefix('faq')->middleware(['action_permission:access.informasi.faq'])->withoutMiddleware('xss_sanitization')->group(function () {
                    Route::get('/', ['as' => 'informasi.faq.index', 'uses' => 'FaqController@index']);
                    Route::get('getdata', ['as' => 'informasi.faq.getdata', 'uses' => 'FaqController@getDataFaq']);
                    Route::get('show/{id}', ['as' => 'informasi.faq.show', 'uses' => 'FaqController@show']);
                    Route::get('create', ['as' => 'informasi.faq.create', 'uses' => 'FaqController@create']);
                    Route::post('store', ['as' => 'informasi.faq.store', 'uses' => 'FaqController@store']);
                    Route::get('edit/{id}', ['as' => 'informasi.faq.edit', 'uses' => 'FaqController@edit']);
                    Route::post('update/{id}', ['as' => 'informasi.faq.update', 'uses' => 'FaqController@update']);
                    Route::delete('destroy/{id}', ['as' => 'informasi.faq.destroy', 'uses' => 'FaqController@destroy']);
                });

                // Artikel
                Route::prefix('artikel')->middleware(['action_permission:access.informasi.artikel'])->withoutMiddleware('xss_sanitization')->group(function () {
                    Route::get('/', ['as' => 'informasi.artikel.index', 'uses' => 'ArtikelController@index']);
                    Route::get('create', ['as' => 'informasi.artikel.create', 'uses' => 'ArtikelController@create']);
                    Route::post('store', ['as' => 'informasi.artikel.store', 'uses' => 'ArtikelController@store']);
                    Route::get('edit/{artikel}', ['as' => 'informasi.artikel.edit', 'uses' => 'ArtikelController@edit']);
                    Route::post('update/{artikel}', ['as' => 'informasi.artikel.update', 'uses' => 'ArtikelController@update']);
                    Route::delete('destroy/{artikel}', ['as' => 'informasi.artikel.destroy', 'uses' => 'ArtikelController@destroy']);
                    Route::post('getdata', ['as' => 'informasi.artikel.getdata', 'uses' => 'ArtikelController@getDataArtikel']);
                });

                // Route Artikel Kategori
                Route::group(['prefix' => 'kategori', 'middleware' => ['action_permission:access.informasi.artikel_kategori']], function () {
                    Route::get('/', 'ArtikelKategoriController@index')->name('informasi.artikel-kategori.index');
                    Route::get('getdata', 'ArtikelKategoriController@getDataKategori')->name('informasi.artikel-kategori.getdata');
                    Route::get('create', 'ArtikelKategoriController@create')->name('informasi.artikel-kategori.create');
                    Route::post('store', 'ArtikelKategoriController@store')->name('informasi.artikel-kategori.store');
                    Route::get('edit/{id}', 'ArtikelKategoriController@edit')->name('informasi.artikel-kategori.edit');
                    Route::put('update/{id}', 'ArtikelKategoriController@update')->name('informasi.artikel-kategori.update');
                    Route::delete('destroy/{id}', 'ArtikelKategoriController@destroy')->name('informasi.artikel-kategori.destroy');
                });

                // Komentar Artikel
                Route::prefix('komentar-artikel')->middleware(['action_permission:access.informasi.komentar_artikel'])->withoutMiddleware('xss_sanitization')->group(function () {
                    Route::get('/', ['as' => 'informasi.komentar-artikel.index', 'uses' => 'KomentarArtikelController@index']);
                    Route::get('getdata', ['as' => 'informasi.komentar-artikel.getdata', 'uses' => 'KomentarArtikelController@getDataKomentar']);
                    Route::post('update-status', ['as' => 'informasi.komentar-artikel.updateStatus', 'uses' => 'KomentarArtikelController@updateStatus']);
                    Route::delete('destroy/{id}', ['as' => 'informasi.komentar-artikel.destroy', 'uses' => 'KomentarArtikelController@destroy']);
                });

                // Form Dokumen
                Route::group(['prefix' => 'form-dokumen', 'middleware' => ['action_permission:access.informasi.form_dokumen']], function () {
                    Route::get('/', ['as' => 'informasi.form-dokumen.index', 'uses' => 'FormDokumenController@index']);
                    Route::get('show/{dokumen}', ['as' => 'informasi.form-dokumen.show', 'uses' => 'FormDokumenController@show']);
                    Route::get('create', ['as' => 'informasi.form-dokumen.create', 'uses' => 'FormDokumenController@create']);
                    Route::get('getdata', ['as' => 'informasi.form-dokumen.getdata', 'uses' => 'FormDokumenController@getDataDokumen']);
                    Route::post('store', ['as' => 'informasi.form-dokumen.store', 'uses' => 'FormDokumenController@store']);
                    Route::get('edit/{dokumen}', ['as' => 'informasi.form-dokumen.edit', 'uses' => 'FormDokumenController@edit']);
                    Route::put('update/{dokumen}', ['as' => 'informasi.form-dokumen.update', 'uses' => 'FormDokumenController@update']);
                    Route::delete('destroy/{dokumen}', ['as' => 'informasi.form-dokumen.destroy', 'uses' => 'FormDokumenController@destroy']);
                    Route::get('download/{dokumen}', ['as' => 'informasi.form-dokumen.download', 'uses' => 'FormDokumenController@download']);
                });

                // Potensi
                Route::group(['prefix' => 'potensi', 'middleware' => ['action_permission:access.informasi.potensi']], function () {
                    Route::get('/', ['as' => 'informasi.potensi.index', 'uses' => 'PotensiController@index']);
                    Route::get('show/{potensi}', ['as' => 'informasi.potensi.show', 'uses' => 'PotensiController@show']);
                    Route::get('getdata', ['as' => 'informasi.potensi.getdata', 'uses' => 'PotensiController@getDataPotensi']);
                    Route::get('create', ['as' => 'informasi.potensi.create', 'uses' => 'PotensiController@create']);
                    Route::post('store', ['as' => 'informasi.potensi.store', 'uses' => 'PotensiController@store']);
                    Route::get('edit/{potensi}', ['as' => 'informasi.potensi.edit', 'uses' => 'PotensiController@edit']);
                    Route::put('update/{potensi}', ['as' => 'informasi.potensi.update', 'uses' => 'PotensiController@update']);
                    Route::delete('destroy/{potensi}', ['as' => 'informasi.potensi.destroy', 'uses' => 'PotensiController@destroy']);
                    Route::get('download/{potensi}', ['as' => 'informasi.potensi.download', 'uses' => 'PotensiController@download']);
                    Route::get('kategori', ['as' => 'informasi.potensi.kategori', 'uses' => 'PotensiController@kategori']);
                });

                // Media Sosial
                Route::group(['prefix' => 'media-sosial', 'middleware' => ['action_permission:access.informasi.media_sosial']], function () {
                    Route::get('/', ['as' => 'informasi.media-sosial.index', 'uses' => 'MediaSosialController@index']);
                    Route::get('getdata', ['as' => 'informasi.media-sosial.getdata', 'uses' => 'MediaSosialController@getDataMediaSosial']);
                    Route::get('show/{medsos}', ['as' => 'informasi.media-sosial.show', 'uses' => 'MediaSosialController@show']);
                    Route::get('create', ['as' => 'informasi.media-sosial.create', 'uses' => 'MediaSosialController@create']);
                    Route::post('store', ['as' => 'informasi.media-sosial.store', 'uses' => 'MediaSosialController@store']);
                    Route::get('edit/{medsos}', ['as' => 'informasi.media-sosial.edit', 'uses' => 'MediaSosialController@edit']);
                    Route::put('update/{medsos}', ['as' => 'informasi.media-sosial.update', 'uses' => 'MediaSosialController@update']);
                    Route::delete('destroy/{medsos}', ['as' => 'informasi.media-sosial.destroy', 'uses' => 'MediaSosialController@destroy']);
                });

                // Sinergi Program
                Route::group(['prefix' => 'sinergi-program', 'middleware' => ['action_permission:access.informasi.sinergi_program']], function () {
                    Route::get('/', ['as' => 'informasi.sinergi-program.index', 'uses' => 'SinergiProgramController@index']);
                    Route::get('getdata', ['as' => 'informasi.sinergi-program.getdata', 'uses' => 'SinergiProgramController@getDataSinergiProgram']);
                    Route::get('show/{sinergi}', ['as' => 'informasi.sinergi-program.show', 'uses' => 'SinergiProgramController@show']);
                    Route::get('create', ['as' => 'informasi.sinergi-program.create', 'uses' => 'SinergiProgramController@create']);
                    Route::post('store', ['as' => 'informasi.sinergi-program.store', 'uses' => 'SinergiProgramController@store']);
                    Route::put('status/{sinergi}', ['as' => 'informasi.sinergi-program.status', 'uses' => 'SinergiProgramController@status']);
                    Route::get('edit/{sinergi}', ['as' => 'informasi.sinergi-program.edit', 'uses' => 'SinergiProgramController@edit']);
                    Route::put('update/{sinergi}', ['as' => 'informasi.sinergi-program.update', 'uses' => 'SinergiProgramController@update']);
                    Route::delete('destroy/{sinergi}', ['as' => 'informasi.sinergi-program.destroy', 'uses' => 'SinergiProgramController@destroy']);
                    Route::get('urut/{sinergi}/{arah}', ['as' => 'informasi.sinergi-program.urut', 'uses' => 'SinergiProgramController@urut']);
                });
            });
        });

        /**
         * Group Routing for Publikasi
         */
        Route::namespace('\App\Http\Controllers\Publikasi')->group(function () {
            Route::group(['prefix' => 'admin/publikasi', 'middleware' => ['action_permission:access.publikasi']], function () {
                // Album
                Route::group(['prefix' => 'album', 'middleware' => ['action_permission:access.publikasi.album']], function () {
                    Route::get('/', ['as' => 'publikasi.album.index', 'uses' => 'AlbumController@index']);
                    Route::get('create', ['as' => 'publikasi.album.create', 'uses' => 'AlbumController@create']);
                    Route::get('getdata', ['as' => 'publikasi.album.getdata', 'uses' => 'AlbumController@getDataAlbum']);
                    Route::post('store', ['as' => 'publikasi.album.store', 'uses' => 'AlbumController@store']);
                    Route::put('status/{album}', ['as' => 'publikasi.album.status', 'uses' => 'AlbumController@status']);
                    Route::put('show/{album}', ['as' => 'publikasi.album.show', 'uses' => 'AlbumController@show']);
                    Route::get('edit/{album}', ['as' => 'publikasi.album.edit', 'uses' => 'AlbumController@edit']);
                    Route::put('update/{album}', ['as' => 'publikasi.album.update', 'uses' => 'AlbumController@update']);
                    Route::delete('destroy/{album}', ['as' => 'publikasi.album.destroy', 'uses' => 'AlbumController@destroy']);
                });

                // Galeri
                Route::group(['prefix' => 'galeri', 'middleware' => ['action_permission:access.publikasi.galeri']], function () {
                    Route::get('create', ['as' => 'publikasi.galeri.create', 'uses' => 'GaleriController@create']);
                    Route::post('store', ['as' => 'publikasi.galeri.store', 'uses' => 'GaleriController@store']);
                    Route::get('/{album}', ['as' => 'publikasi.galeri.index', 'uses' => 'GaleriController@index']);
                    Route::get(
                        'getdata/{album}',
                        ['as' => 'publikasi.galeri.getdata', 'uses' => 'GaleriController@getDatagaleri']
                    );
                    Route::put('status/{galeri}', ['as' => 'publikasi.galeri.status', 'uses' => 'GaleriController@status']);
                    Route::get('edit/{galeri}', ['as' => 'publikasi.galeri.edit', 'uses' => 'GaleriController@edit']);
                    Route::put('update/{galeri}', ['as' => 'publikasi.galeri.update', 'uses' => 'GaleriController@update']);
                    Route::delete('destroy/{galeri}', ['as' => 'publikasi.galeri.destroy', 'uses' => 'GaleriController@destroy']);
                });
            });
        });

        Route::group(['prefix' => 'kerjasama', 'middleware' => ['action_permission:access.kerjasama']], function () {
            Route::get('/pendaftaran-kerjasama', PendaftaranKerjasama::class)->name('kerjasama.pendaftaran.kerjasama');
            Route::get('/template', [PendaftaranKerjasamaController::class, 'dokumen_template'])->name('kerjasama.pendaftaran.kerjasama.template');
        });

        // Media Terkait (Livewire)
        Route::group(['prefix' => 'informasi', 'middleware' => ['action_permission:access.informasi.media_terkait']], function () {
            Route::get('/media-terkait', '\App\Http\Livewire\Informasi\MediaTerkaitController')->name('informasi.media.terkait');
        });

        /**
         * Group Routing for Data
         */
        Route::namespace('\App\Http\Controllers\Data')->group(function () {
            Route::group(['prefix' => 'data', 'middleware' => ['action_permission:access.data']], function () {
                // Profil
                Route::prefix('profil')->middleware(['action_permission:access.data.profil'])->withoutMiddleware(['complete_profile', 'xss_sanitization'])->group(function () {
                    Route::get('/', ['as' => 'data.profil.index', 'uses' => 'ProfilController@index']);
                    Route::put('update/{id}', ['as' => 'data.profil.update', 'uses' => 'ProfilController@update']);
                    Route::get('success/{id}', ['as' => 'data.profil.success', 'uses' => 'ProfilController@success']);
                });

                // pendaftaran kerjasama
                // Route::prefix('pendaftaran-kerjasama')->middleware(['role:super-admin|admin-kecamatan'])->withoutMiddleware('xss_sanitization')->group(function () {

                //     Route::get('/', ['as' => 'data.pendaftaran.kerjasama', 'uses' => 'PendaftaranKerjasamaController@index']);

                //     Route::get('/terdaftar', ['as' => 'data.pendaftaran.kerjasama.terdaftar', 'uses' => 'PendaftaranKerjasamaController@terdaftar']);
                //     Route::get('/form', ['as' => 'data.pendaftaran.kerjasama.form', 'uses' => 'PendaftaranKerjasamaController@form']);
                //     Route::get('/dokumen_template', ['as' => 'data.pendaftaran.kerjasama.dokumen_template', 'uses' => 'PendaftaranKerjasamaController@dokumen_template']);
                //     Route::post('/register', ['as' => 'data.pendaftaran.kerjasama.register', 'uses' => 'PendaftaranKerjasamaController@register']);
                // });

                // Data Umum
                Route::prefix('data-umum')->middleware(['action_permission:access.data.data_umum'])->withoutMiddleware('xss_sanitization')->group(function () {
                    Route::get('/', ['as' => 'data.data-umum.index', 'uses' => 'DataUmumController@index']);
                    Route::get('getdataajax', ['as' => 'data.data-umum.getdataajax', 'uses' => 'DataUmumController@getDataUmumAjax']);
                    Route::put('update/{id}', ['as' => 'data.data-umum.update', 'uses' => 'DataUmumController@update']);
                    Route::get('resetpeta/{id}', ['as' => 'data.data-umum.resetpeta', 'uses' => 'DataUmumController@resetPeta']);
                });

                // Data Desa
                Route::group(['prefix' => 'data-desa', 'middleware' => ['action_permission:access.data.data_desa']], function () {
                    Route::put('update/{id}', ['as' => 'data.data-desa.update', 'uses' => 'DataDesaController@update']);
                    Route::get('/', ['as' => 'data.data-desa.index', 'uses' => 'DataDesaController@index']);
                    Route::match(['GET', 'POST'], 'getdata', ['as' => 'data.data-desa.getdata', 'uses' => 'DataDesaController@getDataDesa']);
                    Route::get('getdata/ajax', ['as' => 'data.data-desa.getdataajax', 'uses' => 'DataDesaController@getDataDesaAjax']);
                    Route::post('getdesa', ['as' => 'data.data-desa.getdesa', 'uses' => 'DataDesaController@getDesaKecamatan']);
                    Route::get('peta/{id}', ['as' => 'data.data-desa.peta', 'uses' => 'DataDesaController@peta']);
                    Route::get('create', ['as' => 'data.data-desa.create', 'uses' => 'DataDesaController@create']);
                    Route::post('store', ['as' => 'data.data-desa.store', 'uses' => 'DataDesaController@store']);
                    Route::get('edit/{id}', ['as' => 'data.data-desa.edit', 'uses' => 'DataDesaController@edit']);
                    Route::delete('destroy/{id}', ['as' => 'data.data-desa.destroy', 'uses' => 'DataDesaController@destroy']);
                    Route::get('export-excel', ['as' => 'data.data-desa.export-excel', 'uses' => 'DataDesaController@exportExcel']);
                });

                // Data Sarana
                Route::prefix('data-sarana')->middleware(['action_permission:access.data.data_sarana'])->withoutMiddleware('xss_sanitization')->group(function () {
                    Route::get('/', ['as' => 'data.data-sarana.index', 'uses' => 'DataSaranaController@index']);
                    Route::match(['GET', 'POST'], 'getdata', ['as' => 'data.data-sarana.getdata', 'uses' => 'DataSaranaController@getData']);
                    Route::get('create', ['as' => 'data.data-sarana.create', 'uses' => 'DataSaranaController@create']);
                    Route::post('store', ['as' => 'data.data-sarana.store', 'uses' => 'DataSaranaController@store']);
                    Route::get('edit/{id}', ['as' => 'data.data-sarana.edit', 'uses' => 'DataSaranaController@edit']);
                    Route::put('update/{id}', ['as' => 'data.data-sarana.update', 'uses' => 'DataSaranaController@update']);
                    Route::delete('destroy/{id}', ['as' => 'data.data-sarana.destroy', 'uses' => 'DataSaranaController@destroy']);
                    Route::get('import', ['as' => 'data.data-sarana.import', 'uses' => 'DataSaranaController@import']);
                    Route::post('import-excel', ['as' => 'data.data-sarana.import-excel', 'uses' => 'DataSaranaController@importExcel']);
                });

                // Jabatan
                Route::resource('jabatan', 'JabatanController', ['as' => 'data'])->middleware(['action_permission:access.data.jabatan'])->except(['show']);
                Route::post('jabatan/getdata', ['as' => 'data.jabatan.getdata.post', 'uses' => 'JabatanController@index'])->middleware(['action_permission:access.data.jabatan']);

                // Pengurus
                Route::post('pengurus/lock/{id}/{status}', ['as' => 'data.pengurus.lock', 'uses' => 'PengurusController@lock'])->middleware(['action_permission:access.data.pengurus']);
                Route::post('pengurus/getdata', ['as' => 'data.pengurus.getdata.post', 'uses' => 'PengurusController@index'])->middleware(['action_permission:access.data.pengurus']);
                Route::resource('pengurus', 'PengurusController', ['as' => 'data'])->middleware(['action_permission:access.data.pengurus'])->except(['show']);
                Route::get('pengurus/bagan', ['as' => 'data.pengurus.bagan', 'uses' => 'PengurusController@bagan'])->middleware(['action_permission:access.data.pengurus']);
                Route::get('pengurus/ajax-bagan', ['as' => 'data.pengurus.ajax-bagan', 'uses' => 'PengurusController@ajaxBagan'])->middleware(['action_permission:access.data.pengurus']);

                // Arsip
                Route::get('pengurus/arsip', [ArsipController::class, 'arsip'])->middleware(['action_permission:access.data.pengurus'])->name('data.pengurus.arsip');
                Route::get('pengurus/create/arsip/{pengurus_id}', [ArsipController::class, 'create_arsip'])->middleware(['action_permission:access.data.pengurus'])->name('data.pengurus.create.arsip');
                Route::post('pengurus/store/arsip', [ArsipController::class, 'storeArsip'])->middleware(['action_permission:access.data.pengurus'])->name('data.pengurus.store.arsip');
                Route::get('pengurus/penduduk/arsip/{id}', [ArsipController::class, 'pendudukArsip'])->middleware(['action_permission:access.data.pengurus'])->name('data.pengurus.penduduk.arsip');
                Route::delete('pengurus/penduduk/delete/{id}', [ArsipController::class, 'deleteDocument'])->middleware(['action_permission:access.data.pengurus'])->name('data.pengurus.delete.document');
                Route::get('pengurus/penduduk/edit/{document_id}/{pengurus_id}', [ArsipController::class, 'editArsip'])->middleware(['action_permission:access.data.pengurus'])->name('data.pengurus.edit.document');
                Route::get('download-arsip-zip/{pengurus_id}', [ArsipController::class, 'downloadArsipZip'])->middleware(['action_permission:access.data.pengurus'])->name('data.pengurus.edit.download.arsip.zip');
                Route::get('download-arsip/{document_id}', [ArsipController::class, 'downloadArsip'])->middleware(['action_permission:access.data.pengurus'])->name('data.pengurus.edit.download.arsip');
                Route::get('penduduk-select2', [ArsipController::class, 'pendudukSelect2'])->middleware(['action_permission:access.data.pengurus'])->name('data.pengurus.penduduk.select2');

                // Penduduk
                Route::group(['prefix' => 'penduduk', 'middleware' => ['action_permission:access.data.penduduk']], function () {
                    Route::get('/', ['as' => 'data.penduduk.index', 'uses' => 'PendudukController@index']);
                    Route::match(['GET', 'POST'], 'getdata', ['as' => 'data.penduduk.getdata', 'uses' => 'PendudukController@getPenduduk']);
                    Route::get('show/{id}', ['as' => 'data.penduduk.show', 'uses' => 'PendudukController@show']);
                    Route::get('import', ['as' => 'data.penduduk.import', 'uses' => 'PendudukController@import']);
                    Route::post('import-excel', ['as' => 'data.penduduk.import-excel', 'uses' => 'PendudukController@importExcel']);
                    Route::get('export-excel', ['as' => 'data.penduduk.export-excel', 'uses' => 'PendudukController@exportExcel']);
                    Route::get('detail', ['as' => 'data.penduduk.detail', 'uses' => 'PendudukController@detail']);
                });

                // Keluarga
                Route::group(['prefix' => 'keluarga', 'middleware' => ['action_permission:access.data.keluarga']], function () {
                    Route::get('/', ['as' => 'data.keluarga.index', 'uses' => 'KeluargaController@index']);
                    Route::match(['GET', 'POST'], 'getdata', ['as' => 'data.keluarga.getdata', 'uses' => 'KeluargaController@getKeluarga']);
                    Route::get('show/{id}', ['as' => 'data.keluarga.show', 'uses' => 'KeluargaController@show']);
                    Route::get('export-excel', ['as' => 'data.keluarga.export-excel', 'uses' => 'KeluargaController@exportExcel']);
                });

                // Data Suplemen
                Route::group(['prefix' => 'data-suplemen', 'middleware' => ['action_permission:access.data.data_suplemen']], function () {
                    Route::get('/', ['as' => 'data.data-suplemen.index', 'uses' => 'SuplemenController@index']);
                    Route::match(['GET', 'POST'], 'getdata', ['as' => 'data.data-suplemen.getdata', 'uses' => 'SuplemenController@getDataSuplemen']);
                    // Route::match(['GET', 'POST'], 'getsuplementerdata', ['as' => 'data.data-suplemen.getsuplementerdata', 'uses' => 'SuplemenController@getDataSuplemenTerdata']);
                    Route::get('show/{id}', ['as' => 'data.data-suplemen.show', 'uses' => 'SuplemenController@show']);
                    Route::get('create', ['as' => 'data.data-suplemen.create', 'uses' => 'SuplemenController@create']);
                    Route::post('store', ['as' => 'data.data-suplemen.store', 'uses' => 'SuplemenController@store']);
                    Route::get('edit/{id}', ['as' => 'data.data-suplemen.edit', 'uses' => 'SuplemenController@edit']);
                    Route::put('update/{id}', ['as' => 'data.data-suplemen.update', 'uses' => 'SuplemenController@update']);
                    Route::delete('destroy/{id}', ['as' => 'data.data-suplemen.destroy', 'uses' => 'SuplemenController@destroy']);
                    Route::match(['GET', 'POST'], 'getsuplementerdata/{id_suplemen}', ['as' => 'data.data-suplemen.getsuplementerdata', 'uses' => 'SuplemenController@getDataSuplemenTerdata']);
                    Route::get('createdetail/{id_suplemen}', ['as' => 'data.data-suplemen.createdetail', 'uses' => 'SuplemenController@createDetail']);
                    Route::get('getpenduduk/{id_desa}/{id_suplemen}', ['as' => 'data.data-suplemen.getpenduduk', 'uses' => 'SuplemenController@getPenduduk']);
                    Route::post('storedetail', ['as' => 'data.data-suplemen.storedetail', 'uses' => 'SuplemenController@storeDetail']);
                    Route::get('editdetail/{id}/{id_suplemen}', ['as' => 'data.data-suplemen.editdetail', 'uses' => 'SuplemenController@editDetail']);
                    Route::put('updatedetail/{id}', ['as' => 'data.data-suplemen.updatedetail', 'uses' => 'SuplemenController@updateDetail']);
                    Route::delete('destroydetail/{id}/{id_suplemen}', ['as' => 'data.data-suplemen.destroydetail', 'uses' => 'SuplemenController@destroyDetail']);
                    Route::get('export-excel', ['as' => 'data.data-suplemen.export-excel', 'uses' => 'SuplemenController@exportExcel']);
                    Route::get('export-terdata-excel/{id}', ['as' => 'data.data-suplemen.export-terdata-excel', 'uses' => 'SuplemenController@exportTerdataExcel']);
                });

                // Laporan Penduduk
                Route::group(['prefix' => 'laporan-penduduk', 'middleware' => ['action_permission:access.data.laporan_penduduk']], function () {
                    Route::get('/', ['as' => 'data.laporan-penduduk.index', 'uses' => 'LaporanPendudukController@index']);
                    Route::match(['GET', 'POST'], 'getdata', ['as' => 'data.laporan-penduduk.getdata', 'uses' => 'LaporanPendudukController@getData']);
                    Route::delete('destroy/{id}', ['as' => 'data.laporan-penduduk.destroy', 'uses' => 'LaporanPendudukController@destroy']);
                    Route::get('download/{id}', ['as' => 'data.laporan-penduduk.download', 'uses' => 'LaporanPendudukController@download']);
                    Route::get('import', ['as' => 'data.laporan-penduduk.import', 'uses' => 'LaporanPendudukController@import']);
                    Route::post('do_import', ['as' => 'data.laporan-penduduk.do_import', 'uses' => 'LaporanPendudukController@do_import']);
                    Route::get('export-excel', ['as' => 'data.laporan-penduduk.export-excel', 'uses' => 'LaporanPendudukController@exportExcel']);
                    Route::get('export-excel-by-id/{data}', ['as' => 'data.laporan-penduduk.export-excel.by-id', 'uses' => 'LaporanPendudukController@exportExcelById']);
                });

                // AKI & AKB
                Route::group(['prefix' => 'aki-akb', 'middleware' => ['action_permission:access.data.aki_akb']], function () {
                    Route::get('/', ['as' => 'data.aki-akb.index', 'uses' => 'AKIAKBController@index']);
                    Route::post('getdata', ['as' => 'data.aki-akb.getdata', 'uses' => 'AKIAKBController@getDataAKIAKB']);
                    Route::get('edit/{id}', ['as' => 'data.aki-akb.edit', 'uses' => 'AKIAKBController@edit']);
                    Route::put('update/{id}', ['as' => 'data.aki-akb.update', 'uses' => 'AKIAKBController@update']);
                    Route::delete('destroy/{id}', ['as' => 'data.aki-akb.destroy', 'uses' => 'AKIAKBController@destroy']);
                    Route::get('import', ['as' => 'data.aki-akb.import', 'uses' => 'AKIAKBController@import']);
                    Route::post('do_import', ['as' => 'data.aki-akb.do_import', 'uses' => 'AKIAKBController@do_import']);
                    Route::get('export-excel', ['as' => 'data.aki-akb.export-excel', 'uses' => 'AKIAKBController@exportExcel']);
                });

                // Imunisasi
                Route::group(['prefix' => 'imunisasi', 'middleware' => ['action_permission:access.data.imunisasi']], function () {
                    Route::get('/', ['as' => 'data.imunisasi.index', 'uses' => 'ImunisasiController@index']);
                    Route::post('getdata', ['as' => 'data.imunisasi.getdata', 'uses' => 'ImunisasiController@getDataAKIAKB']);
                    Route::get('edit/{id}', ['as' => 'data.imunisasi.edit', 'uses' => 'ImunisasiController@edit']);
                    Route::put('update/{id}', ['as' => 'data.imunisasi.update', 'uses' => 'ImunisasiController@update']);
                    Route::delete('destroy/{id}', ['as' => 'data.imunisasi.destroy', 'uses' => 'ImunisasiController@destroy']);
                    Route::get('import', ['as' => 'data.imunisasi.import', 'uses' => 'ImunisasiController@import']);
                    Route::post('do_import', ['as' => 'data.imunisasi.do_import', 'uses' => 'ImunisasiController@do_import']);
                    Route::get('export-excel', ['as' => 'data.imunisasi.export-excel', 'uses' => 'ImunisasiController@exportExcel']);
                });

                // Epidemi Penyakit
                Route::group(['prefix' => 'epidemi-penyakit', 'middleware' => ['action_permission:access.data.epidemi_penyakit']], function () {
                    Route::get('/', ['as' => 'data.epidemi-penyakit.index', 'uses' => 'EpidemiPenyakitController@index']);
                    Route::post('getdata', ['as' => 'data.epidemi-penyakit.getdata', 'uses' => 'EpidemiPenyakitController@getDataAKIAKB']);
                    Route::get('edit/{id}', ['as' => 'data.epidemi-penyakit.edit', 'uses' => 'EpidemiPenyakitController@edit']);
                    Route::put('update/{id}', ['as' => 'data.epidemi-penyakit.update', 'uses' => 'EpidemiPenyakitController@update']);
                    Route::delete('destroy/{id}', ['as' => 'data.epidemi-penyakit.destroy', 'uses' => 'EpidemiPenyakitController@destroy']);
                    Route::get('import', ['as' => 'data.epidemi-penyakit.import', 'uses' => 'EpidemiPenyakitController@import']);
                    Route::post('do_import', ['as' => 'data.epidemi-penyakit.do_import', 'uses' => 'EpidemiPenyakitController@do_import']);
                    Route::get('export-excel', ['as' => 'data.epidemi-penyakit.export-excel', 'uses' => 'EpidemiPenyakitController@exportExcel']);
                });

                // Toilet Sanitasi
                Route::group(['prefix' => 'toilet-sanitasi', 'middleware' => ['action_permission:access.data.toilet_sanitasi']], function () {
                    Route::get('/', ['as' => 'data.toilet-sanitasi.index', 'uses' => 'ToiletSanitasiController@index']);
                    Route::get('getdata', ['as' => 'data.toilet-sanitasi.getdata', 'uses' => 'ToiletSanitasiController@getDataAKIAKB']);
                    Route::get('edit/{id}', ['as' => 'data.toilet-sanitasi.edit', 'uses' => 'ToiletSanitasiController@edit']);
                    Route::put('update/{id}', ['as' => 'data.toilet-sanitasi.update', 'uses' => 'ToiletSanitasiController@update']);
                    Route::delete('destroy/{id}', ['as' => 'data.toilet-sanitasi.destroy', 'uses' => 'ToiletSanitasiController@destroy']);
                    Route::get('import', ['as' => 'data.toilet-sanitasi.import', 'uses' => 'ToiletSanitasiController@import']);
                    Route::post('do_import', ['as' => 'data.toilet-sanitasi.do_import', 'uses' => 'ToiletSanitasiController@do_import']);
                    Route::get('export-excel', ['as' => 'data.toilet-sanitasi.export-excel', 'uses' => 'ToiletSanitasiController@exportExcel']);
                });

                // Tingkaat Pendidikan
                Route::group(['prefix' => 'tingkat-pendidikan', 'middleware' => ['action_permission:access.data.tingkat_pendidikan']], function () {
                    Route::get('/', ['as' => 'data.tingkat-pendidikan.index', 'uses' => 'TingkatPendidikanController@index']);
                    Route::post('getdata', ['as' => 'data.tingkat-pendidikan.getdata', 'uses' => 'TingkatPendidikanController@getData']);
                    Route::delete('destroy/{id}', ['as' => 'data.tingkat-pendidikan.destroy', 'uses' => 'TingkatPendidikanController@destroy']);
                    Route::get('import', ['as' => 'data.tingkat-pendidikan.import', 'uses' => 'TingkatPendidikanController@import']);
                    Route::post('do_import', ['as' => 'data.tingkat-pendidikan.do_import', 'uses' => 'TingkatPendidikanController@do_import']);
                    Route::get('export-excel', ['as' => 'data.tingkat-pendidikan.export-excel', 'uses' => 'TingkatPendidikanController@exportExcel']);
                });

                // Putus Sekolah
                Route::group(['prefix' => 'putus-sekolah', 'middleware' => ['action_permission:access.data.putus_sekolah']], function () {
                    Route::get('/', ['as' => 'data.putus-sekolah.index', 'uses' => 'PutusSekolahController@index']);
                    Route::post('getdata', ['as' => 'data.putus-sekolah.getdata', 'uses' => 'PutusSekolahController@getDataPutusSekolah']);
                    Route::get('edit/{id}', ['as' => 'data.putus-sekolah.edit', 'uses' => 'PutusSekolahController@edit']);
                    Route::put('update/{id}', ['as' => 'data.putus-sekolah.update', 'uses' => 'PutusSekolahController@update']);
                    Route::delete('destroy/{id}', ['as' => 'data.putus-sekolah.destroy', 'uses' => 'PutusSekolahController@destroy']);
                    Route::get('import', ['as' => 'data.putus-sekolah.import', 'uses' => 'PutusSekolahController@import']);
                    Route::post('do_import', ['as' => 'data.putus-sekolah.do_import', 'uses' => 'PutusSekolahController@do_import']);
                    Route::get('export-excel', ['as' => 'data.putus-sekolah.export-excel', 'uses' => 'PutusSekolahController@exportExcel']);
                });

                // Fasilitas PAUD
                Route::group(['prefix' => 'fasilitas-paud', 'middleware' => ['action_permission:access.data.fasilitas_paud']], function () {
                    Route::get('/', ['as' => 'data.fasilitas-paud.index', 'uses' => 'FasilitasPaudController@index']);
                    Route::post('getdata', ['as' => 'data.fasilitas-paud.getdata', 'uses' => 'FasilitasPaudController@getDataFasilitasPAUD']);
                    Route::get('edit/{id}', ['as' => 'data.fasilitas-paud.edit', 'uses' => 'FasilitasPaudController@edit']);
                    Route::put('update/{id}', ['as' => 'data.fasilitas-paud.update', 'uses' => 'FasilitasPaudController@update']);
                    Route::delete('destroy/{id}', ['as' => 'data.fasilitas-paud.destroy', 'uses' => 'FasilitasPaudController@destroy']);
                    Route::get('import', ['as' => 'data.fasilitas-paud.import', 'uses' => 'FasilitasPaudController@import']);
                    Route::post('do_import', ['as' => 'data.fasilitas-paud.do_import', 'uses' => 'FasilitasPaudController@do_import']);
                    Route::get('export-excel', ['as' => 'data.fasilitas-paud.export-excel', 'uses' => 'FasilitasPaudController@exportExcel']);
                });

                // Program Bantuan
                Route::group(['prefix' => 'program-bantuan', 'middleware' => ['action_permission:access.data.program_bantuan']], function () {
                    Route::get('/', ['as' => 'data.program-bantuan.index', 'uses' => 'ProgramBantuanController@index']);
                    Route::match(['GET', 'POST'], 'getdata', ['as' => 'data.program-bantuan.getdata', 'uses' => 'ProgramBantuanController@getaProgramBantuan']);
                    Route::get('show/{id}/{id_desa}/{nama?}', ['as' => 'data.program-bantuan.show', 'uses' => 'ProgramBantuanController@show']);
                    Route::get('import', ['as' => 'data.program-bantuan.import', 'uses' => 'ProgramBantuanController@import']);
                    Route::post('do_import', ['as' => 'data.program-bantuan.do_import', 'uses' => 'ProgramBantuanController@do_import']);
                    Route::get('export-excel', ['as' => 'data.program-bantuan.export-excel', 'uses' => 'ProgramBantuanController@exportExcel']);
                });

                // Anggaran Realisasi
                Route::group(['prefix' => 'anggaran-realisasi', 'middleware' => ['action_permission:access.data.anggaran_realisasi']], function () {
                    Route::get('/', ['as' => 'data.anggaran-realisasi.index', 'uses' => 'AnggaranRealisasiController@index']);
                    Route::match(['GET', 'POST'], 'getdata', ['as' => 'data.anggaran-realisasi.getdata', 'uses' => 'AnggaranRealisasiController@getDataAnggaran']);
                    Route::get('edit/{id}', ['as' => 'data.anggaran-realisasi.edit', 'uses' => 'AnggaranRealisasiController@edit']);
                    Route::put('update/{id}', ['as' => 'data.anggaran-realisasi.update', 'uses' => 'AnggaranRealisasiController@update']);
                    Route::delete('destroy/{id}', ['as' => 'data.anggaran-realisasi.destroy', 'uses' => 'AnggaranRealisasiController@destroy']);
                    Route::get('import', ['as' => 'data.anggaran-realisasi.import', 'uses' => 'AnggaranRealisasiController@import']);
                    Route::post('do_import', ['as' => 'data.anggaran-realisasi.do_import', 'uses' => 'AnggaranRealisasiController@do_import']);
                    Route::get('export-excel', ['as' => 'data.anggaran-realisasi.export-excel', 'uses' => 'AnggaranRealisasiController@exportExcel']);
                });

                // Anggaran Desa
                Route::group(['prefix' => 'anggaran-desa', 'middleware' => ['action_permission:access.data.anggaran_desa']], function () {
                    Route::get('/', ['as' => 'data.anggaran-desa.index', 'uses' => 'AnggaranDesaController@index']);
                    Route::match(['GET', 'POST'], 'getdata', ['as' => 'data.anggaran-desa.getdata', 'uses' => 'AnggaranDesaController@getDataAnggaran']);
                    Route::delete('destroy/{id}', ['as' => 'data.anggaran-desa.destroy', 'uses' => 'AnggaranDesaController@destroy']);
                    Route::get('import', ['as' => 'data.anggaran-desa.import', 'uses' => 'AnggaranDesaController@import']);
                    Route::post('do_import', ['as' => 'data.anggaran-desa.do_import', 'uses' => 'AnggaranDesaController@do_import']);
                    Route::get('export-excel', ['as' => 'data.anggaran-desa.export-excel', 'uses' => 'AnggaranDesaController@exportExcel']);
                });

                // Laporan Apbdes
                Route::group(['prefix' => 'laporan-apbdes', 'middleware' => ['action_permission:access.data.laporan_apbdes']], function () {
                    Route::get('/', ['as' => 'data.laporan-apbdes.index', 'uses' => 'LaporanApbdesController@index']);
                    Route::match(['GET', 'POST'], 'getdata', ['as' => 'data.laporan-apbdes.getdata', 'uses' => 'LaporanApbdesController@getApbdes']);
                    Route::delete('destroy/{id}', ['as' => 'data.laporan-apbdes.destroy', 'uses' => 'LaporanApbdesController@destroy']);
                    Route::get('import', ['as' => 'data.laporan-apbdes.import', 'uses' => 'LaporanApbdesController@import']);
                    Route::post('do_import', ['as' => 'data.laporan-apbdes.do_import', 'uses' => 'LaporanApbdesController@do_import']);
                    Route::get('download/{id}', ['as' => 'data.laporan-apbdes.download', 'uses' => 'LaporanApbdesController@download']);
                    Route::get('export-excel', ['as' => 'data.laporan-apbdes.export-excel', 'uses' => 'LaporanApbdesController@exportExcel']);
                });

                // Pembangunan
                Route::group(['prefix' => 'pembangunan', 'middleware' => ['action_permission:access.data.pembangunan']], function () {
                    Route::get('/', ['as' => 'data.pembangunan.index', 'uses' => 'DataPembangunanController@index']);
                    Route::match(['GET', 'POST'], 'getdata', ['as' => 'data.pembangunan.getdata', 'uses' => 'DataPembangunanController@getPembangunan']);
                    Route::get('rincian/{id}/{desa_id}', ['as' => 'data.pembangunan.rincian', 'uses' => 'DataPembangunanController@rincian']);
                    Route::match(['GET', 'POST'], 'getrinciandata/{id}/{desa_id}', ['as' => 'data.pembangunan.getrinciandata', 'uses' => 'DataPembangunanController@getrinciandata']);
                    Route::get('export-excel', ['as' => 'data.pembangunan.export-excel', 'uses' => 'DataPembangunanController@exportExcel']);
                });

                // Lembaga Kategori
                Route::group(['prefix' => 'kategori-lembaga', 'middleware' => ['action_permission:access.data.kategori_lembaga']], function () {
                    Route::get('/', ['as' => 'data.kategori-lembaga.index', 'uses' => 'KategoriLembagaController@index']);
                    Route::get('getdata', ['as' => 'data.kategori-lembaga.getdata', 'uses' => 'KategoriLembagaController@getData']);
                    Route::get('create', ['as' => 'data.kategori-lembaga.create', 'uses' => 'KategoriLembagaController@create']);
                    Route::post('store', ['as' => 'data.kategori-lembaga.store', 'uses' => 'KategoriLembagaController@store']);
                    Route::get('edit/{id}', ['as' => 'data.kategori-lembaga.edit', 'uses' => 'KategoriLembagaController@edit']);
                    Route::put('update/{id}', ['as' => 'data.kategori-lembaga.update', 'uses' => 'KategoriLembagaController@update']);
                    Route::delete('destroy/{id}', ['as' => 'data.kategori-lembaga.destroy', 'uses' => 'KategoriLembagaController@destroy']);
                });

                // Lembaga
                Route::group(['prefix' => 'lembaga', 'middleware' => ['action_permission:access.data.lembaga']], function () {
                    Route::get('/', ['as' => 'data.lembaga.index', 'uses' => 'LembagaController@index']);
                    Route::get('getdata', ['as' => 'data.lembaga.getdata', 'uses' => 'LembagaController@getData']);
                    Route::get('create', ['as' => 'data.lembaga.create', 'uses' => 'LembagaController@create']);
                    Route::post('store', ['as' => 'data.lembaga.store', 'uses' => 'LembagaController@store']);
                    Route::get('edit/{id}', ['as' => 'data.lembaga.edit', 'uses' => 'LembagaController@edit']);
                    Route::put('update/{id}', ['as' => 'data.lembaga.update', 'uses' => 'LembagaController@update']);
                    Route::delete('destroy/{id}', ['as' => 'data.lembaga.destroy', 'uses' => 'LembagaController@destroy']);

                    // Lembaga Sub Lembaga Anggota
                    Route::group(['prefix' => '{slug}/anggota', 'middleware' => ['action_permission:access.data.lembaga']], function () {
                        Route::get('/', ['as' => 'data.lembaga_anggota.index', 'uses' => 'LembagaAnggotaController@index']);
                        Route::get('getdata', ['as' => 'data.lembaga_anggota.getdata', 'uses' => 'LembagaAnggotaController@getData']);
                        Route::get('create', ['as' => 'data.lembaga_anggota.create', 'uses' => 'LembagaAnggotaController@create']);
                        Route::post('store', ['as' => 'data.lembaga_anggota.store', 'uses' => 'LembagaAnggotaController@store']);
                        Route::get('edit/{id}', ['as' => 'data.lembaga_anggota.edit', 'uses' => 'LembagaAnggotaController@edit']);
                        Route::put('update/{id}', ['as' => 'data.lembaga_anggota.update', 'uses' => 'LembagaAnggotaController@update']);
                        Route::delete('destroy/{id}', ['as' => 'data.lembaga_anggota.destroy', 'uses' => 'LembagaAnggotaController@destroy']);
                    });

                    // Redirect dari /data/lembaga/{slug} ke /data/lembaga/{slug}/anggota
                    Route::get('{slug}', function ($slug) {
                        return redirect()->route('data.lembaga_anggota.index', ['slug' => $slug]);
                    });
                });
            });

            // Admin SIKEMA
            Route::group(['prefix' => 'admin-komplain', 'middleware' => ['action_permission:access.admin_komplain']], function () {
                Route::get('/', ['as' => 'admin-komplain.index', 'uses' => 'AdminKomplainController@index']);
                Route::match(['GET', 'POST'], 'getdata', ['as' => 'admin-komplain.getdata', 'uses' => 'AdminKomplainController@getDataKomplain']);
                Route::get('edit/{id}', ['as' => 'admin-komplain.edit', 'uses' => 'AdminKomplainController@edit']);
                Route::put('update/{id}', ['as' => 'admin-komplain.update', 'uses' => 'AdminKomplainController@update']);
                Route::delete('destroy/{id}', ['as' => 'admin-komplain.destroy', 'uses' => 'AdminKomplainController@destroy']);
                Route::put('setuju/{id}', ['as' => 'admin-komplain.setuju', 'uses' => 'AdminKomplainController@disetujui']);
                Route::put('anonim/{id}', ['as' => 'admin-komplain.anonim', 'uses' => 'AdminKomplainController@anonim']);
                Route::get('statistik', ['as' => 'admin-komplain.statistik', 'uses' => 'AdminKomplainController@statistik']);
                Route::get('show/{id}', ['as' => 'admin-komplain.show', 'uses' => 'AdminKomplainController@show']);
                Route::delete('deletekomentar/{id}', ['as' => 'admin-komplain.deletekomentar', 'uses' => 'AdminKomplainController@deletekomentar']);
                Route::get('getkomentar/{id}', ['as' => 'admin-komplain.getkomentar', 'uses' => 'AdminKomplainController@getKomentar']);
                Route::put('updatekomentar/{id}', ['as' => 'admin-komplain.updatekomentar', 'uses' => 'AdminKomplainController@updateKomentar']);
            });
        });

        /**
         * Group Routing for Pesan
         */
        Route::namespace('\App\Http\Controllers\Pesan')->group(function () {
            // Routes Resource Pesan
            Route::group(['prefix' => 'pesan', 'middleware' => ['action_permission:access.pesan']], function () {
                Route::get('/', ['as' => 'pesan.index', 'uses' => 'PesanController@index']);
                Route::get('/keluar', ['as' => 'pesan.keluar', 'uses' => 'PesanController@loadPesanKeluar']);
                Route::get('/arsip', ['as' => 'pesan.arsip', 'uses' => 'PesanController@loadPesanArsip']);
                Route::post('/arsip', ['as' => 'pesan.arsip.post', 'uses' => 'PesanController@setArsipPesan']);
                Route::get('/compose', ['as' => 'pesan.compose', 'uses' => 'PesanController@composePesan']);
                Route::post('/compose/post', ['as' => 'pesan.compose.post', 'uses' => 'PesanController@storeComposePesan']);
                Route::post('/read/multiple', ['as' => 'pesan.read.multiple', 'uses' => 'PesanController@setMultipleReadPesanStatus']);
                Route::post('/arsip/multiple', ['as' => 'pesan.arsip.multiple', 'uses' => 'PesanController@setMultipleArsipPesanStatus']);
                Route::post('/reply', ['as' => 'pesan.reply.post', 'uses' => 'PesanController@replyPesan']);
                Route::get('/{id_pesan}', ['as' => 'pesan.read', 'uses' => 'PesanController@readPesan']);
            });
        });

        /**
         * Group Routing for Pesan
         */
        Route::namespace('\App\Http\Controllers\Surat')->group(function () {
            Route::group(['prefix' => 'surat', 'middleware' => ['action_permission:access.surat']], function () {
                // permohonan
                Route::group(['prefix' => 'permohonan'], function () {
                    Route::get('/', ['as' => 'surat.permohonan', 'uses' => 'PermohonanController@index']);
                    Route::get('getdata', ['as' => 'surat.permohonan.getdata', 'uses' => 'PermohonanController@getData']);
                    Route::get('show/{surat}', ['as' => 'surat.permohonan.show', 'uses' => 'PermohonanController@show']);
                    Route::get('download/{surat}', ['as' => 'surat.permohonan.download', 'uses' => 'PermohonanController@download']);
                    Route::get('setujui/{surat}', ['as' => 'surat.permohonan.setujui', 'uses' => 'PermohonanController@setujui']);
                    Route::post('tolak/{surat}', ['as' => 'surat.permohonan.tolak', 'uses' => 'PermohonanController@tolak']);
                    Route::get('ditolak', ['as' => 'surat.permohonan.ditolak', 'uses' => 'PermohonanController@ditolak']);
                    Route::get('getdataditolak', ['as' => 'surat.permohonan.getdataditolak', 'uses' => 'PermohonanController@getDataDitolak']);
                    Route::post('passphrase/{surat}', ['as' => 'surat.permohonan.passphrase', 'uses' => 'PermohonanController@passphrase']);
                });

                // arsip
                Route::get('/arsip', ['as' => 'surat.arsip', 'uses' => 'SuratController@arsip']);
                Route::get('/arsip/getdata', ['as' => 'surat.arsip.getdata', 'uses' => 'SuratController@getData']);
                Route::get('/arsip/qrcode/{surat}', ['as' => 'surat.arsip.qrcode', 'uses' => 'SuratController@qrcode']);
                Route::get('/arsip/download/{surat}', ['as' => 'surat.arsip.download', 'uses' => 'SuratController@download']);

                // pengaturan
                Route::get('/pengaturan', ['as' => 'surat.pengaturan', 'uses' => 'SuratController@pengaturan']);
                Route::put('/pengaturan/update', ['as' => 'surat.pengaturan.update', 'uses' => 'SuratController@pengaturan_update']);
            });
        });

        /**
         * Group Routing for Setting
         */
        Route::group(['prefix' => 'setting'], function () {
            // User Management
            Route::group(['prefix' => 'user', 'controller' => UserController::class, 'middleware' => ['action_permission:access.setting.user']], function () {
                Route::get('/', 'index')->name('setting.user.index');
                Route::match(['GET', 'POST'], 'getdata', 'getDataUser')->name('setting.user.getdata');
                Route::get('create', 'create')->name('setting.user.create');
                Route::post('store', 'store')->name('setting.user.store');
                Route::put('updatePassword/{id}', 'updatePassword')->name('setting.user.updatePassword');
                Route::put('password/{id}', 'password')->name('setting.user.password');
                Route::post('destroy/{id}', 'destroy')->name('setting.user.destroy');
                Route::post('active/{id}', 'active')->name('setting.user.active');
                Route::delete('permanent-destroy/{id}', 'permanentDestroy')->name('setting.user.permanent-destroy');
            });

            Route::group(['prefix' => 'user', 'controller' => UserController::class, 'middleware' => ['action_permission:access.setting']], function () {
                Route::get('edit/{id}', 'edit')->name('setting.user.edit');
                Route::put('update/{id}', 'update')->name('setting.user.update');
                Route::get('photo-profil/{id}', 'photo')->name('setting.user.photo');
                Route::put('update-photo/{id}', 'updatePhoto')->name('setting.user.uphoto');
            });

            // Widget
            Route::get('/widget', WidgetController::class)->middleware(['action_permission:access.setting'])->name('setting.widget');

            // Role Management
            Route::group(['prefix' => 'role', 'controller' => RoleController::class, 'middleware' => ['action_permission:access.setting.role']], function () {
                Route::get('/', 'index')->name('setting.role.index');
                Route::match(['GET', 'POST'], 'getdata', 'getData')->name('setting.role.getdata');
                Route::get('create', 'create')->name('setting.role.create');
                Route::post('store', 'store')->name('setting.role.store');
                Route::get('edit/{id}', 'edit')->name('setting.role.edit');
                Route::put('update/{id}', 'update')->name('setting.role.update');
                Route::delete('destroy/{id}', 'destroy')->name('setting.role.destroy');
                Route::get('users/{id}', 'users')->name('setting.role.users');
                Route::get('users/{id}/getdata', 'getDataUsersByRole')->name('setting.role.users.getdata');
            });

            // Komplain Kategori
            Route::group(['prefix' => 'komplain-kategori', 'controller' => KategoriKomplainController::class, 'middleware' => ['action_permission:access.setting.komplain_kategori']], function () {
                Route::get('/', 'index')->name('setting.komplain-kategori.index');
                Route::get('getdata', 'getData')->name('setting.komplain-kategori.getdata');
                Route::post('store', 'store')->name('setting.komplain-kategori.store');
                Route::get('edit/{id}', 'edit')->name('setting.komplain-kategori.edit');
                Route::put('update/{id}', 'update')->name('setting.komplain-kategori.update');
                Route::delete('destroy/{id}', 'destroy')->name('setting.komplain-kategori.destroy');
            });

            // Tipe Regulasi
            Route::group(['prefix' => 'tipe-regulasi', 'controller' => TipeRegulasiController::class, 'middleware' => ['action_permission:access.setting.tipe_regulasi']], function () {
                Route::get('/', 'index')->name('setting.tipe-regulasi.index');
                Route::match(['GET', 'POST'], 'getdata', 'getData')->name('setting.tipe-regulasi.getdata');
                Route::post('store', 'store')->name('setting.tipe-regulasi.store');
                Route::get('edit/{id}', 'edit')->name('setting.tipe-regulasi.edit');
                Route::put('update/{id}', 'update')->name('setting.tipe-regulasi.update');
                Route::delete('destroy/{id}', 'destroy')->name('setting.tipe-regulasi.destroy');
            });

            // Jenis Penyakit
            Route::group(['prefix' => 'jenis-penyakit', 'controller' => JenisPenyakitController::class, 'middleware' => ['action_permission:access.setting.jenis_penyakit']], function () {
                Route::get('/', 'index')->name('setting.jenis-penyakit.index');
                Route::get('getdata', 'getData')->name('setting.jenis-penyakit.getdata');
                Route::post('store', 'store')->name('setting.jenis-penyakit.store');
                Route::get('edit/{id}', 'edit')->name('setting.jenis-penyakit.edit');
                Route::put('update/{id}', 'update')->name('setting.jenis-penyakit.update');
                Route::delete('destroy/{id}', 'destroy')->name('setting.jenis-penyakit.destroy');
            });

            // Tipe Potensi
            Route::group(['prefix' => 'tipe-potensi', 'controller' => TipePotensiController::class, 'middleware' => ['action_permission:access.setting.tipe_potensi']], function () {
                Route::get('/', 'index')->name('setting.tipe-potensi.index');
                Route::get('getdata', 'getData')->name('setting.tipe-potensi.getdata');
                Route::post('store', 'store')->name('setting.tipe-potensi.store');
                Route::get('edit/{id}', 'edit')->name('setting.tipe-potensi.edit');
                Route::put('update/{id}', 'update')->name('setting.tipe-potensi.update');
                Route::delete('destroy/{id}', 'destroy')->name('setting.tipe-potensi.destroy');
            });

            // Slide
            Route::group(['prefix' => 'slide', 'controller' => SlideController::class, 'middleware' => ['action_permission:access.setting.slide']], function () {
                Route::get('/', 'index')->name('setting.slide.index');
                Route::get('getdata', 'getData')->name('setting.slide.getdata');
                Route::get('create', 'create')->name('setting.slide.create');
                Route::post('store', 'store')->name('setting.slide.store');
                Route::get('edit/{slide}', 'edit')->name('setting.slide.edit');
                Route::get('show/{slide}', 'show')->name('setting.slide.show');
                Route::put('update/{slide}', 'update')->name('setting.slide.update');
                Route::delete('destroy/{slide}', 'destroy')->name('setting.slide.destroy');
            });

            // COA
            Route::group(['prefix' => 'coa', 'controller' => COAController::class, 'middleware' => ['action_permission:access.setting.coa']], function () {
                Route::get('/', 'index')->name('setting.coa.index');
                Route::get('create', 'create')->name('setting.coa.create');
                Route::post('store', 'store')->name('setting.coa.store');
                Route::get('sub_coa/{type_id}', 'get_sub_coa')->name('setting.coa.sub_coa');
                Route::get('sub_sub_coa/{type_id}/{sub_id}', 'get_sub_sub_coa')->name('setting.coa.sub_sub_coa');
                Route::get('generate_id/{type_id}/{sub_id}/{sub_sub_id}', 'generate_id')->name('setting.coa.generate_id');
            });

            // Themes
            Route::group(['prefix' => 'themes', 'controller' => ThemesController::class, 'middleware' => ['action_permission:access.setting.themes']], function () {
                Route::get('/', 'index')->name('setting.themes.index');
                Route::get('activate/{themes}', 'activate')->name('setting.themes.activate');
                Route::get('rescan', 'rescan')->name('setting.themes.rescan');
                Route::post('clear-cache', 'clearCache')->name('setting.themes.clear-cache');
                Route::delete('destroy/{themes}', 'destroy')->name('setting.themes.destroy');
            });

            // Theme upload — restricted to super-admin only (CRITICAL security boundary)
            Route::group(['prefix' => 'themes', 'controller' => ThemesController::class, 'middleware' => ['role:super-admin']], function () {
                Route::post('upload', 'upload')->name('setting.themes.upload');
            });

            Route::group(['prefix' => 'aplikasi', 'controller' => AplikasiController::class, 'middleware' => ['action_permission:access.setting.aplikasi']], function () {
                Route::get('/', 'index')->name('setting.aplikasi.index');
                Route::get('/edit/{aplikasi}', 'edit')->name('setting.aplikasi.edit');
                Route::put('/update/{aplikasi}', 'update')->name('setting.aplikasi.update');
                Route::get('token', [TokenController::class, 'index'])->name('setting.aplikasi.token');
            });

            Route::group(['prefix' => 'info-sistem', 'controller' => LogViewerController::class, 'middleware' => ['action_permission:access.setting.info_sistem']], function () {
                Route::get('/', 'index')->name('setting.info-sistem');
                Route::get('/phpinfo', 'phpinfo')->name('setting.info-sistem.phpinfo');
                Route::get('/linkstorage', 'linkStorage')->name('setting.info-sistem.linkstorage');
                Route::get('/queuelisten', 'queueListen')->name('setting.info-sistem.queuelisten');
                Route::post('/store-email-smtp', 'storeEmailSmtp')->name('setting.info-sistem.store-email-smtp');
                Route::post('/send-test-email-smtp/{email}', 'sendTestEmailSmtp')->name('setting.info-sistem.send-test-email-smtp');
                Route::get('/migrasi', 'migrasi')->name('setting.info-sistem.migrasi');
            });

            // Navigasi
            Route::group(['prefix' => 'navigation', 'controller' => NavigationController::class, 'middleware' => ['action_permission:access.setting.navigation']], function () {
                Route::get('getdata/{parent_id}', 'getData')->name('setting.navigation.getdata');
                Route::get('create/{parent_id}', 'create')->name('setting.navigation.create');
                Route::post('store', 'store')->name('setting.navigation.store');
                Route::get('edit/{id}', 'edit')->name('setting.navigation.edit');
                Route::put('update/{id}', 'update')->name('setting.navigation.update');
                Route::delete('destroy/{id}', 'destroy')->name('setting.navigation.destroy');
                Route::get('order/{id}/{direction}', 'order')->name('setting.navigation.order');
                Route::get('/{parent_id?}', 'index')->name('setting.navigation.index');
            });

            // Nav Menu
            Route::group(['prefix' => 'nav-menu', 'controller' => NavMenuController::class, 'middleware' => ['action_permission:access.setting.nav_menu']], function () {
                Route::get('/', 'index')->name('setting.navmenu.index');
                Route::post('store', 'store')->name('setting.navmenu.store');
            });

            // Pengaturan Database (Backup)
            Route::group(['prefix' => 'backup-database', 'controller' => PengaturanDatabaseController::class, 'middleware' => ['action_permission:access.setting.database']], function () {
                Route::get('/', 'index')->name('setting.pengaturan-database.backup');
                Route::match(['GET', 'POST'], '/getdata', 'getDataBackup')->name('setting.pengaturan-database.getdata');
                Route::post('/backup-running', 'createBackup')->name('setting.pengaturan-database.runbackup');
                Route::get('/backup-download/{file}', 'downloadBackup')->name('setting.pengaturan-database.download');
                Route::get('/backup-delete/{file}', 'deleteBackup')->name('setting.pengaturan-database.delete');
                Route::get('/testing', [PengaturanDatabaseController::class, 'testing']);
            });

            // Pengaturan Database (Restore)
            Route::group(['prefix' => 'restore-database', 'controller' => PengaturanDatabaseController::class, 'middleware' => ['action_permission:access.setting.database']], function () {
                Route::get('/', 'restoreDatabase')->name('setting.pengaturan-database.restore');
                Route::post('/restore-running', 'restoreBackup')->name('setting.pengaturan-database.runrestore');
            });

            // Jenis Dokumen
            Route::group(['prefix' => 'jenis-dokumen', 'controller' => JenisDokumenController::class, 'middleware' => ['action_permission:access.setting.jenis_dokumen']], function () {
                Route::get('/', 'index')->name('setting.jenis-dokumen.index');
                Route::get('getdata', 'getData')->name('setting.jenis-dokumen.getdata');
                Route::post('store', 'store')->name('setting.jenis-dokumen.store');
                Route::get('edit/{id}', 'edit')->name('setting.jenis-dokumen.edit');
                Route::put('update/{id}', 'update')->name('setting.jenis-dokumen.update');
                Route::delete('destroy/{id}', 'destroy')->name('setting.jenis-dokumen.destroy');
            });
        });

        /**
         * Group Routing for Counter
         */
        Route::group(['prefix' => 'counter'], function () {
            Route::get('/', [CounterController::class, 'index'])->name('counter.index');
            Route::get('cetak', [CounterController::class, 'cetak'])->name('counter.cetak');
            Route::get('export-excel', [CounterController::class, 'exportExcel'])->name('counter.export.excel');
        });
    });

    Route::group(['middleware' => ['web']], function () {
        if (Cookie::get(env('COUNTER_COOKIE', 'kd-counter')) == false) {
            Cookie::queue(env('COUNTER_COOKIE', 'kd-counter'), str_random(80), 2628000); // Forever aka 5 years
        }
    });

    Route::group(['controller' => SitemapController::class], function () {
        Route::get('/sitemap.xml', 'index')->name('sitemap');
        Route::get('/sitemap', function () {
            return redirect()->route('sitemap');
        });
        Route::get('/sitemap/prosedur', 'prosedur');
    });

    // Semua Desa
    Route::get('/api/desa', function () {
        return DataDesa::paginate(10)->name('api.desa');
    });

    Route::get('testEmail', TestEmailController::class)->name('testEmail');
});
