<?php
/**
 * includes/project-giveup.php — [1.5.439] DESISTIR DO PROJETO DE VIDEOCLIPE
 *
 * O admin, no detalhe do projeto (Projetos & Videoclipes), pode desistir de um
 * projeto de duas formas:
 *   • FORÇADO — o projeto é cancelado já (com reembolso do que foi pago) e o
 *     artista recebe apenas o aviso de que a equipa recebeu as orientações de
 *     desistência e desistiu.
 *   • PEDIR AO ARTISTA — o artista, ao entrar no Início do painel, vê um modal
 *     com a compilação do projeto (pagamentos, multas, poupança) e um CONSELHO
 *     DA IA personalizado pelo nível (Básico/Profissional/Cinema), e decide:
 *     continuar (recusa a desistência) ou confirmar a desistência.
 *
 * O texto da IA é gerado UMA vez (rmbz_ai_messages, modelo de chat) com factos
 * determinísticos — números nunca inventados — e fica GUARDADO na base de
 * dados (extra_data['giveup']['ai_text']), como manda a arquitetura de IA do
 * plugin. Sem IA disponível, há textos de reserva diferentes por nível.
 */

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

/* ─────────────────────────────────────────────────────────────────────────
 * VALORES DE MERCADO por nível (quanto custaria produzir o vídeo fora)
 * ───────────────────────────────────────────────────────────────────────── */

function rmbz_giveup_market_values() {
    $vals = [
        'basic'        => (float) get_option( 'rmbz_video_market_value_basic', 45000 ),
        'professional' => (float) get_option( 'rmbz_video_market_value_professional', 150000 ),
        'cinema'       => (float) get_option( 'rmbz_video_market_value_cinema', 400000 ),
    ];
    return apply_filters( 'rmbz_giveup_market_values', $vals );
}

function rmbz_giveup_level_label( $key ) {
    return [ 'basic' => 'Básico', 'professional' => 'Profissional', 'cinema' => 'Cinema' ][ (string) $key ] ?? ucfirst( (string) $key );
}

/* ─────────────────────────────────────────────────────────────────────────
 * COMPILAÇÃO — factos determinísticos do projeto (admin, artista e IA)
 * ───────────────────────────────────────────────────────────────────────── */

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

    $level  = (string) ( $p->scenario_type ?? 'basic' );
    $cost   = function_exists( 'rmbz_calc_project_obligatory_cost' ) ? (float) rmbz_calc_project_obligatory_cost( $p ) : (float) ( $p->scenario_cost ?? 0 );
    $paid   = (float) ( $p->amount_paid ?? 0 );
    $falta  = max( 0, $cost - $paid );

    // Multa pendente deste projeto (congelada) + multa a acumular ao vivo
    $fine_pending = 0.0;
    if ( function_exists( 'rmbz_project_pending_fine_get' ) ) {
        $pf = rmbz_project_pending_fine_get( (int) $p->id );
        if ( is_array( $pf ) && empty( $pf['paid'] ) ) $fine_pending = (float) ( $pf['amount'] ?? 0 );
    }
    if ( $fine_pending <= 0 && function_exists( 'rmbz_project_overdue_info' ) ) {
        $ov = rmbz_project_overdue_info( (string) $p->artist_telemovel );
        if ( ! empty( $ov['overdue'] ) && (int) ( $ov['project_id'] ?? 0 ) === (int) $p->id ) $fine_pending = (float) ( $ov['amount'] ?? 0 );
    }

    $market  = rmbz_giveup_market_values()[ $level ] ?? 0.0;
    $savings = max( 0, $market - $cost );

    // Últimos eventos do change_log (para a compilação)
    $log = [];
    if ( ! empty( $extra['change_log'] ) && is_array( $extra['change_log'] ) ) {
        foreach ( array_slice( array_reverse( $extra['change_log'] ), 0, 6 ) as $ev ) {
            if ( ! is_array( $ev ) ) continue;
            $log[] = [ 'when' => (string) ( $ev['at'] ?? $ev['when'] ?? '' ), 'what' => (string) ( $ev['what'] ?? '' ) ];
        }
    }

    return [
        'project_id'  => (int) $p->id,
        'title'       => (string) $p->project_title,
        'level'       => $level,
        'level_label' => rmbz_giveup_level_label( $level ),
        'status'      => (string) $p->production_status,
        'cost'        => $cost,
        'cost_bruto'  => (float) ( $p->scenario_cost ?? 0 ),
        'paid'        => $paid,
        'falta'       => $falta,
        'fine_pending' => $fine_pending,
        'market'      => (float) $market,
        'savings'     => (float) $savings,
        'log'         => $log,
    ];
}

/* ─────────────────────────────────────────────────────────────────────────
 * IA — conselho personalizado por nível (guardado na BD)
 * ───────────────────────────────────────────────────────────────────────── */

/** Textos de reserva (sem IA) — DIFERENTES por nível, com os números reais. */
function rmbz_giveup_default_text( $facts ) {
    $fmt = fn( $n ) => number_format( (float) $n, 0, ',', '.' );
    $sv  = $fmt( $facts['savings'] );
    $mk  = $fmt( $facts['market'] );
    $cs  = $fmt( $facts['cost'] );
    // REGRA DO PROJETO: ao desistir, o que já foi pago perde-se.
    $lost = (float) $facts['paid'] > 0
        ? ' Atenção: pelas regras do projeto, se desistires o valor que já pagaste (' . $fmt( $facts['paid'] ) . ' MT) perde-se — não é devolvido.'
        : '';
    switch ( $facts['level'] ) {
        case 'cinema':
            return "Pensa bem antes de desistir: chegar ao nível Cinema é raríssimo — a equipa 1MZ só aprova músicas com potencial de hit, e a tua convenceu. Uma produção cinematográfica destas custa no mercado cerca de {$mk} MT; contigo a 1MZ assume quase tudo e a tua parte fica em {$cs} MT — estás a poupar cerca de {$sv} MT em produção real.{$lost} Desistir agora é abrir mão de uma oportunidade que pouquíssimos artistas em Moçambique conseguem. A decisão é tua, mas o nosso conselho é: continua.";
        case 'professional':
            return "Antes de decidires, olha para o que já conquistaste: poucos artistas convencem a equipa 1MZ a aprovar uma produção Profissional — a tua música destacou-se. No mercado, um vídeo deste nível custa à volta de {$mk} MT; no teu projeto a tua parte é {$cs} MT, ou seja, estás a poupar cerca de {$sv} MT em produção real.{$lost} Desistir agora deitaria fora esse avanço. Se algo te está a travar, fala com a equipa — mas o nosso conselho é continuar.";
        default:
            return "Pensa duas vezes: a equipa 1MZ não aprova qualquer música — a tua passou na avaliação e ganhou um projeto de vídeo Básico. Produzir um vídeo assim por conta própria custaria cerca de {$mk} MT; contigo a tua parte fica em {$cs} MT — uma poupança de cerca de {$sv} MT em produção real.{$lost} É o primeiro degrau para os níveis maiores. Se puderes, continua o projeto; a equipa está pronta para te acompanhar.";
    }
}

/** Gera o texto com a IA (ou usa o de reserva) — devolve [texto, fonte]. */
function rmbz_giveup_generate_ai_text( $facts ) {
    if ( ! function_exists( 'rmbz_ai_available' ) || ! rmbz_ai_available() || ! function_exists( 'rmbz_ai_messages' ) ) {
        return [ rmbz_giveup_default_text( $facts ), 'fallback' ];
    }
    $system = 'És o assistente da 1MZ Records (plataforma de artistas em Moçambique). '
        . 'A equipa perguntou a um artista se quer DESISTIR do seu projeto de videoclipe, e tu escreves o conselho que aparece no modal de decisão. '
        . 'Objetivo: fazer o artista PONDERAR BEM antes de desistir, com honestidade e sem pressão agressiva. '
        . 'Personaliza pelo nível do projeto: no nível Cinema, raríssimos artistas convencem a equipa na aprovação da música; no Profissional, poucos conseguem; no Básico, a avaliação já é seletiva — não é qualquer um que entra. '
        . 'Diz-lhe quanto pouparia em DINHEIRO REAL de produção (usa APENAS os números fornecidos: valor de mercado do nível, a parte que o artista paga e a poupança). '
        . 'REGRA DO PROJETO: se o artista desistir, o valor que JÁ PAGOU perde-se (não é devolvido) — se valor_perdido_se_desistir_mt for maior que 0, menciona isto claramente como algo a ponderar. '
        . 'NUNCA inventes números, datas ou factos além dos fornecidos. '
        . 'Português de Moçambique (tratamento por "tu"), 120 a 180 palavras, texto corrido sem markdown, sem listas, sem emojis no início.';
    $user = "FACTOS DETERMINÍSTICOS (usa só isto):\n" . wp_json_encode( [
        'musica'            => $facts['title'],
        'nivel'             => $facts['level_label'],
        'valor_mercado_mt'  => round( $facts['market'] ),
        'parte_artista_mt'  => round( $facts['cost'] ),
        'ja_pago_mt'        => round( $facts['paid'] ),
        'valor_perdido_se_desistir_mt' => round( $facts['paid'] ),
        'poupanca_mt'       => round( $facts['savings'] ),
        'multa_pendente_mt' => round( $facts['fine_pending'] ),
    ], JSON_UNESCAPED_UNICODE ) . "\nEscreve o conselho agora.";
    $opts = [ 'max_tokens' => 500 ];
    if ( function_exists( 'rmbz_ai_chat_model' ) ) $opts['model'] = rmbz_ai_chat_model();
    $res = rmbz_ai_messages( $system, $user, $opts );
    if ( empty( $res['ok'] ) || trim( (string) ( $res['text'] ?? '' ) ) === '' ) {
        return [ rmbz_giveup_default_text( $facts ), 'fallback' ];
    }
    return [ trim( (string) $res['text'] ), 'ai' ];
}

