<?php
/**
 * UserPrefs_Controller — تنظیمات و تاریخچه کاربر (cross-device)
 *
 * استفاده عمومی:
 *   GET    /acc/v1/user/prefs/{key}
 *   PUT    /acc/v1/user/prefs/{key}   body: { value: any }
 *   DELETE /acc/v1/user/prefs/{key}
 *   GET    /acc/v1/user/prefs            (لیست همه کلیدها)
 *
 * نمونه‌های کاربرد:
 *   - گزینه‌های GIS: gis_selected_blocks
 *   - تب‌های باز: open_tabs
 *   - تنظیمات نمایش: ui_theme
 *   - هر چیزی که باید بین دستگاه‌ها همگام بماند
 */

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

class UserPrefs_Controller {

    public static function register_routes(): void {
        $ns = 'acc/v1';
        $p  = 'acc_jwt_check_permission';

        register_rest_route( $ns, '/user/prefs', [
            'methods'             => 'GET',
            'callback'            => [ self::class, 'list_prefs' ],
            'permission_callback' => $p,
        ] );

        register_rest_route( $ns, '/user/prefs/(?P<key>[a-zA-Z0-9_\-]+)', [
            [
                'methods'             => 'GET',
                'callback'            => [ self::class, 'get_pref' ],
                'permission_callback' => $p,
            ],
            [
                'methods'             => 'PUT',
                'callback'            => [ self::class, 'set_pref' ],
                'permission_callback' => $p,
            ],
            [
                'methods'             => 'DELETE',
                'callback'            => [ self::class, 'delete_pref' ],
                'permission_callback' => $p,
            ],
        ] );
    }

    /** تعیین user_id فعلی از JWT */
    private static function _user_id(): int {
        // اول از get_current_user_id (احتمالاً توسط jwt middleware ست شده)
        $uid = (int) get_current_user_id();
        if ( $uid > 0 ) return $uid;

        // در صورت نیاز fallback از JWT
        if ( isset( $GLOBALS['acc_jwt_user_id'] ) ) return (int) $GLOBALS['acc_jwt_user_id'];

        return 0;
    }

    /** لیست همه کلیدهای کاربر */
    public static function list_prefs( WP_REST_Request $req ): WP_REST_Response {
        global $wpdb;
        $uid = self::_user_id();
        if ( ! $uid ) return new WP_REST_Response( ['message' => 'unauthorized'], 401 );

        $rows = $wpdb->get_results( $wpdb->prepare(
            "SELECT preference_key, preference_value, updated_at
             FROM {$wpdb->prefix}user_preferences
             WHERE user_id = %d
             ORDER BY updated_at DESC",
            $uid
        ), ARRAY_A );

        $data = [];
        foreach ( $rows ?? [] as $row ) {
            $decoded = json_decode( $row['preference_value'], true );
            $data[ $row['preference_key'] ] = [
                'value'      => $decoded !== null ? $decoded : $row['preference_value'],
                'updated_at' => $row['updated_at'],
            ];
        }
        return new WP_REST_Response( ['data' => $data] );
    }

    /** خواندن یک کلید */
    public static function get_pref( WP_REST_Request $req ): WP_REST_Response {
        global $wpdb;
        $uid = self::_user_id();
        if ( ! $uid ) return new WP_REST_Response( ['message' => 'unauthorized'], 401 );

        $key = sanitize_key( $req->get_param( 'key' ) ?? '' );
        if ( ! $key ) return new WP_REST_Response( ['message' => 'key الزامی است'], 400 );

        $row = $wpdb->get_row( $wpdb->prepare(
            "SELECT preference_value, updated_at
             FROM {$wpdb->prefix}user_preferences
             WHERE user_id = %d AND preference_key = %s",
            $uid, $key
        ), ARRAY_A );

        if ( ! $row ) return new WP_REST_Response( ['data' => null] );

        $decoded = json_decode( $row['preference_value'], true );
        return new WP_REST_Response( [
            'data' => $decoded !== null ? $decoded : $row['preference_value'],
            'updated_at' => $row['updated_at'],
        ] );
    }

    /** ذخیره یا به‌روزرسانی یک کلید */
    public static function set_pref( WP_REST_Request $req ): WP_REST_Response {
        global $wpdb;
        $uid = self::_user_id();
        if ( ! $uid ) return new WP_REST_Response( ['message' => 'unauthorized'], 401 );

        $key = sanitize_key( $req->get_param( 'key' ) ?? '' );
        if ( ! $key ) return new WP_REST_Response( ['message' => 'key الزامی است'], 400 );

        // value می‌تواند هر JSON باشد (object/array/string/number)
        $value = $req->get_param( 'value' );
        if ( $value === null ) {
            // body خالی → از کل body به عنوان value
            $body = $req->get_json_params();
            $value = $body['value'] ?? $body;
        }

        $encoded = wp_json_encode( $value );
        if ( $encoded === false ) {
            return new WP_REST_Response( ['message' => 'value باید قابل json باشد'], 400 );
        }

        // upsert
        $exists = $wpdb->get_var( $wpdb->prepare(
            "SELECT id FROM {$wpdb->prefix}user_preferences
             WHERE user_id = %d AND preference_key = %s",
            $uid, $key
        ) );

        if ( $exists ) {
            $wpdb->update(
                "{$wpdb->prefix}user_preferences",
                ['preference_value' => $encoded],
                ['id' => $exists]
            );
        } else {
            $wpdb->insert(
                "{$wpdb->prefix}user_preferences",
                [
                    'user_id'          => $uid,
                    'preference_key'   => $key,
                    'preference_value' => $encoded,
                ]
            );
        }

        return new WP_REST_Response( ['success' => true] );
    }

    /** حذف یک کلید */
    public static function delete_pref( WP_REST_Request $req ): WP_REST_Response {
        global $wpdb;
        $uid = self::_user_id();
        if ( ! $uid ) return new WP_REST_Response( ['message' => 'unauthorized'], 401 );

        $key = sanitize_key( $req->get_param( 'key' ) ?? '' );
        $wpdb->delete( "{$wpdb->prefix}user_preferences", [
            'user_id'        => $uid,
            'preference_key' => $key,
        ] );

        return new WP_REST_Response( ['success' => true] );
    }
}
