<?php

if (!defined('ABSPATH')) {
    exit;
}

final class BBC_REST
{
    public static function boot()
    {
        add_action('rest_api_init', array(__CLASS__, 'routes'));
        add_action('admin_menu', array(__CLASS__, 'admin_page'));
    }

    public static function routes()
    {
        register_rest_route('bbc/v1', '/enroll', array(
            'methods' => 'POST',
            'callback' => array(__CLASS__, 'enroll'),
            'permission_callback' => function () { return current_user_can('activate_plugins'); },
        ));
        register_rest_route('bbc/v1', '/command', array(
            'methods' => 'POST',
            'callback' => array(__CLASS__, 'command'),
            'permission_callback' => array('BBC_Auth', 'verify_command'),
        ));
    }

    public static function enroll(WP_REST_Request $request)
    {
        $result = BBC_Auth::enroll($request);
        return is_wp_error($result) ? $result : new WP_REST_Response(array('success' => true, 'identity' => $result), 201);
    }

    public static function command(WP_REST_Request $request)
    {
        $cached = $request->get_param('_bbc_cached_result');
        if (is_array($cached)) return new WP_REST_Response($cached, 200);
        $body = $request->get_json_params();
        $action = isset($body['action']) ? sanitize_key($body['action']) : '';
        $payload = isset($body['payload']) && is_array($body['payload']) ? $body['payload'] : array();
        if ($action === 'status') {
            $identity = get_option(BBC_OPTION_IDENTITY, array());
            $result = array('success' => true, 'version' => BBC_VERSION, 'site_id' => isset($identity['site_id']) ? $identity['site_id'] : '', 'placement_count' => count(BBC_Placements::all()), 'placements' => BBC_Placements::summaries(), 'capabilities' => array('bbc_native_page', 'bbc_elementor', 'bbc_block_template', 'bbc_runtime'));
        } elseif ($action === 'placement_upsert') {
            $result = BBC_Placements::upsert($payload);
        } elseif ($action === 'placement_inspect') {
            $result = BBC_Placements::inspect(isset($payload['placement_id']) ? (string) $payload['placement_id'] : '');
        } elseif ($action === 'placement_remove') {
            $result = BBC_Placements::remove(isset($payload['placement_id']) ? (string) $payload['placement_id'] : '');
        } elseif ($action === 'key_rotate') {
            $result = BBC_Auth::rotate_key(isset($payload['key_id']) ? (string) $payload['key_id'] : '', isset($payload['public_key']) ? (string) $payload['public_key'] : '');
            if ($result === true) $result = array('success' => true, 'rotated' => true);
        } elseif ($action === 'connector_retire') {
            $result = BBC_Guardian::retire();
        } else {
            $result = new WP_Error('bbc_action_rejected', 'BBC command is not supported.', array('status' => 400));
        }
        if (is_wp_error($result)) return $result;
        if (!isset($result['success'])) $result['success'] = true;
        BBC_Auth::record_result($request, $result);
        return new WP_REST_Response($result, 200);
    }

    public static function admin_page()
    {
        add_options_page('BBC', 'BBC', 'activate_plugins', 'bbc', array(__CLASS__, 'render_admin'));
    }

    public static function render_admin()
    {
        if (!current_user_can('activate_plugins')) return;
        $identity = get_option(BBC_OPTION_IDENTITY, array());
        echo '<div class="wrap"><h1>BBC</h1><div id="bbc-connector" data-rest-url="' . esc_attr(rest_url('bbc/v1/enroll')) . '" data-rest-nonce="' . esc_attr(wp_create_nonce('wp_rest')) . '">';
        echo '<p>Status: <strong>' . (empty($identity) ? 'Not enrolled' : 'Enrolled') . '</strong></p>';
        if (!empty($identity['site_id'])) echo '<p>Site ID: <code>' . esc_html($identity['site_id']) . '</code></p>';
        echo '<p>Version: <code>' . esc_html(BBC_VERSION) . '</code></p></div></div>';
    }
}
