<?php
// includes/user-perfil.php

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

/**
 * ==========================================================================
 * 1. INICIAR PEDIDO DE ATUALIZAÇÃO (GERAR CÓDIGO E ENVIAR E-MAIL)
 * ==========================================================================
 */
function rmbz_handle_update_profile_request() {
    $url = wp_get_referer() ? wp_get_referer() : home_url('/minha-conta/');
    
    if ( ! function_exists('rmbz_is_user_logged_in') || ! rmbz_is_user_logged_in() ) wp_die('Não autorizado.');
    if ( ! isset( $_POST['_wpnonce'] ) || ! wp_verify_nonce( $_POST['_wpnonce'], 'rmbz_update_profile_nonce' ) ) {
        $_SESSION['rmbz_withdrawal_notice'] = ['error', 'Falha de segurança.'];
        if (function_exists('rmbz_safe_redirect')) { rmbz_safe_redirect($url); } else { wp_redirect($url); exit; }
    }

    $telemovel = rmbz_get_current_user_telemovel();
    $new_email = sanitize_email($_POST['user_email']);
    $new_prov  = sanitize_text_field($_POST['user_provincia']);

    // ====================================================================
    // NOVA VERIFICAÇÃO: IMPEDIR E-MAILS DUPLICADOS
    // ====================================================================
    global $wpdb;
    $table = $wpdb->prefix . 'rmbz_wallets';
    
    // Verifica se o e-mail já existe na tabela de wallets, mas pertence a outro número
    $email_em_uso = $wpdb->get_var($wpdb->prepare(
        "SELECT id FROM $table WHERE user_email = %s AND user_telemovel != %s", 
        $new_email, $telemovel
    ));

    if ( $email_em_uso ) {
        $_SESSION['rmbz_withdrawal_notice'] = ['error', 'Este e-mail já está registado noutra conta de artista. Por favor, utilize um e-mail diferente.'];
        if (function_exists('rmbz_safe_redirect')) { rmbz_safe_redirect($url); } else { wp_redirect($url); exit; }
    }
    // ====================================================================

    // Gerar um Código OTP de 6 dígitos
    $otp = rand(100000, 999999);

    // Guardar na "memória temporária" por 15 minutos
    set_transient('rmbz_profile_otp_' . $telemovel, [
        'email'     => $new_email,
        'provincia' => $new_prov,
        'otp'       => $otp
    ], 15 * 60);

    // [1.5.407] Enviar o código com o email ANTI-SPAM partilhado (código no
    // assunto + corpo completo e pessoal) — o antigo, curto e vago, estava a
    // cair na pasta Spam do Gmail enquanto os outros emails entravam bem.
    if ( function_exists('rmbz_api_send_otp_email') ) {
        global $wpdb;
        $rmbz_otp_nome = (string) $wpdb->get_var( $wpdb->prepare(
            "SELECT user_nome FROM {$wpdb->prefix}rmbz_wallets WHERE user_telemovel = %s", $telemovel
        ) );
        rmbz_api_send_otp_email( $new_email, (string) $otp, $rmbz_otp_nome );
    } else {
        // Fallback improvável (API não carregada): versão simples em texto.
        $subject = $otp . ' é o teu código de confirmação — ' . get_bloginfo('name');
        wp_mail( $new_email, $subject, "O teu código de confirmação é: {$otp}\nVálido durante 15 minutos. Se não pediste, ignora este email." );
    }

    // Informar a Sessão que estamos à espera da validação
    $_SESSION['rmbz_verify_email_pending'] = true;
    $_SESSION['rmbz_withdrawal_notice'] = ['success', 'Enviámos um código secreto para o seu e-mail. Verifique a sua caixa de entrada (ou Spam) para confirmar!'];

    if (function_exists('rmbz_safe_redirect')) { rmbz_safe_redirect($url); } else { wp_redirect($url); exit; }
}
add_action('admin_post_rmbz_update_profile_request', 'rmbz_handle_update_profile_request');
add_action('admin_post_nopriv_rmbz_update_profile_request', 'rmbz_handle_update_profile_request');

/**
 * ==========================================================================
 * 2. VERIFICAR O CÓDIGO (OTP) E EFETIVAR A MUDANÇA
 * ==========================================================================
 */
