# Module Loader Documentation

## Overview

ModuleLoader adalah sistem yang secara otomatis memuat route dari setiap modul di `app/Modules/*`. Setiap modul dapat memiliki file `Routes.php` yang akan otomatis dimuat saat aplikasi di-boot.

## Cara Kerja

1. **Automatic Discovery**: ModuleLoader secara otomatis memindai semua direktori di `app/Modules/*`
2. **Route Loading**: Jika sebuah modul memiliki file `Routes.php`, file tersebut akan otomatis dimuat
3. **Route Registration**: Route yang didefinisikan di file `Routes.php` modul akan terdaftar ke sistem routing CodeIgniter

## Struktur Modul

Setiap modul harus mengikuti struktur berikut:

```
app/Modules/
└── {ModuleName}/
    ├── Routes.php      # File route untuk modul ini (opsional)
    ├── Controllers/
    ├── Models/
    ├── Services/
    └── Entities/
```

## Cara Membuat Routes di Modul

Buat file `Routes.php` di root direktori modul Anda:

```php
<?php

/**
 * {ModuleName} Module Routes
 * 
 * @var RouteCollection $routes
 */

// Contoh route dengan group
$routes->group('api/module-name', ['namespace' => 'App\Modules\{ModuleName}\Controllers'], function($routes) {
    $routes->get('/', 'ControllerName::index');
    $routes->post('/', 'ControllerName::create');
    $routes->get('(:num)', 'ControllerName::show/$1');
    $routes->put('(:num)', 'ControllerName::update/$1');
    $routes->delete('(:num)', 'ControllerName::delete/$1');
});

// Atau route langsung
$routes->get('api/module-name/endpoint', 'App\Modules\{ModuleName}\Controllers\ControllerName::method');
```

## Integrasi

ModuleLoader sudah terintegrasi di `app/Config/Routes.php`:

```php
use Config\ModuleLoader;

$moduleLoader = new ModuleLoader();
$moduleLoader->loadModuleRoutes($routes);
```

Route dari modul akan dimuat sebelum route utama aplikasi, sehingga route utama dapat override route modul jika diperlukan.

## API Methods

### `loadModuleRoutes(RouteCollection $routes): void`
Memuat semua route dari modul yang memiliki file `Routes.php`.

### `getAvailableModules(): array`
Mengembalikan array nama modul yang tersedia.

### `moduleExists(string $moduleName): bool`
Memeriksa apakah modul dengan nama tertentu ada.

### `getModulePath(string $moduleName): ?string`
Mengembalikan path lengkap ke modul, atau `null` jika tidak ditemukan.

## Catatan

- File `Routes.php` di modul harus menggunakan variabel `$routes` yang sudah tersedia
- Route dari modul dimuat dalam urutan alfabetis berdasarkan nama modul
- Jika ada konflik route, route yang dimuat terakhir akan mengambil prioritas
