<?php
class Router {
    private $routes = [];

    public function __construct() {
        $this->defineRoutes();
    }

    private function defineRoutes() {
        $this->routes = [
            'GET' => [
                '/api/products' => 'ProductController@getAll',
                '/api/products/{id}' => 'ProductController@getOne',
                '/api/cart' => 'CartController@getCart',
                '/api/admin/stats' => 'AdminController@getStats',
                '/api/admin/orders' => 'AdminController@getOrders',
                '/api/admin/products' => 'AdminController@getProducts',
                '/api/admin/users' => 'AdminController@getUsers',
                '/api/admin/beauty-bookings' => 'AdminController@getBeautyBookings',
                '/api/admin/beauty-services' => 'AdminController@getBeautyServices',
                '/api/admin/identity-design' => 'AdminController@getIdentityDesign',
                '/api/admin/identity-profiles' => 'AdminController@getIdentityProfiles',
                '/api/admin/posts' => 'AdminController@getPosts',
                '/api/posts' => 'PostController@getAll',
                '/api/posts/{id}' => 'PostController@getOne',
                '/api/posts/{id}/comments' => 'PostController@getComments',
                '/api/reviews' => 'ReviewController@getAllReviews',
                '/api/reviews/{product_id}' => 'ReviewController@getReviews',
                '/api/products/{product_id}/rating' => 'ReviewController@getProductRating',
                '/api/beauty-services' => 'BeautyController@getServices',
                '/api/beauty-services/{id}' => 'BeautyController@getService',
                '/api/beauty-bookings' => 'BeautyController@getBookings',
                '/api/beauty-bookings/user/{user_id}' => 'BeautyController@getUserBookings',
            ],
            'POST' => [
                '/api/auth/login' => 'AuthController@login',
                '/api/auth/register' => 'AuthController@register',
                '/api/cart' => 'CartController@addToCart',
                '/api/orders' => 'OrderController@createOrder',
                '/api/reviews' => 'ReviewController@createReview',
                '/api/beauty-bookings' => 'BeautyController@createBooking',
                '/api/admin/beauty-services' => 'AdminController@addBeautyService',
                '/api/admin/social-media' => 'AdminController@saveSocialMedia',
                '/api/admin/identity-design' => 'AdminController@saveIdentityDesign',
                '/api/admin/brand-colors' => 'AdminController@saveBrandColors',
                '/api/admin/identity-profiles' => 'AdminController@addIdentityProfile',
                '/api/admin/identity-profiles/:id' => 'AdminController@updateIdentityProfile',
                '/api/admin/hero-section' => 'AdminController@saveHeroSection',
                '/api/admin/posts' => 'AdminController@addPost',
                '/api/posts/{id}/like' => 'PostController@likePost',
                '/api/posts/{id}/comments' => 'PostController@addComment',
            ],
            'PUT' => [
                '/api/cart/{id}' => 'CartController@updateCartItem',
                '/api/admin/orders/{id}/status' => 'AdminController@updateOrderStatus',
                '/api/reviews/{id}' => 'ReviewController@updateReview',
                '/api/admin/reviews/{id}/approve' => 'ReviewController@approveReview',
                '/api/admin/reviews/{id}/hide' => 'ReviewController@hideReview',
                '/api/admin/reviews/{id}/show' => 'ReviewController@showReview',
                '/api/reviews/admin/approve' => 'ReviewController@approveReview',
                '/api/reviews/admin/hide' => 'ReviewController@hideReview',
                '/api/reviews/admin/show' => 'ReviewController@showReview',
                '/api/admin/categories/{id}/toggle' => 'AdminController@toggleCategory',
                '/api/beauty-bookings/{id}/status' => 'BeautyController@updateBookingStatus',
                '/api/admin/beauty-bookings/{id}/status' => 'AdminController@updateBeautyBookingStatus',
                '/api/admin/beauty-services/{id}/toggle' => 'AdminController@toggleBeautyService',
                '/api/admin/beauty-services/{id}' => 'AdminController@updateBeautyService',
            ],
            'DELETE' => [
                '/api/cart/{id}' => 'CartController@removeFromCart',
                '/api/admin/products/{id}' => 'AdminController@deleteProduct',
                '/api/admin/users/{id}' => 'AdminController@deleteUser',
                '/api/admin/posts/{id}' => 'AdminController@deletePost',
                '/api/reviews/{id}' => 'ReviewController@deleteReview',
                '/api/admin/reviews/{id}' => 'ReviewController@deleteReviewAdmin',
                '/api/reviews/admin/delete' => 'ReviewController@deleteReviewAdmin',
                '/api/admin/beauty-services/{id}' => 'AdminController@deleteBeautyService',
                '/api/admin/identity-profiles/{id}' => 'AdminController@deleteIdentityProfile',
                '/api/admin/categories/{id}' => 'AdminController@deleteCategory',
            ],
        ];
    }

    public function handleRequest() {
        $method = $_SERVER['REQUEST_METHOD'];
        $uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);

        // Remove base path if needed
        $uri = str_replace('/backend', '', $uri);

        foreach ($this->routes[$method] ?? [] as $route => $handler) {
            $pattern = preg_replace('/\{([^}]+)\}/', '(?P<$1>[^/]+)', $route);
            $pattern = str_replace('/', '\/', $pattern);
            $pattern = '/^' . $pattern . '$/';

            if (preg_match($pattern, $uri, $matches)) {
                list($controller, $action) = explode('@', $handler);
                $this->callController($controller, $action, array_filter($matches, 'is_string', ARRAY_FILTER_USE_KEY));
                return;
            }
        }

        http_response_code(404);
        echo json_encode(['error' => 'Route not found']);
    }

    private function callController($controllerName, $action, $params = []) {
        // Convert CamelCase to snake_case for filename (e.g., AdminController -> admin_controller)
        $fileName = strtolower(preg_replace('/([a-z])([A-Z])/', '$1_$2', $controllerName));
        $controllerFile = __DIR__ . '/../controllers/' . $fileName . '.php';

        if (file_exists($controllerFile)) {
            require_once $controllerFile;
            $controller = new $controllerName();
            $controller->$action($params);
        } else {
            http_response_code(500);
            echo json_encode(['error' => 'Controller not found: ' . $controllerFile]);
        }
    }
}
?>