<?php
/**
 * includes/filming-cron.php
 *
 * Cron diário — localização não escolhida e datas de gravação não confirmadas.
 *
 * Regras (decididas com o cliente):
 *   - Nas últimas 24h do prazo, se o artista ainda não confirmou:
 *       → aviso por TODOS os canais (email + sino + push): "1 dia para
 *         confirmar ou o projecto é cancelado".
 *   - Depois do prazo exacto, se continua sem confirmar nem propor datas:
 *       → o projecto é cancelado e retido para auditoria/bloqueio.
 *
 * SALVAGUARDAS (porque apagar é irreversível):
 *   - Datas comparadas no fuso de Maputo (UTC+2), igual ao resto do plugin.
 *   - Só toca antes das filmagens: pre-production e kyc_review.
 *   - Nunca apaga projectos que já chegaram a filming ou estados posteriores.
 *   - Prazo = maior entre fim do dia de início e 24h após definir as datas.
 *   - Uma contraproposta do artista pausa o cancelamento automático.
 *   - Cada passo é registado em error_log para auditoria.
 */

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

/* =============================================================================
 * Agendamento do cron (diário) — segue o padrão do plugin
 * ============================================================================= */

function rmbz_filming_cron_activate() {
    if ( ! wp_next_scheduled( 'rmbz_filming_daily_check' ) ) {
        // Primeira corrida daqui a 1h; depois diariamente.
        wp_schedule_event( time() + HOUR_IN_SECONDS, 'daily', 'rmbz_filming_daily_check' );
    }
}
add_action( 'init', 'rmbz_filming_cron_activate' );

/* =============================================================================
 * Estados em que um projecto está "em produção" e a confirmação faz sentido
 * ============================================================================= */

function rmbz_filming_active_states() {
    // Estados onde as datas de gravação são visíveis/relevantes ao artista.
    // Quando já está em filming, a produção começou e nunca deve ser apagada
    // por falta de uma confirmação anterior.
    return [ 'pre-production', 'kyc_review' ];
}

/**
 * Returns the UTC deadline for the artist to confirm filming dates.
 *
 * The artist gets until the later of:
 * - the end of the filming start date in the WordPress timezone;
 * - 24 hours after the admin last set or changed the dates.
 *
 * @return int Unix timestamp UTC, or 0 for an invalid start date.
 */
function rmbz_filming_confirmation_deadline_ts( $extra ) {
    if ( ! is_array( $extra ) ) return 0;

    $start = isset( $extra['filming_start'] ) ? (string) $extra['filming_start'] : '';
    if ( ! preg_match( '/^\d{4}-\d{2}-\d{2}$/', $start ) ) return 0;

    try {
        $timezone = function_exists( 'wp_timezone' )
            ? wp_timezone()
            : new DateTimeZone( 'Africa/Maputo' );
        $deadline_ts = ( new DateTimeImmutable( $start . ' 23:59:59', $timezone ) )->getTimestamp();
    } catch ( Exception $e ) {
        return 0;
    }

    $set_at = isset( $extra['filming_set_at'] ) ? (string) $extra['filming_set_at'] : '';
    if ( $set_at !== '' && strpos( $set_at, '0000-00-00' ) === false ) {
        try {
            // filming_set_at is stored in UTC via current_time( 'mysql', 1 ).
            $set_ts = ( new DateTimeImmutable( $set_at, new DateTimeZone( 'UTC' ) ) )->getTimestamp();
            if ( $set_ts > 0 ) {
                $deadline_ts = max( $deadline_ts, $set_ts + DAY_IN_SECONDS );
            }
        } catch ( Exception $e ) {
            // Keep the start-date deadline when the legacy value is invalid.
        }
    }

    return $deadline_ts;
}

/**
 * Whether the admin has sent at least one valid location option.
 */
function rmbz_filming_has_selectable_location_options( $extra ) {
    if ( ! is_array( $extra ) || ! empty( $extra['budget_accepted_location'] ) ) return false;
    if ( empty( $extra['proposed_budgets'] ) || ! is_array( $extra['proposed_budgets'] ) ) return false;

    foreach ( $extra['proposed_budgets'] as $location => $budget ) {
        if ( trim( (string) $location ) === '' || ! is_array( $budget ) ) continue;
        if ( ! empty( $budget['items'] ) && is_array( $budget['items'] ) ) return true;
    }

    return false;
}