/* ─────────────────────────────────────────────────────────────────────────
 * CERTIFICADO DE DESISTÊNCIA (PDF bonito, com as evidências do projeto)
 * ───────────────────────────────────────────────────────────────────────── */

/**
 * Gera os bytes do PDF "Certificado de Desistência — 1MusicMoz" usando o
 * renderer nativo do plugin (rmbz_cpdf_render, o mesmo dos contratos).
 * Devolve string PDF ou '' se o renderer não existir.
 */
function rmbz_giveup_certificate_pdf( $p, $facts, $g ) {
    if ( ! function_exists( 'rmbz_cpdf_render' ) ) return '';
    $fmt = fn( $n ) => number_format( (float) $n, 2, ',', '.' );
    $signed_name = (string) ( $g['signed_name'] ?? '' );
    $signed_tel  = (string) ( $g['signed_tel'] ?? $p->artist_telemovel );
    $signed_at   = (string) ( $g['signed_at'] ?? current_time( 'mysql' ) );
    $hoje = date_i18n( 'd \d\e F \d\e Y', current_time( 'timestamp' ) );

    // [texto, fonte N/B/H, tamanho, espaço-depois, alinhamento L/C]
    $b = [];
    $b[] = [ '1MUSICMOZ  ·  1MZ FOR ARTISTS', 'B', 10, 4, 'C' ];
    $b[] = [ str_repeat( '─', 58 ), 'N', 9, 10, 'C' ];
    $b[] = [ 'CERTIFICADO DE DESISTÊNCIA', 'B', 22, 4, 'C' ];
    $b[] = [ 'Projecto de Videoclipe', 'N', 12, 16, 'C' ];

    $b[] = [ [ [ 'Certifica-se que o artista ', 'N' ], [ $signed_name ?: '—', 'B' ], [ ' (conta nº ', 'N' ], [ $signed_tel, 'B' ], [ '), por sua livre e expressa vontade, DESISTIU do projecto de videoclipe da música ', 'N' ], [ '"' . (string) $p->project_title . '"', 'B' ], [ ' (nível ' . $facts['level_label'] . ') na plataforma 1MZ For Artists, nos termos das regras do projecto que declarou conhecer e aceitar.', 'N' ] ], 'N', 11, 16, 'L' ];

    $b[] = [ 'EVIDÊNCIAS DO PROJETO', 'B', 12, 8, 'L' ];
    foreach ( [
        [ 'Música', (string) $p->project_title ],
        [ 'Artista (conta)', (string) $p->artist_telemovel ],
        [ 'Nível de produção', $facts['level_label'] ],
        [ 'Estado à data da desistência', (string) $facts['status'] ],
        [ 'Orçamento (parte do artista)', $fmt( $facts['cost'] ) . ' MT (bruto: ' . $fmt( $facts['cost_bruto'] ) . ' MT)' ],
        [ 'Valor pago — PERDIDO nos termos das regras', $fmt( $facts['paid'] ) . ' MT' ],
        [ 'Multa pendente à data', $facts['fine_pending'] > 0 ? $fmt( $facts['fine_pending'] ) . ' MT' : 'nenhuma' ],
        [ 'Valor de mercado de uma produção deste nível', $fmt( $facts['market'] ) . ' MT' ],
        [ 'Poupança de que o artista abdicou', $fmt( $facts['savings'] ) . ' MT' ],
    ] as $row ) {
        $b[] = [ [ [ '• ' . $row[0] . ':  ', 'B' ], [ $row[1], 'N' ] ], 'N', 10, 4, 'L' ];
    }
    $b[] = [ '', 'N', 10, 6, 'L' ];

    if ( ! empty( $facts['log'] ) ) {
        $b[] = [ 'HISTÓRICO DO PROJETO (últimos acontecimentos)', 'B', 12, 8, 'L' ];
        foreach ( array_slice( $facts['log'], 0, 10 ) as $ev ) {
            $line = trim( ( $ev['when'] ? $ev['when'] . ' — ' : '' ) . $ev['what'] );
            if ( $line !== '' ) $b[] = [ '• ' . $line, 'N', 9, 3, 'L' ];
        }
        $b[] = [ '', 'N', 10, 6, 'L' ];
    }

    $b[] = [ 'EFEITOS DA DESISTÊNCIA (regras do projecto)', 'B', 12, 8, 'L' ];
    $b[] = [ '• O valor já pago não é devolvido — considera-se perdido.', 'N', 10, 4, 'L' ];
    $b[] = [ '• A música deste projecto não voltará a ser aceite na plataforma.', 'N', 10, 4, 'L' ];
    $b[] = [ '• O artista mantém a conta e pode submeter OUTRAS músicas normalmente.', 'N', 10, 4, 'L' ];
    $b[] = [ '• O projecto fica encerrado, preservando-se apenas o histórico.', 'N', 10, 16, 'L' ];

    $b[] = [ 'ASSINATURA DIGITAL DO ARTISTA', 'B', 12, 10, 'L' ];
    $b[] = [ $signed_name ?: '____________________________', 'H', 18, 4, 'C' ];
    $b[] = [ str_repeat( '_', 44 ), 'N', 10, 6, 'C' ];
    $b[] = [ [ [ 'Conta nº ', 'N' ], [ $signed_tel, 'B' ], [ '  ·  assinado em ', 'N' ], [ $signed_at, 'B' ] ], 'N', 10, 20, 'C' ];

    $b[] = [ 'Emitido automaticamente pela 1MusicMoz em ' . $hoje . '.', 'N', 9, 2, 'C' ];
    $b[] = [ 'Este certificado serve de evidência da desistência voluntária do projecto acima identificado.', 'N', 9, 0, 'C' ];

    return rmbz_cpdf_render( $b, '1MusicMoz — Certificado de Desistência · projecto #' . (int) $p->id );
}

/**
 * Grava o certificado em uploads e envia o email de despedida com o PDF.
 * Devolve o URL do certificado ('' se não foi possível gerar).
 */
function rmbz_giveup_send_farewell( $p, $facts, $g ) {
    global $wpdb;
    $pdf = rmbz_giveup_certificate_pdf( $p, $facts, $g );
    $cert_url = ''; $cert_path = '';
    if ( $pdf !== '' ) {
        $up = wp_upload_dir();
        $dir = trailingslashit( $up['basedir'] ) . 'rmbz-certificados';
        if ( ! is_dir( $dir ) ) wp_mkdir_p( $dir );
        $fname = 'certificado-desistencia-' . (int) $p->id . '-' . substr( md5( wp_generate_password( 12, false ) ), 0, 8 ) . '.pdf';
        $cert_path = $dir . '/' . $fname;
        if ( file_put_contents( $cert_path, $pdf ) !== false ) {
            $cert_url = trailingslashit( $up['baseurl'] ) . 'rmbz-certificados/' . $fname;
        } else {
            $cert_path = '';
        }
    }

    // Email de despedida (só se o artista tiver email real)
    $email = (string) $wpdb->get_var( $wpdb->prepare(
        "SELECT user_email FROM {$wpdb->prefix}rmbz_wallets WHERE user_telemovel = %s", (string) $p->artist_telemovel
    ) );
    if ( $email !== '' && is_email( $email ) && stripos( $email, '@1mz.local' ) === false ) {
        $signed_name = (string) ( $g['signed_name'] ?? '' );
        $signed_at   = ! empty( $g['signed_at'] ) ? date_i18n( 'd/m/Y \à\s H:i', strtotime( (string) $g['signed_at'] ) ) : date_i18n( 'd/m/Y' );
        $subject = 'Confirmação de desistência — "' . (string) $p->project_title . '"';
        $body = sprintf(
            "Olá %s,\n\n" .
            "Confirmamos a desistência do teu projeto de videoclipe \"%s\", assinada por %s (conta %s) em %s.\n\n" .
            "O que isto significa:\n" .
            "— Esta música não voltará a ser aceite na plataforma;\n" .
            "— De acordo com as regras do projeto, o valor pago não é devolvido;\n" .
            "— A tua conta continua ativa e podes submeter outras músicas quando quiseres.\n\n" .
            "Em anexo segue o Certificado de Desistência da 1MusicMoz, com o registo do projeto.\n\n" .
            "Lamentamos não concluir este projeto contigo e esperamos trabalhar contigo numa próxima música.\n\n" .
            "Com os melhores cumprimentos,\nEquipa 1MZ For Artists",
            $signed_name ?: 'artista',
            (string) $p->project_title,
            $signed_name, (string) ( $g['signed_tel'] ?? $p->artist_telemovel ),
            $signed_at
        );
        $attach = $cert_path !== '' ? [ $cert_path ] : [];
        wp_mail( $email, $subject, $body, [], $attach );
    }
    return $cert_url;
}

