<?php
/**
 * 1MZ For Artists — Notification Preferences Controller (1.6.37)
 *
 * Endpoints para o app ler/gravar preferências de push notifications
 * por categoria.
 *
 * Routes:
 *   GET  /1mz/v1/notifications/prefs        — lê prefs do user actual
 *   PUT  /1mz/v1/notifications/prefs        — actualiza prefs do user
 *
 * Categorias: ver `RMBZ_NOTIF_CATEGORIES` em notifications-core.php.
 * Default = tudo activado. Quando o user desactiva uma categoria, o
 * push notification para os tipos dessa categoria é silenciado (a
 * notificação continua a ser criada na BD, visível no sino do app).
 *
 * @package 1MZ_For_Artists
 * @since 1.6.37
 */

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

if ( ! defined( 'RMBZ_API_NOTIF_PREFS_VERSION' ) ) {
    define( 'RMBZ_API_NOTIF_PREFS_VERSION', '1.6.37.0' );
}

add_action( 'rest_api_init', 'rmbz_api_register_notif_prefs_routes' );

function rmbz_api_register_notif_prefs_routes() {
    register_rest_route( RMBZ_API_NAMESPACE, '/notifications/prefs', [
        [
            'methods'             => 'GET',
            'callback'            => 'rmbz_api_handle_get_notif_prefs',
            'permission_callback' => 'rmbz_api_require_auth',
        ],
        [
            'methods'             => 'PUT',
            'callback'            => 'rmbz_api_handle_update_notif_prefs',
            'permission_callback' => 'rmbz_api_require_auth',
            'args' => [
                'prefs' => [
                    'required' => true,
                    'type'     => 'object',
                ],
            ],
        ],
    ] );
}

/**
 * Devolve a lista de categorias com labels + estado actual.
 *
 * Formato:
 * {
 *   "_api_version": "1.6.37.0",
 *   "categories": [
 *     { "key": "releases",    "label": "Releases",        "description": "Quando um release fica live ou volta para correcção", "enabled": true },
 *     { "key": "submissions", "label": "Submissões",      "description": "Mudanças de estado das tuas submissões Site/Redes",   "enabled": true },
 *     { "key": "money",       "label": "Levantamentos",   "description": "Aprovação ou rejeição de pedidos de levantamento",    "enabled": true },
 *     { "key": "license",     "label": "Licenças e SOMAS","description": "Estado de pedidos de licença e SOMAS",                "enabled": true }
 *   ]
 * }
 */
function rmbz_api_handle_get_notif_prefs( WP_REST_Request $request ) {
    $telemovel = (string) $request->get_param( 'rmbz_telemovel' );
    if ( empty( $telemovel ) ) {
        return rmbz_api_error( 'Sessão inválida.', 401, 'auth_required' );
    }

    $prefs = rmbz_notif_get_user_prefs( $telemovel );

    $categories = [
        [
            'key'         => 'releases',
            'label'       => 'Releases',
            'description' => 'Quando um release fica live ou volta para correcção',
            'enabled'     => (bool) ( $prefs['releases'] ?? true ),
        ],
        [
            'key'         => 'submissions',
            'label'       => 'Submissões',
            'description' => 'Mudanças de estado das submissões Site e Redes Sociais',
            'enabled'     => (bool) ( $prefs['submissions'] ?? true ),
        ],
        [
            'key'         => 'money',
            'label'       => 'Levantamentos',
            'description' => 'Aprovação ou rejeição de pedidos de levantamento',
            'enabled'     => (bool) ( $prefs['money'] ?? true ),
        ],
        [
            'key'         => 'license',
            'label'       => 'Licenças e SOMAS',
            'description' => 'Estado de pedidos de licença e SOMAS',
            'enabled'     => (bool) ( $prefs['license'] ?? true ),
        ],
    ];

    return rmbz_api_ok( [
        '_api_version' => RMBZ_API_NOTIF_PREFS_VERSION,
        'categories'   => $categories,
    ] );
}

/**
 * Actualiza N categorias de uma vez.
 *
 * Body esperado:
 * {
 *   "prefs": {
 *     "releases":    true,
 *     "submissions": false,
 *     "money":       true
 *   }
 * }
 *
 * Categorias não enviadas ficam inalteradas. Categorias desconhecidas
 * são silenciosamente ignoradas (para forward-compat).
 */
function rmbz_api_handle_update_notif_prefs( WP_REST_Request $request ) {
    $telemovel = (string) $request->get_param( 'rmbz_telemovel' );
    if ( empty( $telemovel ) ) {
        return rmbz_api_error( 'Sessão inválida.', 401, 'auth_required' );
    }

    $prefs = $request->get_param( 'prefs' );
    if ( ! is_array( $prefs ) ) {
        return rmbz_api_error( 'Campo "prefs" deve ser um objecto.', 400, 'bad_request' );
    }

    $updated = [];
    foreach ( $prefs as $cat => $enabled ) {
        $cat = sanitize_key( $cat );
        if ( ! in_array( $cat, RMBZ_NOTIF_CATEGORIES, true ) ) continue;
        $ok = rmbz_notif_set_user_pref( $telemovel, $cat, (bool) $enabled );
        if ( $ok ) {
            $updated[] = $cat;
        }
    }

    // Retornar estado final completo para o app sincronizar
    return rmbz_api_handle_get_notif_prefs( $request );
}