/**
 * The two-day clock starts only when valid options are saved by the admin.
 */
function rmbz_filming_location_deadline_ts( $extra ) {
    if ( ! rmbz_filming_has_selectable_location_options( $extra ) ) return 0;

    $sent_at = isset( $extra['location_choice_set_at'] )
        ? (string) $extra['location_choice_set_at']
        : '';
    if ( $sent_at === '' || strpos( $sent_at, '0000-00-00' ) !== false ) return 0;

    $sent_ts = strtotime( $sent_at . ' UTC' );
    return ( $sent_ts !== false && $sent_ts > 0 )
        ? $sent_ts + 2 * DAY_IN_SECONDS
        : 0;
}

/**
 * Normalized title used as a durable fallback to block resubmission.
 */
function rmbz_filming_normalize_music_title( $title ) {
    $title = remove_accents( strtolower( trim( (string) $title ) ) );
    $title = preg_replace( '/[^a-z0-9]+/', ' ', $title );
    return trim( preg_replace( '/\s+/', ' ', $title ) );
}

/**
 * SHA-256 for a local upload URL. External URLs are deliberately not fetched.
 */
function rmbz_filming_local_file_hash( $file_url ) {
    if ( empty( $file_url ) ) return '';
    $uploads = wp_upload_dir();
    if ( ! empty( $uploads['error'] ) || empty( $uploads['baseurl'] ) || empty( $uploads['basedir'] ) ) return '';
    if ( strpos( $file_url, $uploads['baseurl'] ) !== 0 ) return '';

    $relative = ltrim( substr( $file_url, strlen( $uploads['baseurl'] ) ), '/\\' );
    $path = wp_normalize_path( trailingslashit( $uploads['basedir'] ) . $relative );
    $base = wp_normalize_path( trailingslashit( $uploads['basedir'] ) );
    if ( strpos( $path, $base ) !== 0 || ! is_file( $path ) || ! is_readable( $path ) ) return '';

    return (string) hash_file( 'sha256', $path );
}

/**
 * Returns true when this artist already had the same music cancelled for
 * missing a deadline. Audio hash is preferred; normalized title is fallback.
 */
function rmbz_filming_is_cancelled_music_blocked( $tel, $title, $demo_url = '' ) {
    global $wpdb;
    $table = $wpdb->prefix . 'rmbz_artist_projects';
    $title_key = rmbz_filming_normalize_music_title( $title );
    $audio_hash = rmbz_filming_local_file_hash( $demo_url );

    $rows = $wpdb->get_results( $wpdb->prepare(
        "SELECT project_title, extra_data FROM {$table}
         WHERE artist_telemovel = %s AND production_status = 'cancelled_no_confirmation'",
        $tel
    ) );
    foreach ( (array) $rows as $row ) {
        $extra = ! empty( $row->extra_data ) ? json_decode( $row->extra_data, true ) : [];
        if ( ! is_array( $extra ) ) $extra = [];
        $old_hash = isset( $extra['cancelled_audio_sha256'] ) ? (string) $extra['cancelled_audio_sha256'] : '';
        if ( $audio_hash !== '' && $old_hash !== '' && hash_equals( $old_hash, $audio_hash ) ) return true;

        $old_title = isset( $extra['cancelled_title_key'] )
            ? (string) $extra['cancelled_title_key']
            : rmbz_filming_normalize_music_title( $row->project_title ?? '' );
        if ( $title_key !== '' && $old_title !== '' && hash_equals( $old_title, $title_key ) ) return true;
    }
    return false;
}

/**
 * Whether a retained cancelled project should no longer appear to the artist.
 */
function rmbz_filming_project_hidden_from_artist( $row_or_extra ) {
    $extra = is_array( $row_or_extra )
        ? $row_or_extra
        : ( ! empty( $row_or_extra->extra_data ) ? json_decode( $row_or_extra->extra_data, true ) : [] );
    if ( ! is_array( $extra ) || empty( $extra['artist_hide_after'] ) ) return false;
    $hide_ts = strtotime( (string) $extra['artist_hide_after'] . ' UTC' );
    return $hide_ts > 0 && (int) current_time( 'timestamp', 1 ) >= $hide_ts;
}