/* ─────────────────────────────────────────────────────────────────────────
 * EXECUÇÃO — cancela o projeto (reembolso + avisos), padrão do filming-cron
 * ───────────────────────────────────────────────────────────────────────── */

function rmbz_giveup_execute( $project_id, $motivo, $giveup_patch = [] ) {
    global $wpdb;
    $table = $wpdb->prefix . 'rmbz_artist_projects';
    $p = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$table} WHERE id = %d", $project_id ) );
    if ( ! $p ) return false;

    $extra = ! empty( $p->extra_data ) ? json_decode( $p->extra_data, true ) : [];
    if ( ! is_array( $extra ) ) $extra = [];
    $tel   = (string) $p->artist_telemovel;
    $title = (string) $p->project_title;
    $paid  = (float) $p->amount_paid;

    // 1) REGRA DO PROJETO: em cancelamento por desistência, o valor pago
    //    PERDE-SE — não há reembolso. Fica registado o valor perdido.
    if ( $paid > 0 ) {
        $extra['giveup_forfeited_amount'] = $paid;
        $extra['giveup_forfeited_at']     = current_time( 'mysql', 1 );
    }

    // 2) Marcas de cancelamento + registo da desistência
    $now = (int) current_time( 'timestamp', 1 );
    $extra['cancelled_at']     = gmdate( 'Y-m-d H:i:s', $now );
    $extra['cancelled_reason'] = $motivo;
    // [1.5.443] Esta música não volta a ser aceite (mesmo mecanismo do cron:
    // chave do título + hash do áudio bloqueiam nova submissão).
    if ( function_exists( 'rmbz_filming_normalize_music_title' ) ) {
        $extra['cancelled_title_key'] = rmbz_filming_normalize_music_title( $title );
    }
    if ( function_exists( 'rmbz_filming_local_file_hash' ) ) {
        $extra['cancelled_audio_sha256'] = rmbz_filming_local_file_hash( (string) ( $p->demo_mp3_url ?? '' ) );
    }
    // Desistência assinada pelo artista sai da lista dele JÁ; forçada dá 1 dia.
    $hide_now = ( $giveup_patch['status'] ?? '' ) === 'accepted';
    $extra['artist_hide_after'] = gmdate( 'Y-m-d H:i:s', $hide_now ? $now : $now + DAY_IN_SECONDS );
    $extra['giveup'] = array_merge( is_array( $extra['giveup'] ?? null ) ? $extra['giveup'] : [], $giveup_patch, [ 'decided_at' => current_time( 'mysql' ) ] ); // hora local WP

    // amount_paid mantém-se na row (registo histórico do valor perdido).
    $ok = $wpdb->update(
        $table,
        [ 'production_status' => 'cancelled_no_confirmation', 'extra_data' => wp_json_encode( $extra ) ],
        [ 'id' => (int) $p->id ],
        [ '%s', '%s' ],
        [ '%d' ]
    );
    if ( $ok === false ) return false;

    // 3) Popup "projeto cancelado" + push + notificação (respeita o mute).
    //    refunded=false → o popup NÃO fala em devolução.
    if ( function_exists( 'rmbz_filming_store_cancel_notice' ) ) {
        rmbz_filming_store_cancel_notice( $tel, $title, $motivo, $paid, false );
    }
    $muted = function_exists( 'rmbz_project_notifications_muted' ) && rmbz_project_notifications_muted( (int) $p->id );
    if ( ! $muted ) {
        $perda = $paid > 0 ? sprintf( ' De acordo com as regras do projeto, o valor pago (%s MT) não é devolvido.', number_format( $paid, 2, ',', '.' ) ) : '';
        // [1.5.442] Canal certo: rmbz_notify = sino 🔔 do site (rmbz_email_logs)
        // + email real do artista (template editável no admin). Push via FCM.
        if ( function_exists( 'rmbz_notify' ) ) {
            rmbz_notify( $tel, 'project_giveup_done', [ 'musica' => $title, 'motivo' => $motivo, 'perda' => $perda ] );
        }
        if ( function_exists( 'rmbz_fcm_send_to_user' ) ) {
            rmbz_fcm_send_to_user( $tel, 'Projeto encerrado', $motivo . $perda, [ 'type' => 'project_giveup', 'project_id' => (string) $p->id, 'deeplink' => 'onemz://projects/' . (int) $p->id ] );
        }
    }
    do_action( 'rmbz_project_giveup_done', (int) $p->id, $tel, $extra['giveup'] );
    return true;
}

/* ─────────────────────────────────────────────────────────────────────────
 * EXECUÇÕES — as duas vias (chamadas SÓ depois da confirmação por email)
 * ───────────────────────────────────────────────────────────────────────── */

function rmbz_giveup_do_forced( $pid, $who ) {
    $motivo = 'A equipa 1MZ recebeu as orientações de desistência e desistiu do projeto.';
    $done = rmbz_giveup_execute( $pid, $motivo, [ 'mode' => 'forced', 'status' => 'done', 'by' => $who ] );
    if ( $done && function_exists( 'rmbz_pchat_append_change_log' ) ) {
        rmbz_pchat_append_change_log( $pid, [ 'who' => $who, 'what' => '🛑 Desistência FORÇADA do projeto (equipa, confirmada por email) — cancelado; valor pago perdido (regra do projeto).' ] );
    }
    return $done;
}

function rmbz_giveup_do_request( $pid, $who ) {
    global $wpdb;
    $table = $wpdb->prefix . 'rmbz_artist_projects';
    $p = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$table} WHERE id = %d", $pid ) );
    if ( ! $p ) return false;
    $facts = rmbz_giveup_facts( $p );
    [ $ai_text, $ai_src ] = rmbz_giveup_generate_ai_text( $facts );
    $extra = ! empty( $p->extra_data ) ? json_decode( $p->extra_data, true ) : [];
    if ( ! is_array( $extra ) ) $extra = [];
    // Texto da IA GUARDADO na base de dados, junto dos factos usados.
    $extra['giveup'] = [
        'mode' => 'request', 'status' => 'pending',
        'requested_at' => current_time( 'mysql' ), // hora LOCAL do WordPress
        'requested_by' => $who,
        'ai_text' => $ai_text, 'ai_source' => $ai_src, 'facts' => $facts,
    ];
    unset( $extra['giveup_email_confirm'] );
    $wpdb->update( $table, [ 'extra_data' => wp_json_encode( $extra ) ], [ 'id' => $pid ], [ '%s' ], [ '%d' ] );
    if ( function_exists( 'rmbz_pchat_append_change_log' ) ) {
        rmbz_pchat_append_change_log( $pid, [ 'who' => $who, 'what' => '🛑 Pedido de desistência enviado ao artista (confirmado por email; conselho ' . ( $ai_src === 'ai' ? 'gerado pela IA' : 'padrão' ) . ').' ] );
    }
    $muted = function_exists( 'rmbz_project_notifications_muted' ) && rmbz_project_notifications_muted( $pid );
    if ( ! $muted ) {
        $tel = (string) $p->artist_telemovel;
        // [1.5.442] Canal certo: rmbz_notify = sino 🔔 do site + email real
        // (template project_giveup_ask, editável no admin). Push via FCM.
        if ( function_exists( 'rmbz_notify' ) ) {
            rmbz_notify( $tel, 'project_giveup_ask', [ 'musica' => (string) $p->project_title ] );
        }
        if ( function_exists( 'rmbz_fcm_send_to_user' ) ) {
            rmbz_fcm_send_to_user( $tel, 'Decisão pendente no teu projeto', 'A equipa propôs a desistência do projeto "' . (string) $p->project_title . '" — entra na tua conta para decidir.', [ 'type' => 'project_giveup_request', 'project_id' => (string) $pid, 'deeplink' => 'onemz://projects/' . $pid ] );
        }
    }
    return true;
}

/* ─────────────────────────────────────────────────────────────────────────
 * ADMIN — passo 1: escolher a via → envia EMAIL de confirmação ao admin
 * ───────────────────────────────────────────────────────────────────────── */

