<?php

use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\{
    ProfileController,
    DashboardController,
    CategoryController,
    ItemTypeController,
    ItemSizeController,
    ItemController,
    TableController,
    OrderController,
    InvoiceController,
    MeasurementUnitController,
    ItemCategoryTypeController,
    DiscountController,
    TaxController,
    OrderTypeController,
    FloorController,
    FrontController,
    RestaurantController,
    TakeAwayController,
    UserAuthController,
    AdminAuthController,
	BookTableController,
	ContactEnquiryController,
	WaiterController,
	PurchaseItemController,
	PurchaseShopController,
	ExpenseItemController,
	ExpensePersonController,
	ExpenseCategoryController,
	InventoryController,
	SavingController,
	SettingController
};

// Admin Authentication Routes
Route::prefix('admin')->group(function () {
    Route::middleware('guest:admin')->group(function () {
        Route::get('/login', [AdminAuthController::class, 'showLogin'])->name('admin.login');
        Route::post('/login', [AdminAuthController::class, 'login'])->name('admin.login.submit');
        //Route::get('/register', [AdminAuthController::class, 'showRegister'])->name('admin.register');
        //Route::post('/register', [AdminAuthController::class, 'register'])->name('admin.register.submit');
    });
    Route::post('/logout', [AdminAuthController::class, 'logout'])->name('admin.logout');
});

// User (Customer) Authentication Routes
Route::middleware('guest')->group(function () {
    Route::get('/user-login', [UserAuthController::class, 'showLogin'])->name('user.login');
    Route::post('/user-login', [UserAuthController::class, 'login'])->name('user.login.submit');
    Route::get('/user-register', [UserAuthController::class, 'showRegister'])->name('user.register');
    Route::post('/user-register', [UserAuthController::class, 'register'])->name('user.register.submit');
});
Route::post('/user-logout', [UserAuthController::class, 'logout'])->name('user.logout');

// Public routes


// Redirect legacy /dashboard to /admin/dashboard
Route::get('/dashboard', function () {
    return redirect()->route('dashboard');
});

Route::get('/', [FrontController::class, 'index'])->name('front.index');
Route::get('/maharaja/order', [FrontController::class, 'order'])->name('front.order');
Route::get('/front/hotel', [FrontController::class, 'hotel'])->name('front.hotel');
Route::get('/menu-items/{category?}', [FrontController::class, 'getMenu']);
Route::get('/item/{id}', [FrontController::class, 'getItemDetails']);
Route::get('/show/restaurants/{restaurant}', [FrontController::class, 'showMenu'])->name('restaurants.menu');
    Route::get('/special-dishes', [FrontController::class, 'getSpecialDishes']);
    Route::get('/signature-dishes', [FrontController::class, 'getSignatureDishes']);
    Route::get('/invoice/pdf/{order}', [OrderController::class, 'generatePdfPublic'])->name('public.orders.pdf');

/*
|--------------------------------------------------------------------------
| FRONT USER AUTH (ONLY THIS NEEDS LOGIN)
|--------------------------------------------------------------------------
*/

