<?php
/**
 * 1MZ For Artists — FCM Auto-Push (Fase 4b)
 *
 * Liga a criação de uma notificação (na tabela rmbz_notifications) ao envio
 * automático de um push notification.
 *
 * Estratégia: hook em `do_action('rmbz_notification_created', $notif_id)`.
 *
 * IMPORTANTE: para o auto-push funcionar, o plugin precisa de disparar
 * essa action sempre que uma notificação é criada. Como o plugin actual
 * pode não disparar essa action explicitamente, fazemos também um fallback
 * usando o filtro do WPDB para detectar inserções na tabela.
 *
 * @package 1MZ_For_Artists
 * @since 1.6.6
 */

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

add_action( 'rmbz_notification_created', 'rmbz_fcm_auto_push_for_notification', 10, 1 );

/**
 * Quando uma notificação é criada, envia push (se for severity importante).
 *
 * @param int $notification_id
 */
function rmbz_fcm_auto_push_for_notification( $notification_id ) {
    if ( empty( $notification_id ) ) return;

    global $wpdb;
    $notif = $wpdb->get_row( $wpdb->prepare(
        "SELECT * FROM {$wpdb->prefix}rmbz_notifications WHERE id = %d",
        $notification_id
    ) );

    if ( ! $notif ) return;
    if ( ! empty( $notif->is_archived ) ) return;

    // Só enviar push para severities importantes — info costuma ser ruído
    $important = in_array( $notif->severity, [ 'success', 'warning', 'danger' ], true );

    /**
     * Permitir filtrar — devs podem mudar comportamento.
     */
    $should_push = apply_filters( 'rmbz_fcm_should_send_push', $important, $notif );
    if ( ! $should_push ) return;

    // Notificação é direccionada a quem?
    $target_telemovel = $notif->target_telemovel;

    if ( empty( $target_telemovel ) ) {
        // Broadcast para todos os artistas (target_role = 'artist' ou NULL).
        // Não fazer enquanto não houver muitos utilizadores. Para evitar spam
        // de pushes, ignoramos broadcasts no auto-push por agora.
        // Se quiseres broadcast, dispara explicitamente rmbz_fcm_send_to_user
        // num loop.
        return;
    }

    // [1.6.37] GUARD DE PREFERÊNCIAS — respeitar toggles do user.
    // A notificação JÁ foi criada na BD (user vê no sino do app),
    // só silenciamos o PUSH para não tocar o telemóvel.
    if ( function_exists( 'rmbz_notif_category_for_type' ) &&
         function_exists( 'rmbz_notif_is_category_enabled' ) ) {
        $category = rmbz_notif_category_for_type( $notif->type );
        if ( ! rmbz_notif_is_category_enabled( $target_telemovel, $category ) ) {
            // Categoria desactivada para este user — não enviar push.
            // Log para debug (continua visível no sino).
            error_log( '[1MZ-FCM] notif #' . $notif->id .
                ' silenciada por pref do user (' . $category . ')' );
            return;
        }
    }

    // Construir payload
    $title = $notif->title;
    $body  = $notif->body ?: '';

    // Se body for muito longo, truncar para o push
    if ( mb_strlen( $body ) > 140 ) {
        $body = mb_substr( $body, 0, 137 ) . '...';
    }

    $data = [
        'notification_id' => (int) $notif->id,
        'type'            => $notif->type,
        'severity'        => $notif->severity,
    ];

    // Se a notificação tem release_id no metadata, incluir
    if ( ! empty( $notif->metadata ) ) {
        $meta = json_decode( $notif->metadata, true );
        if ( is_array( $meta ) && ! empty( $meta['release_id'] ) ) {
            $data['release_id'] = (int) $meta['release_id'];
        }
    }

    if ( function_exists( 'rmbz_fcm_send_to_user' ) ) {
        $stats = rmbz_fcm_send_to_user( $target_telemovel, $title, $body, $data );
        error_log( '[1MZ-FCM] notif #' . $notif->id . ' → ' . wp_json_encode( $stats ) );
    }
}