/* =============================================================================
 * O HANDLER do cron
 * ============================================================================= */

function rmbz_filming_daily_check() {
    global $wpdb;
    $table = $wpdb->prefix . 'rmbz_artist_projects';

    $now_ts = (int) current_time( 'timestamp', 1 );

    $states = rmbz_filming_active_states();
    $placeholders = implode( ',', array_fill( 0, count( $states ), '%s' ) );

    // Buscar candidatos: projectos em produção com extra_data (onde estão as datas)
    $rows = $wpdb->get_results( $wpdb->prepare(
        "SELECT id, project_title, artist_telemovel, production_status, extra_data, amount_paid, demo_mp3_url
         FROM $table
         WHERE production_status IN ($placeholders)
           AND extra_data IS NOT NULL AND extra_data != ''",
        $states
    ) );

    if ( empty( $rows ) ) {
        rmbz_filming_cleanup_cancelled_project_files();
        return;
    }

    $warned    = 0;
    $cancelled = 0;

    foreach ( $rows as $row ) {
        $extra = json_decode( $row->extra_data, true );
        if ( ! is_array( $extra ) ) continue;

        $tel   = (string) $row->artist_telemovel;
        $title = (string) $row->project_title;

        // =====================================================================
        // REGRA LOCALIZAÇÃO: escolher em 2 dias após o admin enviar opções
        // =====================================================================
        $location_deadline = rmbz_filming_location_deadline_ts( $extra );
        if ( $location_deadline > 0 ) {
            $remaining_location = $location_deadline - $now_ts;

            if ( $remaining_location <= 0 ) {
                $ok = rmbz_filming_refund_and_delete(
                    $row, $tel, $title,
                    'localização não escolhida em 2 dias',
                    'filming_cancelled'
                );
                if ( $ok ) $cancelled++;
                continue;
            }

            if ( $remaining_location <= DAY_IN_SECONDS && empty( $extra['location_cancel_warned'] ) ) {
                rmbz_filming_send_location_warning( $tel, $title );
                $extra['location_cancel_warned'] = current_time( 'mysql', 1 );
                $wpdb->update( $table, [ 'extra_data' => wp_json_encode( $extra ) ], [ 'id' => $row->id ] );
                $warned++;
            }
        }

        // =====================================================================
        // REGRA DATAS: confirmar as datas de gravação antes do início
        // =====================================================================
        $start = isset( $extra['filming_start'] ) ? (string) $extra['filming_start'] : '';
        if ( $start === '' ) continue; // sem data de início → não aplica

        // Já confirmado? Então não há nada a fazer.
        if ( ! empty( $extra['filming_confirmed_by_artist'] ) ) continue;

        // O artista já respondeu com outras datas. A decisão está agora do
        // lado da equipa; o cancelamento automático fica pausado.
        if ( ! empty( $extra['filming_proposed_by_artist'] ) ) continue;

        $deadline_ts = rmbz_filming_confirmation_deadline_ts( $extra );
        if ( $deadline_ts <= 0 ) continue;
        $remaining = $deadline_ts - $now_ts;

        // ── CASO 1: faltam até 24 horas para o prazo exacto → AVISAR ──
        if ( $remaining > 0 && $remaining <= DAY_IN_SECONDS ) {
            // Evitar avisar mais que uma vez
            if ( ! empty( $extra['filming_cancel_warned'] ) ) continue;

            rmbz_filming_send_warning( $tel, $title, $start );

            // Marcar que já avisámos (idempotência)
            $extra['filming_cancel_warned'] = current_time( 'mysql', 1 );
            $wpdb->update( $table, [ 'extra_data' => wp_json_encode( $extra ) ], [ 'id' => $row->id ] );

            error_log( sprintf(
                '[1MZ filming-cron] AVISO datas proj=%d artist=%s inicio=%s prazo_utc=%s',
                $row->id, $tel, $start, gmdate( 'Y-m-d H:i:s', $deadline_ts )
            ) );
            $warned++;
            continue;
        }

        // ── CASO 2: prazo exacto terminou sem resposta → CANCELAR ──
        if ( $now_ts >= $deadline_ts ) {
            $ok = rmbz_filming_refund_and_delete(
                $row, $tel, $title,
                'datas não confirmadas',
                'filming_cancelled'
            );
            if ( $ok ) $cancelled++;
        }
    }

    if ( $warned || $cancelled ) {
        error_log( sprintf(
            '[1MZ filming-cron] resumo: avisados=%d cancelados=%d',
            $warned, $cancelled
        ) );
    }

    rmbz_filming_cleanup_cancelled_project_files();
}
add_action( 'rmbz_filming_daily_check', 'rmbz_filming_daily_check' );