function rmbz_admin_project_giveup() {
    if ( ! current_user_can( 'manage_options' ) ) wp_die( 'Sem permissões.' );
    $pid = isset( $_POST['project_id'] ) ? absint( $_POST['project_id'] ) : 0;
    check_admin_referer( 'rmbz_project_giveup_' . $pid );
    $mode = isset( $_POST['giveup_mode'] ) ? sanitize_key( $_POST['giveup_mode'] ) : '';

    global $wpdb;
    $table = $wpdb->prefix . 'rmbz_artist_projects';
    $p = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$table} WHERE id = %d", $pid ) );
    if ( ! $p ) wp_die( 'Projeto não encontrado.' );
    $back = admin_url( 'admin.php?page=rmbz-projetos&action=edit&id=' . $pid );
    $who  = function_exists( 'rmbz_pchat_current_admin_who' ) ? rmbz_pchat_current_admin_who() : 'admin';
    $extra = ! empty( $p->extra_data ) ? json_decode( $p->extra_data, true ) : [];
    if ( ! is_array( $extra ) ) $extra = [];

    // ── SEGURANÇA: forçado / pedir ao artista NÃO executam já — enviam um
    //    email ao admin com um link de confirmação (expira em 30 minutos).
    if ( $mode === 'forced' || $mode === 'request' ) {
        $admin_user  = wp_get_current_user();
        $admin_email = $admin_user && $admin_user->user_email ? (string) $admin_user->user_email : (string) get_option( 'admin_email' );
        $token = wp_generate_password( 32, false, false );
        $extra['giveup_email_confirm'] = [
            'token_hash' => wp_hash( $token ),
            'mode'       => $mode,
            'by'         => $who,
            'admin_id'   => (int) ( $admin_user->ID ?? 0 ),
            'email'      => $admin_email,
            'expires'    => time() + 30 * MINUTE_IN_SECONDS,
        ];
        $wpdb->update( $table, [ 'extra_data' => wp_json_encode( $extra ) ], [ 'id' => $pid ], [ '%s' ], [ '%d' ] );

        $confirm_url = admin_url( 'admin-post.php?action=rmbz_project_giveup_confirm&project_id=' . $pid . '&token=' . rawurlencode( $token ) );
        $mode_lbl = $mode === 'forced' ? 'Desistência forçada (o projeto é cancelado de imediato)' : 'Pedir a decisão ao artista';
        $facts = rmbz_giveup_facts( $p );
        $subject = sprintf( 'Confirmação necessária — desistência do projeto nº %d ("%s")', $pid, (string) $p->project_title );
        $body = sprintf(
            "Olá %s,\n\n" .
            "Foi iniciado o processo de desistência de um projeto de videoclipe. Para concluir, é necessária a tua confirmação.\n\n" .
            "Projeto: \"%s\" (nº %d)\n" .
            "Artista: %s\n" .
            "Nível: %s\n" .
            "Valor pago pelo artista: %s MT (não reembolsável em caso de desistência)\n" .
            "Via escolhida: %s\n\n" .
            "Para confirmar, abre o link seguinte (válido durante 30 minutos):\n%s\n\n" .
            "Se não iniciaste este processo, ignora este email — nenhuma ação será tomada.\n\n" .
            "1MZ For Artists",
            $who,
            (string) $p->project_title, $pid, (string) $p->artist_telemovel,
            $facts['level_label'], number_format( $facts['paid'], 2, ',', '.' ),
            $mode_lbl, $confirm_url
        );
        wp_mail( $admin_email, $subject, $body );
        if ( function_exists( 'rmbz_pchat_append_change_log' ) ) {
            rmbz_pchat_append_change_log( $pid, [ 'who' => $who, 'what' => '📧 Desistência iniciada (' . ( $mode === 'forced' ? 'forçada' : 'pedir ao artista' ) . ') — à espera da confirmação por email.' ] );
        }
        wp_safe_redirect( $back . '&giveup=email_sent' ); exit;
    }

    // [1.5.444] Editar o valor de mercado do NÍVEL deste projeto (opção
    // rmbz_video_market_value_{nível} — usada na compilação, na IA e nos
    // textos de poupança de todos os projetos desse nível).
    if ( $mode === 'market_value' ) {
        $mv = isset( $_POST['market_value'] ) ? (float) str_replace( ',', '.', (string) wp_unslash( $_POST['market_value'] ) ) : -1;
        $level = (string) ( $p->scenario_type ?? 'basic' );
        if ( $mv >= 0 && in_array( $level, [ 'basic', 'professional', 'cinema' ], true ) ) {
            update_option( 'rmbz_video_market_value_' . $level, $mv );
            if ( function_exists( 'rmbz_pchat_append_change_log' ) ) {
                rmbz_pchat_append_change_log( $pid, [ 'who' => $who, 'what' => '💰 Valor de mercado do nível ' . rmbz_giveup_level_label( $level ) . ' atualizado para ' . number_format( $mv, 2, ',', '.' ) . ' MT.' ] );
            }
        }
        wp_safe_redirect( $back . '&giveup=mkt_saved' ); exit;
    }

    if ( $mode === 'cancel_email' ) {
        unset( $extra['giveup_email_confirm'] );
        $wpdb->update( $table, [ 'extra_data' => wp_json_encode( $extra ) ], [ 'id' => $pid ], [ '%s' ], [ '%d' ] );
        if ( function_exists( 'rmbz_pchat_append_change_log' ) ) {
            rmbz_pchat_append_change_log( $pid, [ 'who' => $who, 'what' => '↩️ Confirmação por email da desistência CANCELADA.' ] );
        }
        wp_safe_redirect( $back . '&giveup=email_cancelled' ); exit;
    }

    if ( $mode === 'cancel_request' ) {
        if ( isset( $extra['giveup'] ) ) {
            $extra['giveup']['status'] = 'withdrawn';
            $wpdb->update( $table, [ 'extra_data' => wp_json_encode( $extra ) ], [ 'id' => $pid ], [ '%s' ], [ '%d' ] );
            if ( function_exists( 'rmbz_pchat_append_change_log' ) ) {
                rmbz_pchat_append_change_log( $pid, [ 'who' => $who, 'what' => '↩️ Pedido de desistência ANULADO pela equipa.' ] );
            }
        }
        wp_safe_redirect( $back . '&giveup=withdrawn' ); exit;
    }
    wp_safe_redirect( $back ); exit;
}
add_action( 'admin_post_rmbz_project_giveup', 'rmbz_admin_project_giveup' );

/* ─────────────────────────────────────────────────────────────────────────
 * ADMIN — passo 2: link do EMAIL → executa a via escolhida
 * ───────────────────────────────────────────────────────────────────────── */

function rmbz_admin_project_giveup_confirm() {
    if ( ! current_user_can( 'manage_options' ) ) {
        wp_die( 'Inicia sessão no wp-admin com a tua conta de administrador e abre o link do email outra vez.' );
    }
    $pid   = isset( $_GET['project_id'] ) ? absint( $_GET['project_id'] ) : 0;
    $token = isset( $_GET['token'] ) ? (string) wp_unslash( $_GET['token'] ) : '';

    global $wpdb;
    $table = $wpdb->prefix . 'rmbz_artist_projects';
    $p = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$table} WHERE id = %d", $pid ) );
    if ( ! $p ) wp_die( 'Projeto não encontrado.' );
    $back = admin_url( 'admin.php?page=rmbz-projetos&action=edit&id=' . $pid );

    $extra = ! empty( $p->extra_data ) ? json_decode( $p->extra_data, true ) : [];
    $ec = is_array( $extra ) && isset( $extra['giveup_email_confirm'] ) && is_array( $extra['giveup_email_confirm'] ) ? $extra['giveup_email_confirm'] : null;
    if ( ! $ec ) { wp_safe_redirect( $back . '&giveup=no_pending' ); exit; }
    if ( (int) ( $ec['expires'] ?? 0 ) < time() )                    { wp_safe_redirect( $back . '&giveup=expired' ); exit; }
    if ( ! hash_equals( (string) ( $ec['token_hash'] ?? '' ), wp_hash( $token ) ) ) { wp_die( 'Link de confirmação inválido.' ); }

    // Consome o token ANTES de executar (nunca corre duas vezes).
    unset( $extra['giveup_email_confirm'] );
    $wpdb->update( $table, [ 'extra_data' => wp_json_encode( $extra ) ], [ 'id' => $pid ], [ '%s' ], [ '%d' ] );

    $who = (string) ( $ec['by'] ?? 'admin' );
    if ( ( $ec['mode'] ?? '' ) === 'forced' ) {
        $done = rmbz_giveup_do_forced( $pid, $who );
        wp_safe_redirect( $back . ( $done ? '&giveup=forced_ok' : '&giveup=err' ) ); exit;
    }
    $done = rmbz_giveup_do_request( $pid, $who );
    wp_safe_redirect( $back . ( $done ? '&giveup=asked' : '&giveup=err' ) ); exit;
}
add_action( 'admin_post_rmbz_project_giveup_confirm', 'rmbz_admin_project_giveup_confirm' );

/* ─────────────────────────────────────────────────────────────────────────
 * ARTISTA — resposta ao pedido (continuar / confirmar desistência)
 * ───────────────────────────────────────────────────────────────────────── */

