<?php
/**
 * includes/api/controllers/cancel-notices-controller.php
 *
 * [1.6.118.116] Avisos de cancelamento por utilizador.
 *
 * Quando o cron apaga um projecto (datas/localização não confirmadas), grava
 * um aviso na user_meta 'rmbz_cancel_notices'. Estes endpoints permitem ao
 * App (banner no Início) e ao site (pop-up) lerem e dispensarem esses avisos.
 *
 *   GET  /1mz/v1/cancel-notices            — lista avisos pendentes
 *   POST /1mz/v1/cancel-notices/dismiss    — dispensa um aviso (id)
 */

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

add_action( 'rest_api_init', function () {
    register_rest_route( RMBZ_API_NAMESPACE, '/cancel-notices', [
        'methods'             => 'GET',
        'callback'            => 'rmbz_api_cancel_notices_list',
        'permission_callback' => 'rmbz_api_require_auth',
    ] );

    register_rest_route( RMBZ_API_NAMESPACE, '/cancel-notices/dismiss', [
        'methods'             => 'POST',
        'callback'            => 'rmbz_api_cancel_notices_dismiss',
        'permission_callback' => 'rmbz_api_require_auth',
    ] );
} );

/**
 * Resolve o user a partir do telemóvel autenticado.
 */
function rmbz_cancel_notices_user( $tel ) {
    $user = get_user_by( 'login', $tel );
    if ( ! $user ) {
        $q = get_users( [ 'meta_key' => 'telemovel', 'meta_value' => $tel, 'number' => 1 ] );
        if ( ! empty( $q ) ) $user = $q[0];
    }
    return $user ?: null;
}

/**
 * Constrói a mensagem legível a partir do motivo guardado.
 */
function rmbz_cancel_notice_message( $n ) {
    $title  = isset( $n['title'] ) ? $n['title'] : 'o teu projecto';
    $motivo = isset( $n['motivo'] ) ? $n['motivo'] : '';

    $base = sprintf( 'O teu projecto "%s" foi cancelado e removido', $title );
    if ( $motivo ) {
        $base .= ' porque ' . $motivo;
    }
    $base .= '.';

    if ( ! empty( $n['refunded'] ) && ! empty( $n['paid'] ) && (float) $n['paid'] > 0 ) {
        $base .= sprintf( ' O valor que pagaste (%s MT) foi devolvido à tua carteira.', number_format_i18n( (float) $n['paid'], 0 ) );
    }
    return $base;
}

/**
 * GET /cancel-notices
 */
function rmbz_api_cancel_notices_list( WP_REST_Request $request ) {
    $tel  = (string) $request->get_param( 'rmbz_telemovel' );
    $user = rmbz_cancel_notices_user( $tel );
    if ( ! $user ) return rmbz_api_ok( [ 'items' => [], 'count' => 0 ] );

    $notices = get_user_meta( $user->ID, 'rmbz_cancel_notices', true );
    if ( ! is_array( $notices ) ) $notices = [];

    $items = array_map( function ( $n ) {
        return [
            'id'      => isset( $n['id'] ) ? (string) $n['id'] : '',
            'title'   => isset( $n['title'] ) ? (string) $n['title'] : '',
            'message' => rmbz_cancel_notice_message( $n ),
            'at'      => isset( $n['at'] ) ? mysql_to_rfc3339( $n['at'] ) : null,
        ];
    }, array_values( $notices ) );

    // mais recentes primeiro
    $items = array_reverse( $items );

    return rmbz_api_ok( [
        'items' => $items,
        'count' => count( $items ),
    ] );
}

/**
 * POST /cancel-notices/dismiss  { id }
 */
function rmbz_api_cancel_notices_dismiss( WP_REST_Request $request ) {
    $tel  = (string) $request->get_param( 'rmbz_telemovel' );
    $id   = (string) $request->get_param( 'id' );
    $user = rmbz_cancel_notices_user( $tel );
    if ( ! $user ) return rmbz_api_ok( [ 'dismissed' => false ] );

    $notices = get_user_meta( $user->ID, 'rmbz_cancel_notices', true );
    if ( ! is_array( $notices ) ) $notices = [];

    $before = count( $notices );
    $notices = array_values( array_filter( $notices, function ( $n ) use ( $id ) {
        return ( isset( $n['id'] ) ? (string) $n['id'] : '' ) !== $id;
    } ) );

    update_user_meta( $user->ID, 'rmbz_cancel_notices', $notices );

    return rmbz_api_ok( [
        'dismissed' => ( count( $notices ) < $before ),
        'remaining' => count( $notices ),
    ] );
}