/* =============================================================================
 * Envio de avisos por TODOS os canais (email + sino + push)
 * ============================================================================= */

/* =============================================================================
 * Devolução + cancelamento retido (partilhado pelas duas regras)
 * ============================================================================= */

/**
 * Refunds and marks the project as cancelled without deleting its record.
 *
 * The artist sees the cancelled project for 24 hours. The record then becomes
 * hidden from the artist but stays in admin/audit history to block the same
 * music from being submitted again. Heavy files are cleaned after 30 days.
 */
function rmbz_filming_refund_and_delete( $row, $tel, $title, $motivo, $notify_key ) {
    global $wpdb;
    $table = $wpdb->prefix . 'rmbz_artist_projects';

    $extra = ! empty( $row->extra_data ) ? json_decode( $row->extra_data, true ) : [];
    if ( ! is_array( $extra ) ) $extra = [];

    if ( ( $row->production_status ?? '' ) === 'cancelled_no_confirmation' ) {
        return true;
    }

    // Detect a previous successful refund and prevent duplicate wallet credit.
    $prior_refund = isset( $extra['filming_cancel_refunded_amount'] )
        ? (float) $extra['filming_cancel_refunded_amount']
        : 0.0;
    if ( $prior_refund <= 0 ) {
        $transactions = $wpdb->prefix . 'rmbz_wallet_transactions';
        $prior_refund = (float) $wpdb->get_var( $wpdb->prepare(
            "SELECT amount FROM {$transactions}
             WHERE user_telemovel = %s AND type = 'project_refund' AND project_id = %d
             ORDER BY transaction_id DESC LIMIT 1",
            $tel, $row->id
        ) );
    }
    $paid         = $prior_refund > 0
        ? 0.0
        : ( isset( $row->amount_paid ) ? (float) $row->amount_paid : 0.0 );
    $notice_paid  = $prior_refund > 0 ? $prior_refund : $paid;
    $refunded     = $prior_refund > 0;

    if ( $paid > 0 && ! function_exists( 'rmbz_update_wallet_balance' ) ) {
        error_log( sprintf(
            '[1MZ filming-cron] ABORTADO proj=%d (%s): helper de devolução indisponível. NÃO apagado.',
            $row->id, $motivo
        ) );
        return false;
    }

    if ( $paid > 0 ) {
        $details = sprintf(
            'Devolução: projecto "%s" (#%d) cancelado — %s.',
            $title, $row->id, $motivo
        );
        $res = rmbz_update_wallet_balance(
            $tel, $paid, 'project_refund', $row->id, $details
        );
        $refunded = is_array( $res ) && ! empty( $res['success'] );

        // Sem devolução bem-sucedida → NÃO apaga (tenta de novo amanhã).
        if ( ! $refunded ) {
            error_log( sprintf(
                '[1MZ filming-cron] ABORTADO proj=%d (%s): devolução de %.2f falhou (%s). NÃO apagado.',
                $row->id, $motivo, $paid, is_array( $res ) ? ( $res['error'] ?? '?' ) : '?'
            ) );
            return false;
        }

        // Persist immediately so another cron run cannot refund twice.
        $extra['filming_cancel_refunded_amount'] = $paid;
        $extra['filming_cancel_refunded_at']     = current_time( 'mysql', 1 );
        $wpdb->update(
            $table,
            [
                'amount_paid' => 0,
                'extra_data'  => wp_json_encode( $extra ),
            ],
            [ 'id' => $row->id ],
            [ '%f', '%s' ],
            [ '%d' ]
        );
    }

    $now = (int) current_time( 'timestamp', 1 );
    $extra['cancelled_at']             = gmdate( 'Y-m-d H:i:s', $now );
    $extra['cancelled_reason']         = $motivo;
    $extra['artist_hide_after']        = gmdate( 'Y-m-d H:i:s', $now + DAY_IN_SECONDS );
    $extra['files_delete_after']       = gmdate( 'Y-m-d H:i:s', $now + 30 * DAY_IN_SECONDS );
    $extra['cancelled_title_key']      = rmbz_filming_normalize_music_title( $title );
    $extra['cancelled_audio_sha256']   = rmbz_filming_local_file_hash( $row->demo_mp3_url ?? '' );
    $extra['cancelled_files_cleaned']  = false;

    $updated = $wpdb->update(
        $table,
        [
            'production_status' => 'cancelled_no_confirmation',
            'is_paid'           => 0,
            'amount_paid'       => 0,
            'extra_data'        => wp_json_encode( $extra ),
        ],
        [ 'id' => $row->id ],
        [ '%s', '%d', '%f', '%s' ],
        [ '%d' ]
    );
    if ( $updated === false ) {
        error_log( sprintf( '[1MZ filming-cron] ABORTADO proj=%d: falha ao guardar cancelamento.', $row->id ) );
        return false;
    }

    rmbz_filming_send_cancelled( $tel, $title, $motivo, $notice_paid, $refunded );
    rmbz_filming_store_cancel_notice( $tel, $title, $motivo, $notice_paid, $refunded );

    error_log( sprintf(
        '[1MZ filming-cron] CANCELADO+RETIDO proj=%d artist=%s motivo=%s pago=%.2f devolvido=%s ocultar_em=%s limpar_em=%s',
        $row->id, $tel, $motivo, $notice_paid, ( $refunded ? 'sim' : 'n/a' ),
        $extra['artist_hide_after'], $extra['files_delete_after']
    ) );

    do_action( 'rmbz_filming_project_cancelled', $row->id, $tel, $row );
    return true;
}

