<?php

use App\Http\Controllers\Api\V1\AdminController;
use App\Http\Controllers\Api\V1\AuthController;
use App\Http\Controllers\Api\V1\DeviceController;
use App\Http\Controllers\Api\V1\GroupHallController;
use App\Http\Controllers\Api\V1\GroupRouteController;
use App\Http\Controllers\Api\V1\TripController;
use App\Http\Middleware\EnsureMobileSessionFresh;
use App\Http\Middleware\EnsureUserRole;
use Illuminate\Support\Facades\Route;

Route::get('/health', fn () => ['success' => true, 'message' => 'API is running.']);
Route::prefix('auth')->group(function () {
    Route::post('register', [AuthController::class, 'registerCustomer']);
    Route::post('register/driver', [AuthController::class, 'registerDriver']);
    Route::post('login', [AuthController::class, 'login']);
});
Route::middleware(['auth:sanctum', EnsureMobileSessionFresh::class])->group(function () {
    Route::get('me', [AuthController::class, 'me']);
    Route::post('logout', [AuthController::class, 'logout'])->middleware('idempotent');
    Route::get('me/active-trip', [TripController::class, 'active']);
    Route::post('me/devices', [DeviceController::class, 'store'])->middleware('idempotent');
    Route::delete('me/devices', [DeviceController::class, 'destroy'])->middleware('idempotent');
});
Route::middleware(['auth:sanctum', EnsureMobileSessionFresh::class, EnsureUserRole::class.':customer'])->prefix('customer')->group(function () {
    Route::get('groups', [GroupHallController::class, 'directory']);
    Route::post('fare-quotes', [TripController::class, 'quote'])->middleware('idempotent');
    Route::post('trips', [TripController::class, 'store'])->middleware('idempotent');
    Route::get('trips/{trip}', [TripController::class, 'show']);
    Route::post('trips/{trip}/cancel', [TripController::class, 'cancel'])->middleware('idempotent');
});
Route::middleware(['auth:sanctum', EnsureMobileSessionFresh::class, EnsureUserRole::class.':driver'])->prefix('driver')->group(function () {
    Route::get('groups', [GroupHallController::class, 'mine']);
    Route::get('groups/directory', [GroupHallController::class, 'driverDirectory']);
    Route::post('groups/{publicId}/join', [GroupHallController::class, 'join'])->middleware('idempotent');
    Route::get('groups/{publicId}/hall', [GroupHallController::class, 'hall']);
    Route::post('groups/{publicId}/routes/{route}/start', [GroupRouteController::class, 'start'])->middleware('idempotent');
    Route::get('group-routes/active', [GroupRouteController::class, 'active']);
    Route::post('group-route-runs/{run}/complete', [GroupRouteController::class, 'complete'])->middleware('idempotent');
    Route::get('profile', [TripController::class, 'driverProfile']);
    Route::post('status', [TripController::class, 'driverStatus'])->middleware('idempotent');
    Route::post('location', [TripController::class, 'driverLocation'])->middleware('idempotent');
    Route::get('requests', [TripController::class, 'available']);
    Route::post('trips/{trip}/accept', [TripController::class, 'accept'])->middleware('idempotent');
    Route::post('trips/{trip}/reject', [TripController::class, 'reject'])->middleware('idempotent');
    Route::post('trips/{trip}/{command}', [TripController::class, 'command'])->whereIn('command', ['en-route', 'arrive', 'start', 'complete'])->middleware('idempotent');
    Route::post('trips/{trip}/cancel', [TripController::class, 'cancel'])->middleware('idempotent');
});
Route::middleware(['auth:sanctum', EnsureUserRole::class.':admin'])->prefix('admin')->group(function () {
    Route::get('drivers', [AdminController::class, 'drivers']);
    Route::get('driver-locations', [AdminController::class, 'driverLocations']);
    Route::patch('drivers/{driver}', [AdminController::class, 'updateDriver']);
    Route::get('vehicles', [AdminController::class, 'vehicles']);
    Route::get('trips', [AdminController::class, 'trips']);
    Route::get('scheduled-trips', [AdminController::class, 'scheduled']);
    Route::get('fuel-prices', [AdminController::class, 'fuelPrices']);
    Route::put('fuel-prices', [AdminController::class, 'updateFuelPrices']);
    Route::get('groups', [AdminController::class, 'groups']);
    Route::post('groups', [AdminController::class, 'createGroup']);
    Route::put('groups/{group}', [AdminController::class, 'updateGroup']);
    Route::post('groups/{group}/logo', [AdminController::class, 'uploadGroupLogo']);
    Route::post('groups/{group}/announcements', [AdminController::class, 'publishGroupAnnouncement']);
    Route::post('groups/{group}/members', [AdminController::class, 'addMember']);
    Route::delete('groups/{group}/members/{driver}', [AdminController::class, 'removeMember']);
    Route::post('groups/{group}/routes', [GroupRouteController::class, 'create']);
    Route::put('groups/{group}/routes/{route}', [GroupRouteController::class, 'update']);
});
