<?php

class ACCJ_Access_Middleware {

    private $acl;

    public function __construct(Accj_ACL $acl) {
        $this->acl = $acl;
        add_action('template_redirect', [$this, 'check_page_access']);
        // اگر REST API دارید:
        // add_filter('rest_authentication_errors', [$this, 'check_rest_api_access'], 10, 3);
    }

    public function check_page_access() {
        if (is_admin()) {
            return; // این middleware فقط برای فرانت‌اند است، ادمین وردپرس ACL خود را دارد
        }

        $user_id = get_current_user_id();

        // مثال: حفاظت از یک صفحه خاص با slug 'private-page'
        if (is_page('private-page')) {
            if (!$user_id) {
                // کاربر وارد نشده است
                wp_redirect(wp_login_url(get_permalink()));
                exit;
            }
            if (!$this->acl->user_can($user_id, 'private_page', 'view')) {
                wp_die(__('شما اجازه دسترسی به این صفحه را ندارید.', 'accj-acl'));
            }
        }

        // مثال: حفاظت از یک نوع پست سفارشی
        if (is_singular('custom_post_type_example')) {
            if (!$user_id) {
                wp_redirect(wp_login_url(get_permalink()));
                exit;
            }
            if (!$this->acl->user_can($user_id, 'custom_post_type', 'view')) {
                wp_die(__('شما اجازه مشاهده این نوع محتوا را ندارید.', 'accj-acl'));
            }
        }
        // می‌توانید منطق‌های پیچیده‌تر را اینجا اضافه کنید
    }

    // متد برای REST API (اگر نیاز داشته باشید)
    public function check_rest_api_access($result, $server, $request) {
        if (!empty($result)) {
            return $result;
        }

        $route = $request->get_route();
        $method = $request->get_method();
        $user_id = get_current_user_id();

        // مثال: حفاظت از یک endpoint خاص
        if (strpos($route, '/my-custom-api/v1/data') !== false && $method === 'GET') {
            if (!$user_id || !$this->acl->user_can($user_id, 'api_data', 'view')) {
                return new WP_Error('rest_forbidden', __('شما اجازه دسترسی به این API را ندارید.', 'accj-acl'), ['status' => 401]);
            }
        }

        return $result;
    }
}