/**
 * Removes heavy files from cancelled projects after 30 days.
 * The database record and the stored audio hash/title key remain.
 */
function rmbz_filming_cleanup_cancelled_project_files() {
    global $wpdb;
    $table = $wpdb->prefix . 'rmbz_artist_projects';
    $now = (int) current_time( 'timestamp', 1 );
    $rows = $wpdb->get_results(
        "SELECT id, demo_mp3_url, extra_data FROM {$table}
         WHERE production_status = 'cancelled_no_confirmation'
           AND demo_mp3_url IS NOT NULL AND demo_mp3_url != ''"
    );

    foreach ( (array) $rows as $row ) {
        $extra = ! empty( $row->extra_data ) ? json_decode( $row->extra_data, true ) : [];
        if ( ! is_array( $extra ) || ! empty( $extra['cancelled_files_cleaned'] ) ) continue;
        $delete_after = ! empty( $extra['files_delete_after'] )
            ? strtotime( $extra['files_delete_after'] . ' UTC' )
            : 0;
        if ( ! $delete_after || $now < $delete_after ) continue;

        if ( function_exists( 'rmbz_destruir_ficheiro_fisico' ) ) {
            rmbz_destruir_ficheiro_fisico( $row->demo_mp3_url );
        }
        $extra['cancelled_files_cleaned']    = true;
        $extra['cancelled_files_cleaned_at'] = current_time( 'mysql', 1 );
        $wpdb->update(
            $table,
            [ 'demo_mp3_url' => '', 'extra_data' => wp_json_encode( $extra ) ],
            [ 'id' => $row->id ],
            [ '%s', '%s' ],
            [ '%d' ]
        );
        error_log( sprintf( '[1MZ filming-cron] AUDIO LIMPO proj=%d após retenção de 30 dias.', $row->id ) );
    }
}

/**
 * [1.6.118.116] Guarda um aviso de cancelamento na user_meta do artista.
 * Lista de avisos pendentes (cada um dispensável). Identifica o utilizador
 * pelo telemóvel → user_id.
 */
