detectCountry(); //error_log("\n".'isoCode:: '. $isoCode ."",3,ERROR_LOG); // Convert ISO code to country ID and store in session $countryId = getCountryIdByIsoCode($isoCode); //error_log("\n".'countryId:: '. $countryId ."",3,ERROR_LOG); if ($countryId > 0) { $_SESSION['webpage_country'] = $countryId; } } } // ======================================== // Get the request URI and clean it $requestUri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); // For subdirectory support: strip the base path from the request URI if (defined('BASE_PATH') && !empty(BASE_PATH) && strpos($requestUri, BASE_PATH) === 0) { $requestUri = substr($requestUri, strlen(BASE_PATH)); } $requestUri = rtrim($requestUri, '/'); $method = $_SERVER['REQUEST_METHOD']; // Handle special action routes via query parameter if (isset($_GET['action'])) { $action = $_GET['action']; // CAPTCHA image endpoint - outputs binary PNG image if ($action === 'captcha_image') { header('Content-Type: image/png'); header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0'); header('Pragma: no-cache'); header('Expires: 0'); \Core\Captcha::generateImage(); exit; } } // Simple Routing switch ($requestUri) { // --- Page Routes (GET) --- case '': case '/home': $controller = new \Controllers\HomeController(); $controller->index(); break; case '/group': $controller = new \Controllers\GroupController(); $controller->index(); break; case '/category': $controller = new \Controllers\CategoryController(); $controller->index(); break; case '/product': $controller = new \Controllers\ProductDetailsController(); $controller->index(); break; case '/cart': $controller = new \Controllers\CartController(); $controller->index(); break; case '/checkout': $controller = new \Controllers\CheckoutController(); $controller->index(); break; case '/orders': $controller = new \Controllers\OrderController(); $controller->index(); break; case '/order/details': $controller = new \Controllers\OrderController(); $controller->details(); break; case '/order/success': $controller = new \Controllers\OrderController(); $controller->success(); break; case '/login': require_once __DIR__ . '/../src/Views/login.php'; break; case '/signup': require_once __DIR__ . '/../src/Views/signup.php'; break; case '/forgot-password': $controller = new \Controllers\UserController(); if ($method === 'POST') { $controller->sendResetLink(); } else { $controller->forgotPasswordForm(); } break; case '/reset-password': $controller = new \Controllers\UserController(); if ($method === 'POST') { $controller->handleResetPassword(); } else { $controller->resetPasswordForm(); } break; case '/verify': require_once __DIR__ . '/../src/Views/verify.php'; break; case '/resend-verification': $controller = new \Controllers\UserController(); $controller->resendVerification(); break; case '/dashboard': require_auth(); require_once __DIR__ . '/../src/Views/dashboard.php'; break; case '/wallet/apply-agent': require_auth(); $controller = new \Controllers\UserController(); if ($method === 'POST') { $controller->initiateAgentApplication(); } else { header('Location: ' . BASE_PATH . '/dashboard'); } break; case '/complete-profile': require_auth(); $controller = new \Controllers\UserController(); if ($method === 'POST') { $controller->updateProfile(); } else { $controller->completeProfileForm(); } break; case '/business-request': require_auth(); $controller = new \Controllers\UserController(); $controller->businessRequestForm(); break; case '/change-password': require_auth(); $controller = new \Controllers\UserController(); $controller->changePasswordForm(); break; case '/product-add': require_auth(); \Core\Auth::requirePermission('product.create'); require_once __DIR__ . '/../src/Views/product-add.php'; break; case '/product-list': require_auth(); \Core\Auth::requirePermission('product.create'); require_once __DIR__ . '/../src/Views/product-list.php'; break; case '/product-view': require_auth(); \Core\Auth::requirePermission('product.view'); require_once __DIR__ . '/../src/Views/product-view.php'; break; case '/product-edit': require_auth(); \Core\Auth::requirePermission('product.edit'); require_once __DIR__ . '/../src/Views/product-edit.php'; break; case '/product-price': require_auth(); \Core\Auth::requirePermission('product.set_price'); require_once __DIR__ . '/../src/Views/product-price.php'; break; case '/user-list': \Core\Auth::requirePermission('admin.users'); $controller = new \Controllers\AdminController(); $controller->userList(); break; case '/admin/country-settings': \Core\Auth::requirePermission('admin.users'); $controller = new \Controllers\AdminController(); $controller->countrySettings(); break; case '/admin/country-edit-assignments': \Core\Auth::requirePermission('admin.users'); $controller = new \Controllers\AdminController(); $controller->editCountryAssignments(); break; case '/admin/country-save-assignments': \Core\Auth::requirePermission('admin.users'); $controller = new \Controllers\AdminController(); $controller->saveCountryAssignments(); break; case '/admin/country-update-code': \Core\Auth::requirePermission('admin.users'); $controller = new \Controllers\AdminController(); $controller->updateCountryCode(); break; case '/signin-logs': \Core\Auth::requirePermission('admin.users'); $controller = new \Controllers\AdminController(); $controller->signinLogs(); break; case '/admin/error-logs': \Core\Auth::requirePermission('admin.users'); $controller = new \Controllers\AdminController(); $controller->errorLogs(); break; case '/admin/error-logs/empty': \Core\Auth::requirePermission('admin.users'); $controller = new \Controllers\AdminController(); $controller->emptyErrorLogs(); break; case '/admin/db-error-logs': \Core\Auth::requirePermission('admin.users'); $controller = new \Controllers\AdminController(); $controller->dbErrorLogs(); break; case '/admin/db-error-logs/empty': \Core\Auth::requirePermission('admin.users'); $controller = new \Controllers\AdminController(); $controller->emptyDbErrorLogs(); break; case '/admin/banner-settings': \Core\Auth::requirePermission('admin.users'); $controller = new \Controllers\AdminController(); $controller->bannerSettings(); break; case '/admin/banner-settings/store': \Core\Auth::requirePermission('admin.users'); $controller = new \Controllers\AdminController(); $controller->storeBanner(); break; case '/admin/banner-settings/edit': \Core\Auth::requirePermission('admin.users'); $controller = new \Controllers\AdminController(); $controller->editBanner(); break; case '/admin/banner-settings/update': \Core\Auth::requirePermission('admin.users'); $controller = new \Controllers\AdminController(); $controller->updateBanner(); break; case '/admin/banner-settings/delete': \Core\Auth::requirePermission('admin.users'); $controller = new \Controllers\AdminController(); $controller->deleteBanner(); break; case '/admin/category-groups': \Core\Auth::requirePermission('admin.users'); $controller = new \Controllers\AdminController(); $controller->categoryGroupAssociations(); break; case '/admin/languages': \Core\Auth::requirePermission('admin.users'); $controller = new \Controllers\AdminController(); $controller->languages(); break; case '/admin/languages/copy': \Core\Auth::requirePermission('admin.users'); $controller = new \Controllers\AdminController(); if ($method === 'POST') { $controller->storeCopiedLanguage(); } else { $controller->copyLanguageForm(); } break; case '/admin/roles': \Core\Auth::requirePermission('admin.users'); $controller = new \Controllers\RoleController(); $controller->index(); break; case '/admin/roles/edit': \Core\Auth::requirePermission('admin.users'); $controller = new \Controllers\RoleController(); $controller->edit(); break; case '/admin/roles/create': \Core\Auth::requirePermission('admin.users'); $controller = new \Controllers\RoleController(); $controller->create(); break; case '/admin/permissions': \Core\Auth::requirePermission('admin.users'); $controller = new \Controllers\PermissionController(); $controller->index(); break; case '/admin/permissions/create': \Core\Auth::requirePermission('admin.users'); $controller = new \Controllers\PermissionController(); $controller->create(); break; case '/admin/metadata': if (!\Core\Auth::isAdmin()) { header('Location: ' . BASE_PATH . '/dashboard'); exit; } $controller = new \Controllers\MetadataController(); $controller->index(); break; case '/admin/metadata/translate': \Core\Auth::requirePermission('translation.upload'); $controller = new \Controllers\MetadataController(); $controller->translationIndex(); break; case '/admin/metadata/translate/preview': \Core\Auth::requirePermission('translation.upload'); $controller = new \Controllers\MetadataController(); $controller->translationPreview(); break; case '/admin/metadata/export': \Core\Auth::requirePermission('translation.export'); $controller = new \Controllers\MetadataController(); $controller->exportMetadata(); break; case '/admin/product/translate': \Core\Auth::requirePermission('translation.upload') || \Core\Auth::requirePermission('product.translate'); $controller = new \Controllers\MetadataController(); $controller->productTranslationIndex(); break; case '/admin/product/translate/preview': \Core\Auth::requirePermission('translation.upload'); $controller = new \Controllers\MetadataController(); $controller->productTranslationPreview(); break; case '/admin/product/export': \Core\Auth::requirePermission('translation.export'); $controller = new \Controllers\MetadataController(); $controller->exportProducts(); break; case '/admin/translation': \Core\Auth::requirePermission('translation.upload'); $controller = new \Controllers\TranslationController(); $controller->index(); break; case '/admin/translation/preview': \Core\Auth::requirePermission('translation.upload'); $controller = new \Controllers\TranslationController(); $controller->preview(); break; case '/admin/translation/export': \Core\Auth::requirePermission('translation.export'); $controller = new \Controllers\TranslationController(); $controller->export(); break; case '/supplier-list': require_auth(); \Core\Auth::requirePermission('product.create'); require_once __DIR__ . '/../src/Views/supplier-list.php'; break; case '/supplier-add': require_auth(); \Core\Auth::requirePermission('product.create'); require_once __DIR__ . '/../src/Views/supplier-add.php'; break; case '/supplier-edit': require_auth(); \Core\Auth::requirePermission('product.create'); require_once __DIR__ . '/../src/Views/supplier-edit.php'; break; case '/classified-ads': $controller = new \Controllers\ClassifiedController(); $controller->index(); break; case '/classified': $controller = new \Controllers\ClassifiedController(); $controller->details(); break; case '/admin/classified': require_auth(); $controller = new \Controllers\AdminClassifiedController(); $controller->index(); break; case '/admin/classified/add': require_auth(); $controller = new \Controllers\AdminClassifiedController(); $controller->create(); break; case '/admin/classified/edit': require_auth(); $controller = new \Controllers\AdminClassifiedController(); $controller->edit(); break; case '/admin/classified/store': require_auth(); $controller = new \Controllers\AdminClassifiedController(); $controller->store(); break; case '/admin/classified/delete': require_auth(); $controller = new \Controllers\AdminClassifiedController(); $controller->delete(); break; case '/logout': session_destroy(); header('Location: ' . BASE_PATH . '/login'); break; // --- API Routes (POST) --- case '/api/language/switch': $controller = new \Controllers\HomeController(); $controller->switchLanguage(); break; case '/api/admin/classified/groups': require_auth_api(); $controller = new \Controllers\AdminClassifiedController(); $controller->getGroupsApi(); break; case '/api/home/products': $controller = new \Controllers\HomeController(); $controller->getMoreProducts(); break; case '/api/group/products': $controller = new \Controllers\GroupController(); $controller->getMoreProducts(); break; case '/api/category/products': $controller = new \Controllers\CategoryController(); $controller->getMoreProducts(); break; case '/api/product/related': $controller = new \Controllers\ProductDetailsController(); $controller->getRelatedProducts(); break; case '/api/product/related-html': $controller = new \Controllers\ProductDetailsController(); $controller->getRelatedProductsHtml(); break; case '/api/product/add': require_auth_api(); header('Content-Type: application/json'); $controller = new \Controllers\ProductController(); $response = $controller->create(); echo json_encode($response); break; case '/api/product/delete': require_auth_api(); header('Content-Type: application/json'); $controller = new \Controllers\ProductController(); $response = $controller->delete(); echo json_encode($response); break; case '/api/product/update': require_auth_api(); header('Content-Type: application/json'); $controller = new \Controllers\ProductController(); $response = $controller->update(); echo json_encode($response); break; case '/api/product/copy': require_auth_api(); header('Content-Type: application/json'); $controller = new \Controllers\ProductController(); $response = $controller->copy(); echo json_encode($response); break; case '/api/product/set-price': require_auth_api(); header('Content-Type: application/json'); $controller = new \Controllers\ProductController(); $response = $controller->setPrice(); echo json_encode($response); break; case '/api/country/currencies': require_auth_api(); header('Content-Type: application/json'); $controller = new \Controllers\ProductController(); $response = $controller->getCountryCurrencies(); echo json_encode($response); break; case '/api/category/groups': require_auth_api(); header('Content-Type: application/json'); $controller = new \Controllers\ProductController(); $response = $controller->getCategoryGroups(); echo json_encode($response); break; case '/api/category/features': require_auth_api(); header('Content-Type: application/json'); $controller = new \Controllers\ProductController(); $response = $controller->getFeatures(); echo json_encode($response); break; case '/api/supplier/list': require_auth_api(); header('Content-Type: application/json'); $controller = new \Controllers\SupplierController(); $response = $controller->index(); echo json_encode($response); break; case '/api/supplier/add': require_auth_api(); header('Content-Type: application/json'); $controller = new \Controllers\SupplierController(); $response = $controller->create(); echo json_encode($response); break; case '/api/supplier/update': require_auth_api(); header('Content-Type: application/json'); $controller = new \Controllers\SupplierController(); $response = $controller->update(); echo json_encode($response); break; case '/api/user/toggle-status': \Core\Auth::requirePermission('admin.users'); $controller = new \Controllers\AdminController(); $controller->toggleUserStatus(); break; case '/api/user/update-group': \Core\Auth::requirePermission('admin.users'); $controller = new \Controllers\AdminController(); $controller->updateUserGroup(); break; case '/api/user/change-password': require_auth_api(); $controller = new \Controllers\UserController(); $controller->updatePassword(); break; case '/api/user/request-business': require_auth_api(); $controller = new \Controllers\UserController(); $controller->requestBusinessAccount(); break; case '/api/countries': \Core\Auth::requirePermission('admin.users'); $controller = new \Controllers\AdminController(); $controller->getCountries(); break; case '/api/country/session': \Core\Auth::requirePermission('admin.users'); $controller = new \Controllers\AdminController(); $controller->setCountrySession(); break; case '/api/admin/categories': \Core\Auth::requirePermission('admin.users'); $controller = new \Controllers\AdminController(); $controller->apiGetCategoriesByLang(); break; case '/api/admin/groups': \Core\Auth::requirePermission('admin.users'); $controller = new \Controllers\AdminController(); $controller->apiGetGroupsByLang(); break; case '/api/admin/group-associations': \Core\Auth::requirePermission('admin.users'); $controller = new \Controllers\AdminController(); $controller->apiGetGroupAssociations(); break; case '/api/admin/category-groups/save': \Core\Auth::requirePermission('admin.users'); $controller = new \Controllers\AdminController(); $controller->saveCategoryGroupAssociations(); break; case '/api/supplier/delete': require_auth_api(); header('Content-Type: application/json'); $controller = new \Controllers\SupplierController(); $response = $controller->delete(); echo json_encode($response); break; case '/admin/translation/save': \Core\Auth::requirePermission('translation.upload'); $controller = new \Controllers\TranslationController(); $controller->save(); break; case '/admin/metadata/process': \Core\Auth::requirePermission('translation.upload'); $controller = new \Controllers\MetadataController(); $controller->process(); break; case '/admin/metadata/translate/save': \Core\Auth::requirePermission('translation.upload'); $controller = new \Controllers\MetadataController(); $controller->translationSave(); break; case '/admin/product/translate/save': \Core\Auth::requirePermission('translation.upload'); $controller = new \Controllers\MetadataController(); $controller->productTranslationSave(); break; case '/admin/roles/update': \Core\Auth::requirePermission('admin.users'); $controller = new \Controllers\RoleController(); $controller->update(); break; case '/admin/roles/store': \Core\Auth::requirePermission('admin.users'); $controller = new \Controllers\RoleController(); $controller->store(); break; case '/admin/permissions/store': \Core\Auth::requirePermission('admin.users'); $controller = new \Controllers\PermissionController(); $controller->store(); break; // --- Cart API Routes --- case '/api/cart/add': $controller = new \Controllers\CartController(); $controller->add(); break; case '/api/cart/update': $controller = new \Controllers\CartController(); $controller->update(); break; case '/api/cart/remove': $controller = new \Controllers\CartController(); $controller->remove(); break; case '/api/cart/count': $controller = new \Controllers\CartController(); $controller->getCount(); break; case '/api/checkout/place-order': $controller = new \Controllers\CheckoutController(); $controller->placeOrder(); break; case '/api/classified/enquire': $controller = new \Controllers\ClassifiedController(); $controller->submitEnquiry(); break; case '/api/classified/seller-phone': $controller = new \Controllers\ClassifiedController(); $controller->getSellerPhone(); break; // --- 404 Not Found --- default: http_response_code(404); echo "