function rmbz_project_giveup_respond() {
    if ( ! function_exists( 'rmbz_is_user_logged_in' ) || ! rmbz_is_user_logged_in() ) wp_die( 'Sessão expirada.' );
    check_admin_referer( 'rmbz_giveup_respond_nonce' );
    $pid = isset( $_POST['project_id'] ) ? absint( $_POST['project_id'] ) : 0;
    $dec = isset( $_POST['decision'] ) ? sanitize_key( $_POST['decision'] ) : '';
    $tel = function_exists( 'rmbz_get_current_user_telemovel' ) ? (string) rmbz_get_current_user_telemovel() : '';

    global $wpdb;
    $table = $wpdb->prefix . 'rmbz_artist_projects';
    $p = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$table} WHERE id = %d AND artist_telemovel = %s", $pid, $tel ) );
    $extra = $p && ! empty( $p->extra_data ) ? json_decode( $p->extra_data, true ) : [];
    $g = is_array( $extra ) && isset( $extra['giveup'] ) && is_array( $extra['giveup'] ) ? $extra['giveup'] : null;
    if ( ! $p || ! $g || ( $g['status'] ?? '' ) !== 'pending' || ( $g['mode'] ?? '' ) !== 'request' ) {
        wp_safe_redirect( home_url( '/minha-conta/' ) ); exit;
    }

    if ( $dec === 'accept' ) {
        // [1.5.443] ASSINATURA obrigatória: nome escrito + número da conta
        // têm de conferir. Sem isto a desistência não avança.
        $sign_name = isset( $_POST['sign_name'] ) ? sanitize_text_field( wp_unslash( $_POST['sign_name'] ) ) : '';
        $sign_tel  = isset( $_POST['sign_tel'] ) ? preg_replace( '/\D+/', '', (string) wp_unslash( $_POST['sign_tel'] ) ) : '';
        // O formulário mostra o +258 fixo — aceita o número com ou sem prefixo.
        if ( $sign_tel !== '' && strpos( $sign_tel, '258' ) !== 0 ) $sign_tel = '258' . $sign_tel;
        $acc_tel   = preg_replace( '/\D+/', '', $tel );
        if ( mb_strlen( $sign_name ) < 3 || $sign_tel === '' || $sign_tel !== $acc_tel ) {
            wp_safe_redirect( home_url( '/minha-conta/?giveup_err=sign' ) ); exit;
        }
        $signed = [
            'status'      => 'accepted',
            'signed_name' => $sign_name,
            'signed_tel'  => $tel,
            'signed_at'   => current_time( 'mysql' ),
            'signed_ip'   => isset( $_SERVER['REMOTE_ADDR'] ) ? sanitize_text_field( (string) $_SERVER['REMOTE_ADDR'] ) : '',
        ];
        $motivo = 'O artista aceitou a proposta de desistência do projeto.';
        rmbz_giveup_execute( $pid, $motivo, $signed );
        // Certificado PDF + email de despedida (com o URL guardado na BD)
        $p2 = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$table} WHERE id = %d", $pid ) );
        if ( $p2 ) {
            $x2 = json_decode( (string) $p2->extra_data, true );
            $g2 = is_array( $x2['giveup'] ?? null ) ? $x2['giveup'] : $signed;
            $facts2 = is_array( $g2['facts'] ?? null ) ? $g2['facts'] : rmbz_giveup_facts( $p2 );
            $cert_url = rmbz_giveup_send_farewell( $p2, $facts2, $g2 );
            if ( $cert_url !== '' && is_array( $x2 ) ) {
                $x2['giveup']['certificate_url'] = $cert_url;
                $wpdb->update( $table, [ 'extra_data' => wp_json_encode( $x2 ) ], [ 'id' => $pid ], [ '%s' ], [ '%d' ] );
            }
        }
        if ( function_exists( 'rmbz_pchat_append_change_log' ) ) {
            rmbz_pchat_append_change_log( $pid, [ 'who' => 'artista', 'what' => '🛑 O artista ACEITOU desistir — assinou "' . $sign_name . '" (conta ' . $tel . '). Projeto fechado; valor pago perdido; certificado emitido.' ] );
        }
    } else { // refuse → o projeto continua
        $extra['giveup']['status']     = 'refused';
        $extra['giveup']['decided_at'] = current_time( 'mysql', 1 );
        $wpdb->update( $table, [ 'extra_data' => wp_json_encode( $extra ) ], [ 'id' => $pid ], [ '%s' ], [ '%d' ] );
        if ( function_exists( 'rmbz_pchat_append_change_log' ) ) {
            rmbz_pchat_append_change_log( $pid, [ 'who' => 'artista', 'what' => '💪 O artista RECUSOU desistir (decisão DEFINITIVA — futura desistência implica banimento de submissões) — o projeto continua.' ] );
        }
        if ( function_exists( 'rmbz_notify_user' ) ) {
            rmbz_notify_user( $tel, '💪 Boa escolha!', 'Recusaste a desistência — o teu projeto "' . (string) $p->project_title . '" continua em produção com a equipa 1MZ.', 'success', [ 'project_id' => $pid ] );
        }
    }
    wp_safe_redirect( home_url( '/minha-conta/?sect=projetos' ) ); exit;
}
add_action( 'admin_post_rmbz_project_giveup_respond', 'rmbz_project_giveup_respond' );
add_action( 'admin_post_nopriv_rmbz_project_giveup_respond', 'rmbz_project_giveup_respond' );

/* ─────────────────────────────────────────────────────────────────────────
 * ARTISTA — pedido pendente (helper partilhado: painel novo + tema antigo)
 * ───────────────────────────────────────────────────────────────────────── */

function rmbz_giveup_get_pending_for( $telemovel ) {
    global $wpdb;
    $rows = $wpdb->get_results( $wpdb->prepare(
        "SELECT * FROM {$wpdb->prefix}rmbz_artist_projects
         WHERE artist_telemovel = %s AND extra_data LIKE %s
         ORDER BY id DESC LIMIT 5",
        $telemovel, '%"giveup"%'
    ) ) ?: [];
    foreach ( $rows as $row ) {
        $x = json_decode( (string) $row->extra_data, true );
        $g = is_array( $x['giveup'] ?? null ) ? $x['giveup'] : null;
        if ( $g && ( $g['status'] ?? '' ) === 'pending' && ( $g['mode'] ?? '' ) === 'request' ) {
            return [ 'p' => $row, 'g' => $g ];
        }
    }
    return null;
}

/* ─────────────────────────────────────────────────────────────────────────
 * ARTISTA — modal no TEMA ANTIGO (wp_footer; o painel VIP tem o seu nativo)
 * ───────────────────────────────────────────────────────────────────────── */