function rmbz_filming_store_cancel_notice( $tel, $title, $motivo, $paid, $refunded ) {
    $user = get_user_by( 'login', $tel );
    if ( ! $user ) {
        // fallback: alguns sistemas usam o telemóvel noutro campo
        $q = get_users( [ 'meta_key' => 'telemovel', 'meta_value' => $tel, 'number' => 1 ] );
        if ( ! empty( $q ) ) $user = $q[0];
    }
    if ( ! $user ) {
        error_log( '[1MZ filming-cron] aviso: user não encontrado para tel=' . $tel );
        return;
    }

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

    $notices[] = [
        'id'       => uniqid( 'cn_', true ),
        'title'    => $title,
        'motivo'   => $motivo,
        'paid'     => (float) $paid,
        'refunded' => (bool) $refunded,
        'at'       => current_time( 'mysql', 1 ), // UTC
    ];

    // Manter no máximo os últimos 10
    if ( count( $notices ) > 10 ) {
        $notices = array_slice( $notices, -10 );
    }

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

/**
 * Aviso: falta 1 dia para escolher a localização.
 */
function rmbz_filming_send_location_warning( $tel, $title ) {
    if ( empty( $tel ) ) return;
    $site = get_bloginfo( 'name' );

    if ( function_exists( 'rmbz_notify' ) ) {
        rmbz_notify( $tel, 'location_choose_warning', [
            'musica'    => $title,
            'site_name' => $site,
        ] );
    }
    if ( function_exists( 'rmbz_fcm_send_to_user' ) ) {
        rmbz_fcm_send_to_user(
            $tel,
            '📍 Escolhe a localização',
            'Tens 1 dia para escolher a localização de "' . $title . '" ou o projecto será cancelado.',
            [ 'type' => 'location_choose_warning' ]
        );
    }
}

/**
 * Aviso "1 dia para confirmar ou cancela".
 */
function rmbz_filming_send_warning( $tel, $title, $data_inicio ) {
    if ( empty( $tel ) ) return;
    $site = get_bloginfo( 'name' );

    // Email + sino (notifications-center)
    if ( function_exists( 'rmbz_notify' ) ) {
        rmbz_notify( $tel, 'filming_confirm_warning', [
            'musica'      => $title,
            'data_inicio' => $data_inicio,
            'site_name'   => $site,
        ] );
    }

    // Push (app + PWA web) — canal separado
    if ( function_exists( 'rmbz_fcm_send_to_user' ) ) {
        rmbz_fcm_send_to_user(
            $tel,
            '⚠️ Confirma o teu videoclipe',
            'Tens 1 dia para confirmar "' . $title . '" ou o projecto será cancelado.',
            [ 'type' => 'filming_confirm_warning' ]
        );
    }
}

/**
 * Aviso de cancelamento.
 * [1.6.118.112] Inclui menção à devolução do valor pago, se houve.
 */
function rmbz_filming_send_cancelled( $tel, $title, $motivo = '', $paid = 0, $refunded = false ) {
    if ( empty( $tel ) ) return;
    $site = get_bloginfo( 'name' );
    $cancel_reason = strpos( remove_accents( strtolower( (string) $motivo ) ), 'localizacao' ) !== false
        ? 'não escolheste uma localização dentro do prazo'
        : 'as datas de gravação não foram confirmadas dentro do prazo';

    // Linha sobre a devolução (só se houve pagamento devolvido)
    $refund_line = ( $paid > 0 && $refunded )
        ? sprintf( 'O valor que pagaste (%s MT) foi devolvido à tua carteira.', number_format( $paid, 0 ) )
        : '';

    if ( function_exists( 'rmbz_notify' ) ) {
        rmbz_notify( $tel, 'filming_cancelled', [
            'musica'      => $title,
            'site_name'   => $site,
            'refund_line' => $refund_line,
            'cancel_reason' => $cancel_reason,
        ] );
    }

    if ( function_exists( 'rmbz_fcm_send_to_user' ) ) {
        $push_body = 'O teu projecto "' . $title . '" foi cancelado porque ' . $cancel_reason . '. Esta música não poderá ser reenviada.';
        if ( $paid > 0 && $refunded ) {
            $push_body .= ' O valor pago foi devolvido à tua carteira.';
        }
        rmbz_fcm_send_to_user(
            $tel,
            '❌ Projecto cancelado',
            $push_body,
            [ 'type' => 'filming_cancelled' ]
        );
    }
}

/* =============================================================================
 * Limpeza ao desactivar o plugin
 * ============================================================================= */

function rmbz_filming_cron_deactivate() {
    $ts = wp_next_scheduled( 'rmbz_filming_daily_check' );
    if ( $ts ) wp_unschedule_event( $ts, 'rmbz_filming_daily_check' );
}
register_deactivation_hook(
    RMBZ_PLUGIN_PATH . '1mz-for-artists.php',
    'rmbz_filming_cron_deactivate'
);