function rmbz_handle_verify_profile_otp() {
    $url = wp_get_referer() ? wp_get_referer() : home_url('/minha-conta/');
    if ( ! function_exists('rmbz_is_user_logged_in') || ! rmbz_is_user_logged_in() ) wp_die('Não autorizado.');

    // [SEC-UP1] Adicionado nonce — antes era CSRF-vulnerable.
    if ( ! isset($_POST['_wpnonce']) || ! wp_verify_nonce($_POST['_wpnonce'], 'rmbz_verify_profile_otp_nonce') ) {
        wp_die('Falha de segurança (nonce).');
    }

    if ( session_status() === PHP_SESSION_NONE && ! headers_sent() ) { session_start(); }

    $telemovel = rmbz_get_current_user_telemovel();
    
    // Se o utilizador clicou em "Cancelar Validação"
    if (isset($_POST['cancel_otp'])) {
        delete_transient('rmbz_profile_otp_' . $telemovel);
        unset($_SESSION['rmbz_verify_email_pending']);
        if (function_exists('rmbz_safe_redirect')) { rmbz_safe_redirect($url); } else { wp_redirect($url); exit; }
    }

    $user_otp = sanitize_text_field($_POST['email_otp']);
    $transient = get_transient('rmbz_profile_otp_' . $telemovel);

    // O código expirou ou não existe
    if (!$transient || !isset($transient['otp'])) {
        unset($_SESSION['rmbz_verify_email_pending']);
        $_SESSION['rmbz_withdrawal_notice'] = ['error', 'O tempo limite de 15 minutos expirou. Por favor, tente atualizar o perfil novamente.'];
        if (function_exists('rmbz_safe_redirect')) { rmbz_safe_redirect($url); } else { wp_redirect($url); exit; }
    }

    // Se o código estiver correto!
    if ((string)$user_otp === (string)$transient['otp']) {
        global $wpdb;
        $table = $wpdb->prefix . 'rmbz_wallets';

        // Verifica se é o primeiro E-mail (Onboarding)
        $old_email = $wpdb->get_var($wpdb->prepare("SELECT user_email FROM $table WHERE user_telemovel = %s", $telemovel));
        $is_first_time = (strpos((string)$old_email, '@1mz.local') !== false);

        // Guardar definitivamente
        $wpdb->update(
            $table, 
            ['user_email' => $transient['email'], 'user_provincia' => $transient['provincia']], 
            ['user_telemovel' => $telemovel], 
            ['%s', '%s'], ['%s']
        );

        if ( $is_first_time ) {
            // VOLTAMOS A COLOCAR O ENVIO DO E-MAIL AQUI!
            $nome = $wpdb->get_var($wpdb->prepare("SELECT user_nome FROM $table WHERE user_telemovel = %s", $telemovel));
            if (function_exists('rmbz_send_welcome_email')) { 
                rmbz_send_welcome_email($transient['email'], $nome); 
            }
            update_option('rmbz_show_welcome_' . $telemovel, 'yes'); 
        }

        // Limpar dados temporários e sessão
        delete_transient('rmbz_profile_otp_' . $telemovel);
        unset($_SESSION['rmbz_verify_email_pending']);

        $_SESSION['rmbz_withdrawal_notice'] = ['success', 'E-mail validado e Perfil atualizado com sucesso!'];
    } else {
        $_SESSION['rmbz_withdrawal_notice'] = ['error', 'Código incorreto. Verifique novamente no seu e-mail.'];
    }

    if (function_exists('rmbz_safe_redirect')) { rmbz_safe_redirect($url); } else { wp_redirect($url); exit; }
}
add_action('admin_post_rmbz_verify_profile_otp', 'rmbz_handle_verify_profile_otp');
add_action('admin_post_nopriv_rmbz_verify_profile_otp', 'rmbz_handle_verify_profile_otp');

/**
 * ==========================================================================
 * 3. RENDERIZAR O MODAL DE EDIÇÃO OU O MODAL DE VALIDAÇÃO
 * ==========================================================================
 */