function rmbz_giveup_render_classic_modal() {
    if ( is_admin() ) return;
    if ( ! function_exists( 'rmbz_is_user_logged_in' ) || ! rmbz_is_user_logged_in() ) return;
    $tel = function_exists( 'rmbz_get_current_user_telemovel' ) ? (string) rmbz_get_current_user_telemovel() : '';
    if ( $tel === '' ) return;
    // O painel VIP novo tem o modal nativo — não duplicar por baixo dele.
    if ( function_exists( 'rmbz_vip_layout_on' ) && function_exists( 'rmbz_vip_is_active' )
         && rmbz_vip_is_active( $tel ) && rmbz_vip_layout_on( $tel ) ) return;
    // Só na página da conta (onde o dashboard clássico vive).
    global $post;
    if ( ! $post || ! is_a( $post, 'WP_Post' ) || ! has_shortcode( (string) $post->post_content, 'rmbz_minha_conta' ) ) return;

    $ask = rmbz_giveup_get_pending_for( $tel );
    if ( ! $ask ) return;
    $p = $ask['p']; $g = $ask['g'];
    $f = is_array( $g['facts'] ?? null ) ? $g['facts'] : [];
    $fmt = fn( $n ) => number_format( (float) $n, 2, ',', '.' );
    $gold = '#f0b90b';
    ?>
    <div id="rmbz-giveup-classic" style="position:fixed; inset:0; z-index:99998; display:flex; align-items:center; justify-content:center; background:rgba(0,0,0,.72); padding:16px;">
        <div style="background:#fff; border-radius:18px; max-width:560px; width:100%; max-height:92vh; overflow-y:auto; box-shadow:0 24px 70px rgba(0,0,0,.35); font-family:inherit;">
            <div style="background:linear-gradient(135deg,#1d2327,#3a4046); padding:20px 24px;">
                <div style="font-size:34px; line-height:1;">🎬</div>
                <div style="color:#fff; font-size:17px; font-weight:800; margin-top:6px;">A equipa 1MZ precisa da tua decisão</div>
                <div style="color:rgba(255,255,255,.75); font-size:12.5px; margin-top:4px;">Foi proposta a desistência do projeto <b style="color:#fff;">"<?php echo esc_html( (string) $p->project_title ); ?>"</b> (nível <?php echo esc_html( (string) ( $f['level_label'] ?? '' ) ); ?>). A decisão final é tua.</div>
            </div>
            <div style="padding:18px 22px;">
                <div style="display:grid; grid-template-columns:1fr 1fr; gap:8px;">
                    <?php foreach ( [
                        [ 'JÁ PAGASTE', $fmt( $f['paid'] ?? 0 ) . ' MT' ],
                        [ 'A TUA PARTE', $fmt( $f['cost'] ?? 0 ) . ' MT' ],
                        [ 'VALOR DE MERCADO', $fmt( $f['market'] ?? 0 ) . ' MT' ],
                        [ 'POUPAS EM PRODUÇÃO', $fmt( $f['savings'] ?? 0 ) . ' MT' ],
                    ] as $c ): ?>
                        <div style="background:#f6f6f2; border-radius:10px; padding:9px 12px;"><div style="font-size:9.5px; font-weight:800; letter-spacing:.07em; color:#8a8a80;"><?php echo esc_html( $c[0] ); ?></div><div style="font-size:14px; font-weight:800; color:#1d2327; margin-top:2px;"><?php echo esc_html( $c[1] ); ?></div></div>
                    <?php endforeach; ?>
                </div>
                <?php if ( (float) ( $f['fine_pending'] ?? 0 ) > 0 ): ?>
                    <div style="border-radius:10px; padding:8px 12px; margin-top:8px; background:rgba(217,48,37,.08); color:#b3261e; font-size:12px; font-weight:650;">💸 Multa pendente no projeto: <?php echo esc_html( $fmt( $f['fine_pending'] ) ); ?> MT</div>
                <?php endif; ?>
                <div style="border:1px solid <?php echo esc_attr( $gold ); ?>; background:rgba(240,185,11,.10); border-radius:12px; padding:12px 14px; margin-top:12px;">
                    <div style="font-size:10.5px; font-weight:800; letter-spacing:.07em; color:#8a6d0a; margin-bottom:5px;">🤖 CONSELHO DO ASSISTENTE 1MZ</div>
                    <div style="font-size:13px; line-height:1.65; color:#3c4043;"><?php echo esc_html( (string) ( $g['ai_text'] ?? '' ) ); ?></div>
                </div>
                <?php if ( (float) ( $f['paid'] ?? 0 ) > 0 ): ?>
                    <div style="border-radius:10px; padding:9px 12px; margin-top:10px; background:rgba(217,48,37,.08); color:#b3261e; font-size:12px; font-weight:650;">⚠️ Regra do projeto: se desistires, o valor que já pagaste (<b><?php echo esc_html( $fmt( $f['paid'] ) ); ?> MT</b>) perde-se — não é devolvido.</div>
                <?php endif; ?>
                <?php if ( isset( $_GET['giveup_err'] ) && $_GET['giveup_err'] === 'sign' ): ?>
                    <div style="border-radius:10px; padding:9px 12px; margin-top:10px; background:rgba(217,48,37,.10); color:#b3261e; font-size:12px; font-weight:700;">❌ A assinatura ou o número da conta não confere — tenta de novo.</div>
                <?php endif; ?>
                <div id="rmbzgu-s1" style="display:flex; gap:10px; margin-top:16px; flex-wrap:wrap;">
                    <form id="rmbzgu-refuse" method="post" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>" style="flex:1.4; min-width:180px; display:flex;">
                        <input type="hidden" name="action" value="rmbz_project_giveup_respond">
                        <input type="hidden" name="project_id" value="<?php echo (int) $p->id; ?>">
                        <input type="hidden" name="decision" value="refuse">
                        <?php wp_nonce_field( 'rmbz_giveup_respond_nonce' ); ?>
                        <button type="submit" style="flex:1; border:0; cursor:pointer; border-radius:10px; padding:13px; font-size:13.5px; font-weight:800; color:#fff; background:#0d9268;">💪 Quero continuar o projeto</button>
                    </form>
                    <button type="button" onclick="document.getElementById('rmbzgu-s1').style.display='none'; document.getElementById('rmbzgu-s2').style.display='block';"
                            style="flex:1; min-width:160px; border:1px solid #d93025; cursor:pointer; border-radius:10px; padding:13px; font-size:13.5px; font-weight:700; color:#d93025; background:none;">Confirmo que desisto</button>
                </div>
                <?php // Passo 2 — despedida + ASSINATURA (nome + nº da conta) ?>
                <div id="rmbzgu-s2" style="display:none; margin-top:16px;">
                    <div style="border:1px solid #e4dfd1; background:#faf8f2; border-radius:12px; padding:14px 16px;">
                        <div style="font-size:14px; font-weight:800; color:#1d2327;">😔 Lamentamos não trabalhar contigo neste projeto</div>
                        <p style="font-size:12.5px; color:#555; line-height:1.65; margin:8px 0 0;">Respeitamos a tua decisão. Podes continuar a submeter <b>outras músicas</b> quando quiseres — mas a música <b>"<?php echo esc_html( (string) $p->project_title ); ?>"</b> não será aceite novamente na plataforma. Para confirmares, <b>assina</b> com o teu nome e confirma o número da tua conta:</p>
                    </div>
                    <form id="rmbzgu-signform" data-acc="<?php echo esc_attr( preg_replace( '/\D+/', '', (string) $p->artist_telemovel ) ); ?>" method="post" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>" style="margin-top:10px;">
                        <input type="hidden" name="action" value="rmbz_project_giveup_respond">
                        <input type="hidden" name="project_id" value="<?php echo (int) $p->id; ?>">
                        <input type="hidden" name="decision" value="accept">
                        <?php wp_nonce_field( 'rmbz_giveup_respond_nonce' ); ?>
                        <input type="text" name="sign_name" placeholder="✍️ O teu nome completo (assinatura)" required style="width:100%; box-sizing:border-box; border:1px solid #d5cfbe; border-radius:10px; padding:11px 13px; font-size:13px; margin-bottom:8px;">
                        <div style="display:flex; gap:8px;">
                            <span style="display:flex; align-items:center; border:1px solid #d5cfbe; border-radius:10px; padding:0 13px; background:#f6f6f2; font-size:13px; font-weight:700; color:#555;">🇲🇿 +258</span>
                            <input type="tel" name="sign_tel" placeholder="O teu número (ex: 86 123 4567)" required inputmode="numeric" style="flex:1; box-sizing:border-box; border:1px solid #d5cfbe; border-radius:10px; padding:11px 13px; font-size:13px;">
                        </div>
                        <div style="display:flex; gap:10px; margin-top:10px;">
                            <button type="button" onclick="document.getElementById('rmbzgu-s2').style.display='none'; document.getElementById('rmbzgu-s1').style.display='flex';"
                                    style="border:1px solid #d5cfbe; cursor:pointer; border-radius:10px; padding:12px 16px; font-size:13px; font-weight:700; color:#555; background:none;">← Voltar</button>
                            <button type="submit" style="flex:1; border:0; cursor:pointer; border-radius:10px; padding:12px; font-size:13.5px; font-weight:800; color:#fff; background:linear-gradient(135deg,#d93025,#b3261e);">Avançar — assinar a desistência</button>
                        </div>
                        <p style="font-size:11px; color:#888; margin:8px 0 0;">Vais receber um email de despedida com o teu Certificado de Desistência (PDF) da 1MusicMoz.</p>
                    </form>
                </div>
            </div>
        </div>
    </div>

    <?php // [1.5.445] Diálogo do TEMA (não o do browser) para avisos/confirms. ?>
    <div id="rmbzgu-dlg" style="display:none; position:fixed; inset:0; z-index:99999; align-items:center; justify-content:center; background:rgba(0,0,0,.6); padding:16px;">
        <div style="background:#fff; border-radius:16px; max-width:440px; width:100%; box-shadow:0 24px 70px rgba(0,0,0,.35); padding:20px 22px; font-family:inherit;">
            <div style="display:flex; gap:12px; align-items:flex-start;">
                <span id="rmbzgu-dlg-ico" style="font-size:26px; line-height:1;">⚠️</span>
                <div id="rmbzgu-dlg-msg" style="flex:1; font-size:13.5px; line-height:1.65; color:#3c4043; white-space:pre-line; padding-top:2px;"></div>
            </div>
            <div style="display:flex; gap:10px; margin-top:18px; justify-content:flex-end;">
                <button type="button" id="rmbzgu-dlg-no" style="border:1px solid #d5cfbe; cursor:pointer; border-radius:10px; padding:10px 16px; font-size:13px; font-weight:700; color:#555; background:none;">Cancelar</button>
                <button type="button" id="rmbzgu-dlg-ok" style="border:0; cursor:pointer; border-radius:10px; padding:10px 20px; font-size:13px; font-weight:800; color:#1c1500; background:linear-gradient(135deg,#f6ce4b,#f0b90b); min-width:110px;">OK</button>
            </div>
        </div>
    </div>
    <script>
    (function(){
        var dlg = document.getElementById('rmbzgu-dlg');
        var dlgMsg = document.getElementById('rmbzgu-dlg-msg'), dlgIco = document.getElementById('rmbzgu-dlg-ico');
        var dlgOk = document.getElementById('rmbzgu-dlg-ok'), dlgNo = document.getElementById('rmbzgu-dlg-no');
        var dlgRes = null;
        function guDialog(msg, isConfirm, ico){
            return new Promise(function(res){
                dlgRes = res;
                dlgMsg.textContent = msg;
                dlgIco.textContent = ico || (isConfirm ? '⚠️' : '💬');
                dlgNo.style.display = isConfirm ? '' : 'none';
                dlgOk.textContent = isConfirm ? 'Confirmar' : 'OK';
                dlg.style.display = 'flex';
            });
        }
        function guClose(v){ dlg.style.display = 'none'; if (dlgRes){ var r = dlgRes; dlgRes = null; r(v); } }
        dlgOk.addEventListener('click', function(){ guClose(true); });
        dlgNo.addEventListener('click', function(){ guClose(false); });
        dlg.addEventListener('click', function(e){ if (e.target === dlg) guClose(false); });

        // Continuar = decisão definitiva (confirm do tema, não do browser)
        var refuse = document.getElementById('rmbzgu-refuse'), refuseOk = false;
        if (refuse) refuse.addEventListener('submit', function(e){
            if (refuseOk) return;
            e.preventDefault();
            guDialog('DECISÃO DEFINITIVA — não pode ser invertida.\n\nAo escolheres CONTINUAR, ficas comprometido com o projeto até ao fim: se no futuro desistires, levas BANIMENTO do sistema e nunca mais poderás submeter projetos ou músicas na 1MZ For Artists.\n\nConfirmar que queres CONTINUAR o projeto?', true, '⚠️').then(function(ok){
                if (!ok) return;
                refuseOk = true;
                if (refuse.requestSubmit) refuse.requestSubmit(); else refuse.submit();
            });
        });

        // Assinatura: validação com avisos do tema
        var sf = document.getElementById('rmbzgu-signform');
        if (sf) sf.addEventListener('submit', function(e){
            var n = sf.querySelector('[name="sign_name"]').value.trim();
            var telIn = sf.querySelector('[name="sign_tel"]');
            // O +258 já está fixo à frente — o artista só põe o número dele.
            var t = telIn.value.replace(/\D+/g, '');
            if (t.indexOf('258') !== 0) t = '258' + t;
            if (n.length < 3){ e.preventDefault(); guDialog('Escreve o teu nome completo (assinatura).', false, '✍️'); return; }
            if (t !== sf.getAttribute('data-acc')){ e.preventDefault(); guDialog('O número da conta não confere.', false, '❌'); return; }
            telIn.value = t; // envia o número completo (258…) ao servidor
        });
    })();
    </script>
    <?php
}
add_action( 'wp_footer', 'rmbz_giveup_render_classic_modal' );