Route::middleware(['auth'])->group(function () {
    Route::post('/online/store', [FrontController::class, 'storeOnline'])->name('front.orders.store');
    Route::get('/my-profile/data', [FrontController::class, 'getMyProfileData'])->name('my.profile.data');
    Route::get('/my-orders',[FrontController::class, 'getMyOrders'])->name('user.orders');
    Route::get('/my-orders', [FrontController::class, 'showMyOrdersPage'])
        ->name('user.profile.orders');
    Route::get('/order-details/{id}', action: [FrontController::class, 'getOrderDetails'])->name('show.orders');
    Route::get('/my-reservations',[FrontController::class, 'getMyReservations'])->name('user.reservations');
    Route::get('/reservation-details/{id}', [FrontController::class, 'reservationDetails'])->name('reservation.details');
    Route::get('/my-takeaway-orders', [FrontController::class, 'getMyTakeawayOrders'])->name('user.takeaway');    
    Route::post('/takeaway-order', [FrontController::class, 'store'])->name('takeaway.order.store');
});
/*
|--------------------------------------------------------------------------
| ADMIN AUTHENTICATED ROUTES
|--------------------------------------------------------------------------
*/
Route::prefix('admin')->middleware(['auth:admin'])->group(function () {
    
    // Dashboard
    Route::get('/dashboard', function() {
        if (Auth::guard('admin')->user()->hasRole('cashier')) {
            return redirect()->route('pos');
        }
        if (!Auth::guard('admin')->user()->hasPermission('access-dashboard')) {
            abort(403);
        }
        return (new DashboardController())->index();
    })->name('dashboard');

    Route::middleware(['permission:access-dashboard'])->group(function () {

        Route::post('categories/reorder', [CategoryController::class, 'reorder'])->name('categories.reorder');
        Route::get('categories/export', [CategoryController::class, 'export'])->name('categories.export');
        // Master Modules
        Route::resource('categories', CategoryController::class);
        Route::resource('item-types', ItemTypeController::class);
        Route::resource('item-sizes', ItemSizeController::class);

        // Table Management
        Route::get('tables', [TableController::class, 'index'])->name('table.index');
        Route::get('tables/create', [TableController::class, 'create'])->name('table.create');
        Route::post('tables', [TableController::class, 'store'])->name('table.store');
        Route::get('tables/{id}/edit', [TableController::class, 'edit'])->name('table.edit');
        Route::put('tables/{id}', [TableController::class, 'update'])->name('table.update');
        Route::delete('tables/{id}', [TableController::class, 'destroy'])->name('table.destroy');

        // AREA ROUTES
        Route::get('areas', [App\Http\Controllers\AreaController::class, 'index'])->name('areas.index');
        Route::get('areas/create', [App\Http\Controllers\AreaController::class, 'create'])->name('areas.create');
        Route::post('areas', [App\Http\Controllers\AreaController::class, 'store_area'])->name('areas.store');
        Route::get('areas/{id}/edit', [App\Http\Controllers\AreaController::class, 'edit'])->name('areas.edit');
        Route::put('areas/{id}', [App\Http\Controllers\AreaController::class, 'update'])->name('areas.update');
        Route::delete('areas/{id}', [App\Http\Controllers\AreaController::class, 'destroy'])->name('areas.destroy');

        //WAITER 
        Route::get('/waiters', [WaiterController::class, 'index'])->name('waiters.index');
        Route::get('/waiters/create', [WaiterController::class, 'create'])->name('waiters.create');
        Route::post('/waiters/store', [WaiterController::class, 'store'])->name('waiters.store');
        Route::get('/waiters/edit/{id}', [WaiterController::class, 'edit'])->name('waiters.edit');
        Route::put('/waiters/update/{id}', [WaiterController::class, 'update'])->name('waiters.update');
        Route::delete('/waiters/delete/{id}', [WaiterController::class, 'destroy'])->name('waiters.destroy');
        
        // Items
        Route::get('/items', [ItemController::class, 'index'])->name('items');
        Route::get('/items/export', [ItemController::class, 'export'])->name('items.export');
        Route::get('/items/sample', [ItemController::class, 'downloadSample'])->name('items.sample');
        Route::post('/items/import', [ItemController::class, 'import'])->name('items.import');
        Route::get('/items/create', [ItemController::class, 'create'])->name('items.create');
        Route::post('/items', [ItemController::class, 'store'])->name('items.store');
        Route::get('/items/{item}/edit', [ItemController::class, 'edit'])->name('items.edit');
        Route::put('/items/{item}', [ItemController::class, 'update'])->name('items.update');
        Route::delete('/items/{item}', [ItemController::class, 'destroy'])->name('items.destroy');
        
        // Inventory
        Route::get('/inventory', [InventoryController::class, 'index'])->name('inventory.index');

        //Purchase Section
        Route::get('shops', [PurchaseShopController::class,'index'])->name('purchase.shops.index');
        Route::get('/admin/add-shops', [PurchaseShopController::class, 'create'])->name('purchase.shops.create');
        Route::post('shops', [PurchaseShopController::class,'store'])->name('purchase.shops.store');
        Route::get('shops/{id}-edit', [PurchaseShopController::class,'edit'])->name('purchase.shops.edit');
        Route::put('shops/{id}', [PurchaseShopController::class,'update'])->name('purchase.shops.update');

        Route::get('/purchases', [PurchaseItemController::class,'index'])->name('purchase.item.index');
        Route::get('/purchases/create', [PurchaseItemController::class, 'create'])->name('purchase.items.create');
        Route::post('/purchases', [PurchaseItemController::class, 'store'])->name('purchases.store');
        Route::get('purchase-item/edit/{id}', [PurchaseItemController::class,'edit'])->name('purchase.item.edit');
        Route::put('purchase-item/update/{id}', [PurchaseItemController::class,'update'])->name('purchase.item.update');
        Route::delete('purchase-item/delete/{id}', [PurchaseItemController::class,'destroy'])->name('purchase.item.delete');
        
        //Expense Categories
        Route::prefix('expense-category')->group(function () {
            Route::get('/', [ExpenseCategoryController::class, 'index'])->name('expense.category.index');
            Route::get('/create', [ExpenseCategoryController::class, 'create'])->name('expense.category.create');
            Route::post('/expense-category/store', [ExpenseCategoryController::class,'store'])->name('expense.category.store');
            Route::get('/edit/{id}', [ExpenseCategoryController::class, 'edit'])->name('expense.category.edit');
            Route::put('/update/{id}', [ExpenseCategoryController::class, 'update'])->name('expense.category.update');
            Route::delete('/delete/{id}', [ExpenseCategoryController::class, 'destroy'])->name('expense.category.delete');
        });
        
        //Expense Person
        Route::prefix('expense-person')->group(function () {
            Route::get('/', [ExpensePersonController::class, 'index'])->name('expense.person.index');   
            Route::get('/create', [ExpensePersonController::class, 'create'])->name('expense.person.create');
            Route::post('/store', [ExpensePersonController::class, 'store'])->name('expense.person.store');
            Route::get('/edit-{id}', [ExpensePersonController::class, 'edit'])->name('expense.person.edit');
            Route::put('/update/{id}', [ExpensePersonController::class, 'update'])->name('expense.person.update');
            Route::delete('/delete/{id}', [ExpensePersonController::class, 'destroy'])->name('expense.person.delete');
        });
        
        //Expense Item
        Route::prefix('expense-item')->group(function () {
            Route::get('/', [ExpenseItemController::class, 'index'])->name('expense.item.index');
            Route::get('/create', [ExpenseItemController::class, 'create'])->name('expense.item.create');
            Route::post('/store', [ExpenseItemController::class, 'store'])->name('expense.item.store');
            Route::get('/edit-{id}', [ExpenseItemController::class, 'edit'])->name('expense.item.edit');
            Route::put('/update/{id}', [ExpenseItemController::class, 'update'])->name('expense.item.update');
            Route::delete('/delete/{id}', [ExpenseItemController::class, 'destroy'])->name('expense.item.delete');
        });
        
        //Savings
        Route::get('/savings', [SavingController::class,'index'])->name('savings.index');
        Route::post('/savings', [SavingController::class,'store'])->name('savings.store');
        Route::delete('/admin/savings/{id}', [SavingController::class, 'destroy'])->name('savings.delete');

        // Settings
        Route::get('/settings', [App\Http\Controllers\SettingController::class, 'index'])->name('settings.index');
        Route::put('/settings', [App\Http\Controllers\SettingController::class, 'update'])->name('settings.update');

        // Roles and Permissions
        Route::get('/roles-permissions', [App\Http\Controllers\RolePermissionController::class, 'index'])->name('roles.index');
        Route::post('/roles/store', [App\Http\Controllers\RolePermissionController::class, 'storeRole'])->name('roles.store');
        Route::post('/permissions/store', [App\Http\Controllers\RolePermissionController::class, 'storePermission'])
			->name('permissions.store');
        Route::post('/roles/{role}/assign-permissions', [App\Http\Controllers\RolePermissionController::class, 'assignPermission'])
			->name('roles.assign_permissions');
        Route::post('/admins/{admin}/assign-roles', [App\Http\Controllers\RolePermissionController::class, 'assignRole'])
			->name('admins.assign_roles');
        Route::delete('/roles/{role}', [App\Http\Controllers\RolePermissionController::class, 'destroyRole'])->name('roles.destroy');
		Route::post('/users/store', [App\Http\Controllers\RolePermissionController::class, 'storeUser'])->name('users.store');
		Route::post('/users/{user}/roles', [App\Http\Controllers\RolePermissionController::class, 'assignUserRole'])
			->name('users.assign_roles');
		Route::post('/admins/{admin}/assign-role', [RolePermissionController::class, 'assignRole'])->name('admins.assign_role');
		
    });

    // POS & ORDER MANAGEMENT (Accessible to both Admin and Cashier)
    Route::middleware(['permission:manage-orders'])->group(function () {
        Route::get('/pos', [OrderController::class, 'pos'])->name('pos');
        Route::resource('orders', OrderController::class);
        Route::get('/get-items', [OrderController::class, 'getItems'])->name('get.items');
        Route::get('/get-running-orders', [OrderController::class, 'getRunningOrders'])->name('orders.running');
        Route::post('/orders/{order}/complete', [OrderController::class, 'complete'])->name('orders.complete');
        Route::get('/orders/{id}/details', [OrderController::class, 'getOrderDetails'])->name('orders.details');
        Route::post('orders/{order}/update-items', [OrderController::class, 'updateOrderItem'])->name('orders.update.order.item');
        Route::get('/orders/{order}/pdf', [OrderController::class, 'generatePdf'])->name('orders.pdf');
        Route::patch('orders/{order}/status', [OrderController::class, 'updateStatus'])->name('orders.updateStatus');
        Route::get('/orders/refresh', [OrderController::class, 'ordersPartial']);
        
        // Missing POS sub-routes
        Route::get('/get-tables/{area}', [OrderController::class, 'getTables'])->name('orders.get-tables');
        Route::get('/items/variations', [OrderController::class, 'getVariations'])->name('items.variationss');
        Route::post('/orders/{order}/assign-table',[OrderController::class, 'assignTable'])->name('orders.assign.table');
        Route::get('/orders/check-table/{tableId}', [OrderController::class, 'checkTableAvailability'])->name('orders.check-table');

        Route::get('/customers/search', [OrderController::class, 'search'])->name('customers.search');
        Route::post('/customers/store-ajax', [OrderController::class, 'storeAjax'])->name('customers.store.ajax');
        
        Route::get('/takeaway-orders', [TakeAwayController::class, 'index'])->name('takeaway.orders');
        Route::get('/takeaway-orders/{id}', [TakeAwayController::class, 'show'])->name('takeaway.orders.show');
        Route::patch('/takeaway-orders/{order}/status', [TakeAwayController::class,'updateStatus'])->name('takeaway.orders.updateStatus');
        Route::get('/admin/takeaway-orders/search', [TakeAwayController::class, 'search'])->name('takeaway.orders.search');
        Route::get('/takeaway-orders/{id}/invoice', [TakeAwayController::class, 'printInvoice'])->name('takeaway.orders.invoice');
        Route::patch('/takeaway-orders/{id}/payment-status', [TakeAwayController::class, 'updatePaymentStatus'])
                     ->name('takeaway.orders.updatePaymentStatus');
    });

    // COMMON AUTHENTICATED ROUTES
    Route::get('/profile', [App\Http\Controllers\AdminProfileController::class, 'index'])->name('admin.profile');
    Route::put('/profile/update', [App\Http\Controllers\AdminProfileController::class, 'update'])->name('admin.profile.update');
    
    // Resource routes that were already there
    Route::resource('invoices', InvoiceController::class);
    Route::resource('spice-levels', App\Http\Controllers\SpiceLevelController::class);
    Route::resource('restaurants', RestaurantController::class);
});
	Route::get('/book-tables', [BookTableController::class, 'index'])->name('book_tables.index');
Route::post('/book-tables/{id}/assign', [BookTableController::class, 'assign'])->name('book_tables.assign');
Route::post('/book-table/store', [BookTableController::class, 'store'])->name('book.table.store');
Route::post('/book-tables/{id}/cancel', [BookTableController::class, 'cancel'])
    ->name('book_tables.cancel');
Route::get('/book-tables/search', [BookTableController::class, 'search'])
    ->name('book_tables.search');

Route::get('/contact/enquiry', [ContactEnquiryController::class, 'index'])->name('contact.index');
Route::get('/contact', [ContactEnquiryController::class, 'create'])->name('contact.create');
Route::post('/contact', [ContactEnquiryController::class, 'store'])->name('contact.store');  
Route::delete('/contacts/{id}', [ContactEnquiryController::class, 'destroy'])->name('contact.delete');


Route::get('/about', function () {
    return view('front.about');
});
Route::get('/menu', [FrontController::class, 'menu'])->name('menu');


Route::get('/orders', function () {
    return view('frontend.orders');
});

Route::get('/gallery', function () {
    return view('front.gallery');
});

Route::get('/contact', function () {
    return view('front.contact');
});