<?php
/**
 * [1.6.116] AVISOS GLOBAIS NO APP — SCHEMA
 *
 * 2 tabelas:
 *   - rmbz_app_announcements: o catálogo de avisos
 *   - rmbz_app_announcement_dismissals: registo de dispensa permanente por user
 *
 * Padrão: usa dbDelta. Idempotente. Auto-migra em re-activações.
 *
 * @package 1MZ_For_Artists
 * @since 1.6.116
 */

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


/**
 * Cria/actualiza tabelas de avisos. Idempotente.
 */
function rmbz_announcements_install_tables() {
    global $wpdb;
    $charset_collate = $wpdb->get_charset_collate();
    $sql = [];

    // ────────────────────────────────────────────────────────────────────
    // Catálogo de avisos
    //
    // Notas de design:
    //   - `level` é enum-like (info/success/warning/error/promo). Validamos no PHP.
    //   - `location` é uma lista CSV ("home,wallet,releases") ou "all". Validamos no PHP.
    //   - `audience` segmentação simples: all / vip / non_vip.
    //   - `dismissible` 0 = não dá para fechar com X; 1 = sessão; 2 = permanente.
    //   - `animation` none / slide / pulse.
    //   - `starts_at` / `ends_at` opcionais (NULL = sempre).
    //   - `is_active` permite desactivar sem apagar (útil para histórico).
    //   - `sort_order` quando há vários avisos a mostrar, ordem ASC.
    // ────────────────────────────────────────────────────────────────────
    $sql[] = "CREATE TABLE {$wpdb->prefix}rmbz_app_announcements (
        id bigint(20) NOT NULL AUTO_INCREMENT,
        title varchar(120) NOT NULL DEFAULT '',
        message text NOT NULL,
        level varchar(16) NOT NULL DEFAULT 'info',
        icon varchar(40) DEFAULT NULL,
        cta_label varchar(60) DEFAULT NULL,
        cta_url varchar(500) DEFAULT NULL,
        dismissible tinyint(1) NOT NULL DEFAULT 1,
        animation varchar(16) NOT NULL DEFAULT 'slide',
        location varchar(120) NOT NULL DEFAULT 'home',
        audience varchar(16) NOT NULL DEFAULT 'all',
        starts_at datetime DEFAULT NULL,
        ends_at datetime DEFAULT NULL,
        is_active tinyint(1) NOT NULL DEFAULT 1,
        sort_order int(11) NOT NULL DEFAULT 100,
        created_by varchar(40) DEFAULT NULL,
        created_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
        updated_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
        PRIMARY KEY  (id),
        KEY idx_active (is_active, starts_at, ends_at),
        KEY idx_location (location),
        KEY idx_sort (sort_order)
    ) ENGINE=InnoDB $charset_collate;";

    // ────────────────────────────────────────────────────────────────────
    // Dismissals — quem dispensou que aviso permanentemente
    //
    // Quando um aviso é `dismissible = 2` (permanente), o user dispensa
    // e fica gravado aqui. O endpoint filtra-os out na próxima chamada.
    // ────────────────────────────────────────────────────────────────────
    $sql[] = "CREATE TABLE {$wpdb->prefix}rmbz_app_announcement_dismissals (
        id bigint(20) NOT NULL AUTO_INCREMENT,
        announcement_id bigint(20) NOT NULL,
        user_telemovel varchar(20) NOT NULL,
        dismissed_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
        PRIMARY KEY  (id),
        UNIQUE KEY uniq_user_ann (user_telemovel, announcement_id),
        KEY idx_ann (announcement_id)
    ) ENGINE=InnoDB $charset_collate;";

    // ────────────────────────────────────────────────────────────────────
    // [1.6.116.4] Eventos — métricas de impressões/dispensas/cliques CTA
    //
    // Cada linha = 1 evento. Permite contar:
    //   - Impressões totais (rows) e únicas (DISTINCT user_telemovel)
    //   - Dispensas, cliques CTA (mesmo método)
    //
    // event_type: 'view' | 'dismiss' | 'cta_click'
    // ────────────────────────────────────────────────────────────────────
    $sql[] = "CREATE TABLE {$wpdb->prefix}rmbz_app_announcement_events (
        id bigint(20) NOT NULL AUTO_INCREMENT,
        announcement_id bigint(20) NOT NULL,
        user_telemovel varchar(20) NOT NULL,
        event_type varchar(20) NOT NULL,
        created_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
        PRIMARY KEY  (id),
        KEY idx_ann_type (announcement_id, event_type),
        KEY idx_user (user_telemovel),
        KEY idx_created (created_at)
    ) ENGINE=InnoDB $charset_collate;";

    require_once ABSPATH . 'wp-admin/includes/upgrade.php';
    dbDelta( $sql );
}


/**
 * Hook: garante que as tabelas existem em admin_init.
 * Usa lock transient para não correr a cada page load.
 *
 * [1.6.116.4] Verifica também `rmbz_app_announcement_events` (tabela
 * nova adicionada nesta versão). Se faltar, força re-correr dbDelta
 * mesmo que as outras 2 já existam.
 */
add_action( 'admin_init', function () {
    $lock_key = 'rmbz_announcements_schema_lock_v2';
    if ( get_transient( $lock_key ) ) {
        return;
    }
    set_transient( $lock_key, 1, DAY_IN_SECONDS );

    global $wpdb;
    $t_ann    = $wpdb->prefix . 'rmbz_app_announcements';
    $t_events = $wpdb->prefix . 'rmbz_app_announcement_events';
    if ( $wpdb->get_var( "SHOW TABLES LIKE '$t_ann'" ) !== $t_ann
      || $wpdb->get_var( "SHOW TABLES LIKE '$t_events'" ) !== $t_events ) {
        rmbz_announcements_install_tables();
    }
}, 20 );