function rmbz_render_profile_modal( $user_data, $has_subscription = false ) {
    // [DS 1.5.45] Modal de Perfil refeito com design system.
    //
    // Componentes:
    //   rmbz_modal() / rmbz_field() / rmbz_btn() / rmbz_alert() (helpers PHP)
    //
    // 2 modais coexistentes:
    //   • profile-modal       — formulário normal (sempre presente)
    //   • profile-otp-modal   — verificação OTP (só quando $_SESSION
    //                            ['rmbz_verify_email_pending'] está set)
    //
    // Contratos servidor PRESERVADOS:
    //   • rmbz_update_profile_request    + rmbz_update_profile_nonce
    //   • rmbz_verify_profile_otp        + rmbz_verify_profile_otp_nonce
    //   • Campos: user_email, user_provincia (sub), email_otp, cancel_otp
    //
    // Lógica especial preservada:
    //   • Email "@1mz.local" → mostra vazio (placeholder)
    //   • Província lê de extra_data.provincia OU fallback user_provincia
    //   • Sem subscrição → email/província bloqueados com aviso
    //   • Nome artístico SEMPRE readonly
    //   • OTP modal abre auto se $is_pending_otp (estado de fluxo)

    $provincias = [
        'Maputo Cidade', 'Maputo Província', 'Gaza', 'Inhambane',
        'Sofala', 'Manica', 'Tete', 'Zambézia',
        'Nampula', 'Cabo Delgado', 'Niassa', 'Diáspora (Exterior)'
    ];

    $email_atual = ( strpos( $user_data->user_email, '@1mz.local' ) !== false ) ? '' : $user_data->user_email;

    $extra = ! empty( $user_data->extra_data ) ? json_decode( $user_data->extra_data, true ) : [];
    $provincia_atual = isset( $extra['provincia'] ) ? $extra['provincia'] : ( $user_data->user_provincia ?? '' );

    $is_pending_otp = isset( $_SESSION['rmbz_verify_email_pending'] ) && $_SESSION['rmbz_verify_email_pending'] === true;

    // SVG icons inline
    $icon_email = '<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="48" height="48">'
                . '<rect x="3" y="5" width="18" height="14" rx="2" stroke="currentColor" stroke-width="1.6"/>'
                . '<path d="M3 7l9 7 9-7" stroke="currentColor" stroke-width="1.6" stroke-linejoin="round"/>'
                . '</svg>';
    $icon_check = '<svg viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">'
                . '<path d="M4 10l4 4 8-8" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>'
                . '</svg>';
    $icon_save = '<svg viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">'
               . '<path d="M14 4H4a1 1 0 00-1 1v10a1 1 0 001 1h12a1 1 0 001-1V8l-3-4z" stroke="currentColor" stroke-width="1.8" stroke-linejoin="round"/>'
               . '<path d="M6 4v5h7M7 12h6" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/>'
               . '</svg>';
    $icon_lock = '<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="40" height="40">'
               . '<rect x="5" y="11" width="14" height="10" rx="1.8" stroke="currentColor" stroke-width="1.6"/>'
               . '<path d="M8 11V7a4 4 0 018 0v4" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/>'
               . '</svg>';

    // ─── MODAL OTP ─────────────────────────────────────────────────────────
    if ( $is_pending_otp ):
        $otp_body = '<div class="rmbz-stack-md">'
                  // Ícone email centrado
                  . '<div style="display:flex;justify-content:center;color:var(--rmbz-brand);">'
                  . $icon_email
                  . '</div>'
                  . '<p style="margin:0;color:var(--rmbz-text-secondary);font-size:var(--rmbz-text-sm);line-height:var(--rmbz-leading-relaxed);text-align:center;">'
                  . esc_html__( 'Enviámos um código de segurança de 6 dígitos para o e-mail que introduziu. Insira-o abaixo para concluir.', '1mz-for-artists' )
                  . '</p>'
                  // Form de validação OTP
                  . '<form method="post" action="' . esc_url( admin_url('admin-post.php') ) . '" class="rmbz-stack-md">'
                  . '<input type="hidden" name="action" value="rmbz_verify_profile_otp">'
                  . wp_nonce_field( 'rmbz_verify_profile_otp_nonce', '_wpnonce', true, false )
                  . '<div class="rmbz-field">'
                  . '<input type="text" '
                  .   'name="email_otp" '
                  .   'required '
                  .   'placeholder="123456" '
                  .   'maxlength="6" '
                  .   'minlength="6" '
                  .   'pattern="\d{6}" '
                  .   'inputmode="numeric" '
                  .   'autocomplete="one-time-code" '
                  .   'class="rmbz-input" '
                  .   'style="text-align:center;font-family:var(--rmbz-font-mono);font-weight:var(--rmbz-weight-bold);letter-spacing:0.5em;font-size:var(--rmbz-text-2xl);color:var(--rmbz-brand);">'
                  . '</div>'
                  . rmbz_btn([
                        'label'   => __( 'Validar E-mail', '1mz-for-artists' ),
                        'variant' => 'primary',
                        'type'    => 'submit',
                        'icon'    => $icon_check,
                        'full'    => true,
                        'attrs'   => [ 'data-rmbz-loading-on-submit' => '1' ],
                    ])
                  . '</form>'
                  // Form de cancelamento (separado porque envia cancel_otp=1)
                  . '<form method="post" action="' . esc_url( admin_url('admin-post.php') ) . '" style="margin-top:var(--rmbz-space-2);">'
                  . '<input type="hidden" name="action" value="rmbz_verify_profile_otp">'
                  . '<input type="hidden" name="cancel_otp" value="1">'
                  . wp_nonce_field( 'rmbz_verify_profile_otp_nonce', '_wpnonce', true, false )
                  . '<button type="submit" style="display:block;width:100%;background:none;border:none;color:var(--rmbz-danger);font-size:var(--rmbz-text-xs);cursor:pointer;text-decoration:underline;padding:var(--rmbz-space-2);">'
                  . esc_html__( 'Cancelar alteração', '1mz-for-artists' )
                  . '</button>'
                  . '</form>'
                  . '</div>';

        echo rmbz_modal([
            'id'    => 'profile-otp-modal',
            'title' => __( 'Verifique o seu e-mail', '1mz-for-artists' ),
            'body'  => $otp_body,
        ]);
        ?>
        <script>
            // [DS 1.5.45] OTP modal abre automaticamente — é um estado de
            // fluxo (utilizador acabou de submeter, sessão pendente de OTP).
            document.addEventListener('DOMContentLoaded', function() {
                if (window.rmbz && window.rmbz.modal) {
                    window.rmbz.modal.open('profile-otp-modal');
                }
            });
        </script>
        <?php
        return;
    endif;

    // ─── MODAL PERFIL (caminho normal) ─────────────────────────────────────
    ob_start();
    ?>
    <form method="post" action="<?php echo esc_url( admin_url('admin-post.php') ); ?>" class="rmbz-stack-md">
        <input type="hidden" name="action" value="rmbz_update_profile_request">
        <?php wp_nonce_field('rmbz_update_profile_nonce'); ?>

        <?php
        // Nome artístico — sempre readonly
        echo rmbz_field([
            'name'   => 'user_nome_readonly',  // nome diferente para não submeter
            'label'  => __( 'Nome Artístico', '1mz-for-artists' ),
            'type'   => 'text',
            'value'  => $user_data->user_nome,
            'hint'   => __( 'O nome artístico é imutável após o registo.', '1mz-for-artists' ),
            'attrs'  => [
                'readonly' => 'readonly',
                'style'    => 'background:var(--rmbz-bg-base);color:var(--rmbz-text-muted);cursor:not-allowed;',
            ],
        ]);
        ?>

        <?php if ( $has_subscription ): ?>
            <?php
            // Email editável
            echo rmbz_field([
                'name'        => 'user_email',
                'label'       => __( 'Endereço de e-mail', '1mz-for-artists' ),
                'type'        => 'email',
                'value'       => $email_atual,
                'placeholder' => 'exemplo@gmail.com',
                'required'    => true,
                'hint'        => __( 'Após guardar, enviaremos um código de verificação para este e-mail.', '1mz-for-artists' ),
                'attrs'       => [
                    'autocomplete' => 'email',
                ],
            ]);
            ?>

            <div class="rmbz-field">
                <label class="rmbz-field__label" for="profile-provincia">
                    <?php esc_html_e( 'A sua província', '1mz-for-artists' ); ?>
                </label>
                <select name="user_provincia"
                        id="profile-provincia"
                        required
                        class="rmbz-input">
                    <option value="" disabled <?php selected( $provincia_atual, '' ); ?>>
                        -- <?php esc_html_e( 'Seleccione a província', '1mz-for-artists' ); ?> --
                    </option>
                    <?php foreach ( $provincias as $prov ): ?>
                        <option value="<?php echo esc_attr( $prov ); ?>" <?php selected( $provincia_atual, $prov ); ?>>
                            <?php echo esc_html( $prov ); ?>
                        </option>
                    <?php endforeach; ?>
                </select>
            </div>

            <?php
            echo rmbz_btn([
                'label'   => __( 'Salvar e verificar e-mail', '1mz-for-artists' ),
                'variant' => 'primary',
                'type'    => 'submit',
                'icon'    => $icon_save,
                'full'    => true,
                'attrs'   => [ 'data-rmbz-loading-on-submit' => '1' ],
            ]);
            ?>

        <?php else: ?>
            <?php
            // Sem subscrição — campos bloqueados
            echo rmbz_alert([
                'variant' => 'warning',
                'icon'    => $icon_lock,
                'title'   => __( 'Acesso bloqueado', '1mz-for-artists' ),
                'body'    => '<p style="margin:0;font-size:var(--rmbz-text-sm);line-height:var(--rmbz-leading-relaxed);">'
                           . wp_kses_post( __( 'O preenchimento do <strong>e-mail</strong> e da <strong>província</strong> ficará disponível assim que activar a sua subscrição VIP.', '1mz-for-artists' ) )
                           . '</p>',
            ]);

            echo rmbz_btn([
                'label'   => __( 'Guardar', '1mz-for-artists' ),
                'variant' => 'locked',
                'icon'    => $icon_save,
                'full'    => true,
                'attrs'   => [
                    'disabled'   => 'disabled',
                    'title'      => __( 'Active a subscrição VIP para editar o perfil.', '1mz-for-artists' ),
                    'aria-label' => __( 'Guardar (bloqueado — requer subscrição VIP)', '1mz-for-artists' ),
                ],
            ]);
            ?>
        <?php endif; ?>
    </form>
    <?php
    $profile_body = ob_get_clean();

    echo rmbz_modal([
        'id'    => 'profile-modal',
        'title' => __( 'Perfil', '1mz-for-artists' ),
        'body'  => $profile_body,
    ]);
}