/* ─────────────────────────────────────────────────────────────────────────
 * ADMIN UI — bloco na coluna ESQUERDA do detalhe (botão + modal compilação)
 * ───────────────────────────────────────────────────────────────────────── */

function rmbz_giveup_admin_sideblock( $p, $extra ) {
    $facts = rmbz_giveup_facts( $p );
    $g = is_array( $extra['giveup'] ?? null ) ? $extra['giveup'] : null;
    $g_pending = $g && ( $g['status'] ?? '' ) === 'pending' && ( $g['mode'] ?? '' ) === 'request';
    $ec = is_array( $extra['giveup_email_confirm'] ?? null ) ? $extra['giveup_email_confirm'] : null;
    $ec_pending = $ec && (int) ( $ec['expires'] ?? 0 ) > time();
    $fmt = fn( $n ) => number_format( (float) $n, 2, ',', '.' );
    $cancelled = in_array( (string) $p->production_status, [ 'cancelled_no_confirmation', 'rejected', 'done' ], true );
    ?>
    <div class="rmbz-pjv2-side-block" style="border:1px solid #f0dcda; border-radius:14px; background:linear-gradient(180deg,#fffdfd,#fdf5f4); overflow:hidden; margin-bottom:16px; padding:16px 18px 18px;">
        <h3 style="display:flex; align-items:center; gap:8px;"><span class="ico">🛑</span> Desistir do projeto</h3>
        <?php if ( $cancelled ): ?>
            <?php if ( $g && in_array( $g['status'] ?? '', [ 'accepted', 'done' ], true ) ): ?>
                <div style="border:1px solid #d5d5d0; background:#f6f6f2; border-radius:10px; padding:10px 12px; font-size:12px; color:#555; line-height:1.6;">
                    <?php $gu_dt = fn( $v ) => $v ? date_i18n( 'd/m/Y \à\s H:i', strtotime( (string) $v ) ) : '—'; ?>
                    🔒 <b>Projeto fechado por desistência</b><?php echo ( $g['status'] === 'accepted' && ! empty( $g['signed_name'] ) ) ? ' — assinada por <b>' . esc_html( (string) $g['signed_name'] ) . '</b> (conta ' . esc_html( (string) ( $g['signed_tel'] ?? '' ) ) . ') em ' . esc_html( $gu_dt( $g['signed_at'] ?? $g['decided_at'] ?? '' ) ) : ' (forçada pela equipa em ' . esc_html( $gu_dt( $g['decided_at'] ?? '' ) ) . ')'; ?>.
                    Apenas o histórico fica disponível.
                    <?php if ( ! empty( $g['certificate_url'] ) ): ?><br>📄 <a href="#" onclick="rmbzGuCertOpen(); return false;">Ver certificado de desistência (PDF)</a><?php endif; ?>
                </div>
                <?php if ( ! empty( $g['certificate_url'] ) ): // [1.5.449] Certificado num MODAL — o PDF é
                      // carregado como BLOB (fetch) porque headers de segurança
                      // (X-Frame-Options/CSP) bloqueavam o URL direto no iframe. ?>
                <div id="rmbz-gu-cert-modal" style="display:none; position:fixed; inset:0; z-index:100001; background:rgba(0,0,0,.65); align-items:center; justify-content:center; padding:20px;">
                    <div style="background:#fff; border-radius:14px; max-width:860px; width:100%; height:90vh; display:flex; flex-direction:column; overflow:hidden; box-shadow:0 24px 70px rgba(0,0,0,.4);">
                        <div style="display:flex; align-items:center; gap:10px; padding:12px 18px; border-bottom:1px solid #eee;">
                            <span style="font-size:18px;">📄</span>
                            <b style="flex:1; font-size:14px;">Certificado de Desistência — 1MusicMoz</b>
                            <a href="<?php echo esc_url( (string) $g['certificate_url'] ); ?>" target="_blank" rel="noopener" class="button button-small">⬇️ Abrir / descarregar</a>
                            <button type="button" class="button button-small" onclick="document.getElementById('rmbz-gu-cert-modal').style.display='none';">✕ Fechar</button>
                        </div>
                        <div id="rmbz-gu-cert-load" style="padding:40px; text-align:center; color:#888; font-size:13px;">⏳ A carregar o certificado…</div>
                        <iframe id="rmbz-gu-cert-frame" style="flex:1; border:0; width:100%; display:none;"></iframe>
                    </div>
                </div>
                <script>
                var rmbzGuCertLoaded = false;
                function rmbzGuCertOpen(){
                    document.getElementById('rmbz-gu-cert-modal').style.display = 'flex';
                    if (rmbzGuCertLoaded) return;
                    rmbzGuCertLoaded = true;
                    fetch(<?php echo wp_json_encode( (string) $g['certificate_url'] ); ?>, { credentials: 'same-origin' })
                        .then(function(r){ return r.arrayBuffer(); })
                        .then(function(buf){
                            var url = URL.createObjectURL(new Blob([buf], { type: 'application/pdf' }));
                            var fr = document.getElementById('rmbz-gu-cert-frame');
                            fr.src = url; fr.style.display = 'block';
                            document.getElementById('rmbz-gu-cert-load').style.display = 'none';
                        })
                        .catch(function(){
                            document.getElementById('rmbz-gu-cert-load').textContent = '❌ Não foi possível carregar — usa "Abrir / descarregar".';
                            rmbzGuCertLoaded = false;
                        });
                }
                </script>
                <?php endif; ?>
            <?php else: ?>
                <p style="font-size:12px; color:#666; margin:6px 0 0;">Este projeto já está <?php echo (string) $p->production_status === 'done' ? 'concluído' : 'cancelado/rejeitado'; ?> — a desistência não se aplica.</p>
            <?php endif; ?>
        <?php elseif ( $ec_pending ): ?>
            <div style="border:1px solid #f0c36d; background:#fdf6e3; border-radius:10px; padding:10px 12px; font-size:12px; color:#8a6d1a; line-height:1.55;">
                📧 <b>Falta a tua confirmação por email.</b><br>
                Enviámos um link para <b><?php echo esc_html( (string) ( $ec['email'] ?? '' ) ); ?></b> (via: <?php echo ( $ec['mode'] ?? '' ) === 'forced' ? 'forçada' : 'pedir ao artista'; ?>). Abre o email e clica no link para concluir — expira às <b><?php echo esc_html( date_i18n( 'H:i', (int) $ec['expires'] ) ); ?></b>.
            </div>
            <form method="post" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>" style="margin-top:8px;">
                <input type="hidden" name="action" value="rmbz_project_giveup">
                <input type="hidden" name="project_id" value="<?php echo (int) $p->id; ?>">
                <input type="hidden" name="giveup_mode" value="cancel_email">
                <?php wp_nonce_field( 'rmbz_project_giveup_' . (int) $p->id ); ?>
                <button type="submit" class="button" style="width:100%;">↩️ Cancelar / recomeçar</button>
            </form>
        <?php elseif ( $g_pending ): ?>
            <div style="border:1px solid #f0c36d; background:#fdf6e3; border-radius:10px; padding:10px 12px; font-size:12px; color:#8a6d1a; line-height:1.55;">⏳ Pedido enviado ao artista em <b><?php echo esc_html( ! empty( $g['requested_at'] ) ? date_i18n( 'd/m/Y \à\s H:i', strtotime( (string) $g['requested_at'] ) ) : '—' ); ?></b> — à espera da decisão dele (conselho <?php echo ( $g['ai_source'] ?? '' ) === 'ai' ? 'da IA' : 'padrão'; ?> guardado).</div>
            <form method="post" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>" style="margin-top:8px;">
                <input type="hidden" name="action" value="rmbz_project_giveup">
                <input type="hidden" name="project_id" value="<?php echo (int) $p->id; ?>">
                <input type="hidden" name="giveup_mode" value="cancel_request">
                <?php wp_nonce_field( 'rmbz_project_giveup_' . (int) $p->id ); ?>
                <button type="submit" class="button" style="width:100%;">↩️ Anular o pedido</button>
            </form>
        <?php else: ?>
            <?php if ( $g && in_array( $g['status'] ?? '', [ 'refused', 'withdrawn' ], true ) ): ?>
                <p style="font-size:12px; color:#666; margin:6px 0 8px;"><?php echo ( $g['status'] === 'refused' ) ? '💪 O artista recusou desistir (' . esc_html( ! empty( $g['decided_at'] ) ? date_i18n( 'd/m/Y \à\s H:i', strtotime( (string) $g['decided_at'] ) ) : '—' ) . ') — podes voltar a pedir.' : '↩️ Último pedido foi anulado pela equipa.'; ?></p>
            <?php endif; ?>
            <p style="font-size:12px; color:#8a5a55; margin:6px 0 10px; line-height:1.5;">Abre a compilação do projeto e escolhe a via — nada acontece sem a tua <b>confirmação por email</b>.</p>
            <button type="button" onclick="document.getElementById('rmbz-giveup-modal').style.display='flex';"
                    style="width:100%; border:0; cursor:pointer; border-radius:10px; padding:11px 14px; font-size:13px; font-weight:700; color:#fff; background:linear-gradient(135deg,#d93025,#b3261e); box-shadow:0 4px 14px rgba(217,48,37,.28); display:flex; align-items:center; justify-content:center; gap:8px;"
                    onmouseover="this.style.transform='translateY(-1px)';" onmouseout="this.style.transform='';">
                🛑 Desistir do projeto…
            </button>
        <?php endif; ?>
    </div>

    <?php if ( ! $cancelled && ! $g_pending && ! $ec_pending ): ?>
    <div id="rmbz-giveup-modal" style="display:none; position:fixed; inset:0; z-index:100000; background:rgba(0,0,0,.55); align-items:center; justify-content:center; padding:20px;">
        <div style="background:#fff; border-radius:14px; max-width:640px; width:100%; max-height:92vh; overflow-y:auto; padding:22px 26px;">
            <div style="display:flex; align-items:center; gap:10px;">
                <h2 style="margin:0; font-size:17px; flex:1;">🛑 Desistir do projeto — compilação</h2>
                <button type="button" class="button" onclick="document.getElementById('rmbz-giveup-modal').style.display='none';">✕</button>
            </div>
            <table class="widefat striped" style="margin-top:14px;">
                <tbody>
                    <tr><td><b>Música</b></td><td><?php echo esc_html( $facts['title'] ); ?></td></tr>
                    <tr><td><b>Nível</b></td><td><?php echo esc_html( $facts['level_label'] ); ?></td></tr>
                    <tr><td><b>Estado atual</b></td><td><?php echo esc_html( $facts['status'] ); ?></td></tr>
                    <tr><td><b>Orçamento (parte do artista)</b></td><td><?php echo esc_html( $fmt( $facts['cost'] ) ); ?> MT (bruto: <?php echo esc_html( $fmt( $facts['cost_bruto'] ) ); ?> MT)</td></tr>
                    <tr><td><b>Já pago</b></td><td><?php echo esc_html( $fmt( $facts['paid'] ) ); ?> MT<?php echo $facts['paid'] > 0 ? ' — <span style="color:#b3261e;">PERDE-SE ao desistir (regra do projeto, sem devolução)</span>' : ''; ?></td></tr>
                    <tr><td><b>Em falta</b></td><td><?php echo esc_html( $fmt( $facts['falta'] ) ); ?> MT</td></tr>
                    <tr><td><b>Multa pendente</b></td><td><?php echo $facts['fine_pending'] > 0 ? esc_html( $fmt( $facts['fine_pending'] ) ) . ' MT' : '—'; ?></td></tr>
                    <tr><td><b>Valor de mercado (nível)</b></td><td>
                        <span id="rmbz-gu-mkt-view"><?php echo esc_html( $fmt( $facts['market'] ) ); ?> MT
                            <button type="button" class="button button-small" style="margin-left:8px;" onclick="document.getElementById('rmbz-gu-mkt-view').style.display='none'; document.getElementById('rmbz-gu-mkt-edit').style.display='flex';">✏️ Editar</button>
                        </span>
                        <form id="rmbz-gu-mkt-edit" method="post" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>" style="display:none; gap:6px; align-items:center;">
                            <input type="hidden" name="action" value="rmbz_project_giveup">
                            <input type="hidden" name="project_id" value="<?php echo (int) $p->id; ?>">
                            <input type="hidden" name="giveup_mode" value="market_value">
                            <?php wp_nonce_field( 'rmbz_project_giveup_' . (int) $p->id ); ?>
                            <input type="number" name="market_value" step="0.01" min="0" value="<?php echo esc_attr( (string) $facts['market'] ); ?>" style="width:130px;"> MT
                            <button type="submit" class="button button-small button-primary">Guardar</button>
                            <button type="button" class="button button-small" onclick="document.getElementById('rmbz-gu-mkt-edit').style.display='none'; document.getElementById('rmbz-gu-mkt-view').style.display='';">✕</button>
                        </form>
                        <div style="font-size:10.5px; color:#888; margin-top:3px;">Vale para TODOS os projetos do nível <?php echo esc_html( $facts['level_label'] ); ?>.</div>
                    </td></tr>
                    <tr><td><b>Poupança do artista</b></td><td><b style="color:#1a8a4a;"><?php echo esc_html( $fmt( $facts['savings'] ) ); ?> MT</b></td></tr>
                </tbody>
            </table>
            <?php if ( $facts['log'] ): ?>
                <p style="margin:12px 0 4px; font-weight:700; font-size:12px;">Últimos acontecimentos:</p>
                <ul style="margin:0 0 6px 18px; font-size:12px; color:#555;">
                    <?php foreach ( $facts['log'] as $ev ): ?><li><?php echo esc_html( trim( ( $ev['when'] ? $ev['when'] . ' — ' : '' ) . $ev['what'] ) ); ?></li><?php endforeach; ?>
                </ul>
            <?php endif; ?>
            <div style="border:1px solid #cfe3f7; background:#f2f8ff; border-radius:10px; padding:9px 13px; margin-top:14px; font-size:12px; color:#2a5b8f;">🔐 Segurança: qualquer que seja a via, vais receber um <b>email com um link de confirmação</b> (válido 30 min) — nada acontece antes de o abrires.</div>
            <div style="display:flex; gap:10px; margin-top:12px; flex-wrap:wrap;">
                <form method="post" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>" style="flex:1; min-width:220px;">
                    <input type="hidden" name="action" value="rmbz_project_giveup">
                    <input type="hidden" name="project_id" value="<?php echo (int) $p->id; ?>">
                    <input type="hidden" name="giveup_mode" value="request">
                    <?php wp_nonce_field( 'rmbz_project_giveup_' . (int) $p->id ); ?>
                    <button type="submit" style="width:100%; border:0; cursor:pointer; border-radius:10px; padding:12px 14px; font-size:13px; font-weight:700; color:#1c1500; background:linear-gradient(135deg,#f6ce4b,#f0b90b); box-shadow:0 4px 14px rgba(240,185,11,.30);">📨 Pedir ao artista (com conselho da IA)</button>
                    <p style="font-size:11px; color:#666; margin:6px 0 0;">Após confirmares no email, o artista vê no Início a compilação + conselho da IA e decide continuar ou desistir.</p>
                </form>
                <form method="post" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>" style="flex:1; min-width:220px;" onsubmit="return confirm('DESISTIR FORÇADO: após confirmares no teu email, o projeto é cancelado e o valor pago pelo artista PERDE-SE (regra do projeto, sem devolução). O artista recebe apenas o aviso. Continuar?');">
                    <input type="hidden" name="action" value="rmbz_project_giveup">
                    <input type="hidden" name="project_id" value="<?php echo (int) $p->id; ?>">
                    <input type="hidden" name="giveup_mode" value="forced">
                    <?php wp_nonce_field( 'rmbz_project_giveup_' . (int) $p->id ); ?>
                    <button type="submit" style="width:100%; border:0; cursor:pointer; border-radius:10px; padding:12px 14px; font-size:13px; font-weight:700; color:#fff; background:linear-gradient(135deg,#d93025,#b3261e); box-shadow:0 4px 14px rgba(217,48,37,.28);">🛑 Desistir forçado (sem perguntar)</button>
                    <p style="font-size:11px; color:#666; margin:6px 0 0;">Após confirmares no email, o artista recebe: "a equipa recebeu as orientações de desistência e desistiu do projeto".</p>
                </form>
            </div>
        </div>
    </div>
    <?php endif; ?>
    <?php
}
