<?php

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

// --- FUNÇÃO AJAX PARA O UPLOAD DO DOCUMENTO (Existente e Inalterada) ---
add_action('wp_ajax_imz_upload_claim_document', 'imz_ajax_upload_claim_document');
function imz_ajax_upload_claim_document() {
    check_ajax_referer('imz_upload_claim_document_nonce', 'nonce'); // Nonce definido em

    if (empty($_FILES['claim_document'])) {
        wp_send_json_error(['message' => 'Nenhum ficheiro recebido.']);
    }

    $file = $_FILES['claim_document'];
    $max_size = 5 * 1024 * 1024; // 5MB
    $allowed_types = ['application/pdf', 'image/jpeg'];

    if ($file['size'] > $max_size) {
        wp_send_json_error(['message' => 'O ficheiro excede o tamanho máximo de 5MB.']);
    }
    if (!in_array($file['type'], $allowed_types)) {
        wp_send_json_error(['message' => 'Tipo de ficheiro inválido. Apenas PDF e JPG são permitidos.']);
    }

    require_once(ABSPATH . 'wp-admin/includes/image.php');
    require_once(ABSPATH . 'wp-admin/includes/file.php');
    require_once(ABSPATH . 'wp-admin/includes/media.php');

    $attachment_id = media_handle_upload('claim_document', 0);

    if (is_wp_error($attachment_id)) {
        wp_send_json_error(['message' => $attachment_id->get_error_message()]);
    } else {
        wp_send_json_success(['attachment_id' => $attachment_id]);
    }
}


// =============================================================================
// HANDLERS PARA PEDIDOS DE COMPRA DE MÚSICA
// =============================================================================

// Ação: Artista marcou como "Contactado" (Gerar Código)
add_action('wp_ajax_imz_artist_contacted_buyer', 'imz_ajax_artist_contacted_buyer');
function imz_ajax_artist_contacted_buyer() {
    check_ajax_referer('imz_purchase_action_nonce', 'nonce'); // Nonce definido em
    $artist_id = get_current_user_id();
    $request_id = isset($_POST['request_id']) ? absint($_POST['request_id']) : 0;

    // Validação de segurança: verificar se o post pertence ao artista
    if (get_post_field('post_author', $request_id) != $artist_id) {
        wp_send_json_error(['message' => 'Erro de permissão.']);
    }

    // --- BUSCAR O PREÇO E GUARDAR NO PEDIDO ---
    $music_id = get_post_meta($request_id, '_music_id', true); // ID da música
    $price = get_post_meta($music_id, '_imz_paid_download_price', true); // Preço definido na música

    if (empty($price) || !is_numeric($price)) {
        $price = 0; // Define um fallback, embora deva sempre ter um preço
    }

    // Guarda o preço no post de pedido para referência futura (usado no dashboard e na validação do código)
    update_post_meta($request_id, '_purchase_price', (float)$price);
    // --- FIM DA LÓGICA DE PREÇO ---

    // Gerar código único de 6 dígitos
    $download_code = rand(100000, 999999);

    update_post_meta($request_id, '_download_code', $download_code); // Guarda o código
    update_post_meta($request_id, '_status', 'concluido'); // Muda status para 'concluido' = código gerado, pronto a usar

    $user_phone = get_post_meta($request_id, '_user_phone', true); // Número do comprador
    $whatsapp_link = 'https://wa.me/258' . esc_attr($user_phone) . '?text=' . rawurlencode('Olá! Aqui está o seu código para baixar a música: ' . $download_code);

    $message = 'Código gerado com sucesso: <strong>' . $download_code . '</strong><br>Envie este código ao comprador. <a href="' . $whatsapp_link . '" target="_blank" class="button" style="margin-top: 10px;">Enviar via WhatsApp</a>';
    wp_send_json_success(['message' => $message]);
}

// Ação: Artista cancelou o pedido
add_action('wp_ajax_imz_artist_cancel_buyer', 'imz_ajax_artist_cancel_buyer');
function imz_ajax_artist_cancel_buyer() {
    check_ajax_referer('imz_purchase_action_nonce', 'nonce'); // Nonce definido em
    $artist_id = get_current_user_id();
    $request_id = isset($_POST['request_id']) ? absint($_POST['request_id']) : 0;

    // Validação de segurança
    if (get_post_field('post_author', $request_id) != $artist_id) {
        wp_send_json_error(['message' => 'Erro de permissão.']);
    }

    // Apaga (move para o lixo) o pedido de compra
    wp_delete_post($request_id, false); // false = mover para o lixo

    wp_send_json_success(['message' => 'Pedido cancelado e movido para o lixo.']);
}


// --- HANDLERS AJAX PARA OS FORMULÁRIOS DO PAINEL ---

/**
 * 1. Lidar com a submissão de pedidos de proteção (Takedown)
 */
add_action('wp_ajax_imz_submit_takedown', 'imz_ajax_submit_takedown');
function imz_ajax_submit_takedown() {
    check_ajax_referer('imz_submit_takedown_action', 'imz_submit_takedown_nonce'); // Nonce definido em
    $artist_id = get_current_user_id();

    // Apenas Artistas PRO podem submeter
    if (!imz_is_artist_pro($artist_id)) { //
        wp_send_json_error(['message' => 'Erro: Apenas Artistas PRO podem submeter pedidos de proteção.']);
    }

    // Verifica se os termos anti-fraude foram aceites
    if (!isset($_POST['takedown_terms_agree'])) { // Campo do formulário
        wp_send_json_error(['message' => 'Erro: Você deve ler e concordar com a política anti-fraude para submeter um pedido.']);
    }

    // Recolhe e sanitiza os dados do formulário
    $music_id = isset($_POST['takedown_music_id']) ? absint($_POST['takedown_music_id']) : 0;
    $infringing_url = isset($_POST['takedown_infringing_url']) ? esc_url_raw($_POST['takedown_infringing_url']) : '';
    $comments = isset($_POST['takedown_comments']) ? sanitize_textarea_field($_POST['takedown_comments']) : '';

    // Validação adicional: Música deve ser do artista E reivindicada
    $post_author = get_post_field('post_author', $music_id);
    $is_claimed = get_post_meta($music_id, '_is_claimed', true) === 'yes'; //

    // (PROs podem submeter para qualquer música sua reivindicada)
    if (!$is_claimed || (int)$post_author !== $artist_id) {
         wp_send_json_error(['message' => 'Erro: Apenas músicas reivindicadas por si podem ter pedidos de proteção.']);
    }

    // Verifica se os dados essenciais estão presentes
    if ($music_id > 0 && !empty($infringing_url)) {
        $music_title = get_the_title($music_id);
        $request_title = 'Pedido de Proteção para "' . $music_title . '"';

        // Cria o post do tipo 'imz_takedown'
        wp_insert_post([
            'post_type' => 'imz_takedown',
            'post_title' => $request_title,
            'post_status' => 'publish',
            'post_author' => $artist_id,
            'meta_input' => [
                '_music_id' => $music_id, // ID da música original
                '_infringing_url' => $infringing_url, // Link infrator
                '_takedown_status' => 'pendente', // Status inicial
                '_takedown_comments' => $comments // Comentários do artista
            ]
        ]);

        wp_send_json_success(['message' => 'O seu pedido de proteção foi enviado com sucesso.']);
    } else {
        wp_send_json_error(['message' => 'Dados inválidos. Por favor, preencha todos os campos obrigatórios.']);
    }
    wp_die();
}

/**
 * 2. Lidar com a atualização das definições de download (Modo Gratuito/Pago, Limites, Países Bloqueados)
 */
add_action('wp_ajax_imz_save_music_settings', 'imz_ajax_save_music_settings');
function imz_ajax_save_music_settings() {
    check_ajax_referer('imz_save_music_settings_action', 'imz_save_music_settings_nonce'); // Nonce definido em
    $artist_id = get_current_user_id();
    $is_pro = imz_is_artist_pro($artist_id); // Re-verificar aqui por segurança

    $post_id = isset($_POST['music_post_id']) ? absint($_POST['music_post_id']) : 0; // ID da música vindo do formulário
    $post_author = get_post_field('post_author', $post_id);

    // Verifica se a música pertence ao artista atual
    if ($post_id > 0 && (int)$post_author === $artist_id) {

        // --- SALVAR DOWNLOAD MODES (Gratuito vs Pago) ---
        $enable_free = isset($_POST['_imz_enable_download']) && $_POST['_imz_enable_download'] === 'yes'; // Checkbox Gratuito
        $enable_paid = isset($_POST['_imz_enable_paid_download']) && $_POST['_imz_enable_paid_download'] === 'yes'; // Checkbox Pago

        // Lógica de Salvamento:
        if ($is_pro && $enable_paid) {
            // Se for PRO e ativou o pago, força o gratuito a 'no' e salva o preço
            update_post_meta($post_id, '_imz_enable_paid_download', 'yes'); //
            update_post_meta($post_id, '_imz_enable_download', ''); // Desativa o gratuito
            if (isset($_POST['_imz_paid_download_price'])) { // Campo Preço
                update_post_meta($post_id, '_imz_paid_download_price', sanitize_text_field($_POST['_imz_paid_download_price'])); //
            }
        } elseif ($enable_free) {
            // Se ativou o gratuito (ou se não for PRO e tentou ativar o pago), força o pago a 'no' (ou mantém 'expired_pro')
            update_post_meta($post_id, '_imz_enable_download', 'yes');
            $current_paid_status = get_post_meta($post_id, '_imz_enable_paid_download', true);
            if ($current_paid_status !== 'expired_pro') { // Só muda se não estiver expirado
                 update_post_meta($post_id, '_imz_enable_paid_download', '');
            }
            // Não mexer no preço aqui, para o caso de reativar
        } else {
             // Se desmarcou ambos, desativa ambos (exceto se for 'expired_pro')
             update_post_meta($post_id, '_imz_enable_download', '');
             $current_paid_status = get_post_meta($post_id, '_imz_enable_paid_download', true);
             if ($current_paid_status !== 'expired_pro') {
                 update_post_meta($post_id, '_imz_enable_paid_download', '');
             }
        }
        // --- FIM DO SALVAMENTO DOS MODOS ---

        // Salva os campos PRO (Limites e Países) - APENAS SE FOR PRO
        if ($is_pro) {
            if (isset($_POST['_imz_download_limit_per_post'])) { // Campo Limite Total
                // Limpa se for vazio ou 0 para ilimitado
                $limit = sanitize_text_field($_POST['_imz_download_limit_per_post']);
                update_post_meta($post_id, '_imz_download_limit_per_post', ($limit === '' || $limit === '0') ? '' : $limit); // Usado em
            }
            if (isset($_POST['_imz_daily_download_limit'])) { // Campo Limite Diário
                // Limpa se for vazio para usar padrão global
                $limit = sanitize_text_field($_POST['_imz_daily_download_limit']);
                update_post_meta($post_id, '_imz_daily_download_limit', ($limit === '') ? '' : $limit); // Usado em
            }
            if (isset($_POST['_imz_blocked_countries_per_post'])) { // Campo Países Bloqueados
                 // Limpa espaços e converte para maiúsculas
                $countries = sanitize_text_field($_POST['_imz_blocked_countries_per_post']);
                $countries = strtoupper(str_replace(' ', '', $countries));
                update_post_meta($post_id, '_imz_blocked_countries_per_post', $countries); // Usado em
            }
        }

        wp_send_json_success(['message' => 'Definições da música atualizadas com sucesso!']);
    } else {
        wp_send_json_error(['message' => 'Erro: Não foi possível guardar as definições. Música inválida ou não pertence a si.']);
    }
    wp_die();
}


/**
 * 3. Lidar com o PEDIDO DE PAGAMENTO (Saque)
 */
// Rota de saque legada desativada: levantamentos usam exclusivamente a carteira 1MZ.
function imz_ajax_request_payout() {
    check_ajax_referer('imz_request_payout_action', 'imz_request_payout_nonce'); // Nonce definido em
    $artist_id = get_current_user_id();

    // --- PROTEÇÃO CONTRA PEDIDOS SIMULTÂNEOS (race condition) ---
    // Lock temporário: bloqueia um segundo pedido enquanto este está a ser processado
    $lock_key = 'imz_payout_lock_' . $artist_id;
    if (get_transient($lock_key)) {
        wp_send_json_error(['message' => 'O seu pedido já está a ser processado. Aguarde alguns segundos.']);
    }
    set_transient($lock_key, 1, 30);

    // Guarda de idempotência: só é permitido UM pedido de saque pendente por artista
    $existing_pending = get_posts([
        'post_type'      => 'imz_payout',
        'author'         => $artist_id,
        'post_status'    => 'publish',
        'posts_per_page' => 1,
        'fields'         => 'ids',
        'meta_key'       => '_payout_status',
        'meta_value'     => 'pendente',
        'no_found_rows'  => true,
    ]);
    if (!empty($existing_pending)) {
        delete_transient($lock_key);
        wp_send_json_error(['message' => 'Já tem um pedido de saque pendente. Aguarde a sua resolução antes de fazer outro.']);
    }

    // --- RECALCULA O SALDO DISPONÍVEL (APENAS DE BOOSTS) ---
    $total_boost_earnings = 0;
    $claimed_musics_query = new WP_Query([ // Busca todas as músicas reivindicadas pelo artista
        'post_type' => 'post', 'author' => $artist_id, 'posts_per_page' => -1,
        'meta_key' => '_is_claimed', 'meta_value' => 'yes', 'post_status' => 'publish'
    ]);
    if ($claimed_musics_query->have_posts()) {
        while ($claimed_musics_query->have_posts()) {
            $claimed_musics_query->the_post();
            $total_boost_earnings += (float) get_post_meta(get_the_ID(), '_artist_earnings', true); // Soma os ganhos de boosts de cada música
        }
        wp_reset_postdata();
    }
    $pending_payout = (float) get_user_meta($artist_id, '_artist_pending_payout', true); // Valor já solicitado e pendente
    $available_balance = $total_boost_earnings - $pending_payout; // Saldo real que pode sacar
    // --- FIM DO RECALCULO ---

    // Verifica se o saldo disponível atinge o mínimo para saque
    if ($available_balance >= IMZ_MIN_PAYOUT_AMOUNT) {
        // Cria o post do tipo 'imz_payout'
        $payout_post_id = wp_insert_post([
            'post_type' => 'imz_payout',
            'post_title' => 'Pedido de Pagamento de ' . wp_get_current_user()->display_name . ' - ' . date_i18n('d/m/Y'),
            'post_status' => 'publish',
            'post_author' => $artist_id,
        ]);
        if ($payout_post_id) {
            // Guarda os detalhes do pedido
            update_post_meta($payout_post_id, '_artist_id', $artist_id); // ID do artista
            update_post_meta($payout_post_id, '_payout_amount', $available_balance); // Valor solicitado
            update_post_meta($payout_post_id, '_payout_status', 'pendente'); // Status inicial
            // Atualiza o saldo pendente do artista para evitar pedidos duplicados
            update_user_meta($artist_id, '_artist_pending_payout', $pending_payout + $available_balance);
            delete_transient($lock_key);
            wp_send_json_success(['message' => 'O seu pedido de pagamento foi enviado com sucesso.']);
        } else {
             delete_transient($lock_key);
             wp_send_json_error(['message' => 'Erro ao criar o pedido de pagamento.']);
        }
    } else {
        delete_transient($lock_key);
        wp_send_json_error(['message' => 'O saldo disponível é inferior ao mínimo para saque ('.IMZ_MIN_PAYOUT_AMOUNT.' MT).']);
    }
    wp_die();
}

/**
 * 4. Lidar com a CONFIGURAÇÃO DO MÉTODO DE PAGAMENTO (Só pode ser feito uma vez)
 */
// Rota de método de pagamento legada desativada: os dados pertencem à carteira 1MZ.
function imz_ajax_save_payout_method() {
    check_ajax_referer('imz_save_payout_method_action', 'imz_save_payout_method_nonce'); // Nonce definido em
    $artist_id = get_current_user_id();

    // Verifica se já existe um método configurado
    if (empty(get_user_meta($artist_id, '_payout_method', true))) {
        // Recolhe e sanitiza dados do formulário
        $method = isset($_POST['payout_method']) ? sanitize_text_field($_POST['payout_method']) : '';
        $details = isset($_POST['payout_details']) ? sanitize_text_field($_POST['payout_details']) : '';

        // Valida se o método foi selecionado e o número tem 9 dígitos
        if (!empty($method) && !empty($details) && preg_match('/^[0-9]{9}$/', $details)) {
            // Guarda os metadados do utilizador
            update_user_meta($artist_id, '_payout_method', $method); // Usado em
            update_user_meta($artist_id, '_payout_details', $details); // Usado em
            wp_send_json_success(['message' => 'Método de pagamento configurado com sucesso!']);
        } else {
            wp_send_json_error(['message' => 'Dados inválidos. O método deve ser selecionado e o número deve ter 9 dígitos.']);
        }
    } else {
        wp_send_json_error(['message' => 'O seu método de pagamento já foi configurado. Contacte o suporte para o alterar.']);
    }
    wp_die();
}

/**
 * 5. Lidar com a REIVINDICAÇÃO DE MÚSICA
 */
add_action('wp_ajax_imz_claim_music', 'imz_ajax_claim_music');
function imz_ajax_claim_music() {
    if ( function_exists( 'rmbz_dm_native_ready' ) ) {
        wp_send_json_error( [ 'message' => 'O pedido por link foi desativado. Abre Músicas & Ganhos e ativa diretamente uma música ligada ao teu Art Track.' ] );
    }
    check_ajax_referer('imz_claim_music_action', 'imz_claim_music_nonce'); // Nonce definido em
    $artist_id = get_current_user_id();

    // Verifica limite para artistas gratuitos
    $is_pro = imz_is_artist_pro($artist_id);
    if (!$is_pro) {
        $music_count_query = new WP_Query(['post_type' => 'post','author' => $artist_id,'post_status' => 'publish','meta_key' => '_is_claimed','meta_value' => 'yes']);
        $current_music_count = $music_count_query->found_posts;
        if ($current_music_count >= IMZ_FREE_ARTIST_MUSIC_LIMIT) { // Constante definida em
            wp_send_json_error(['message' => 'Você atingiu o limite de ' . IMZ_FREE_ARTIST_MUSIC_LIMIT . ' músicas para o plano gratuito. Faça upgrade para Artista PRO.']);
        }
    }

    // Recolhe dados do formulário
    $music_url = isset($_POST['music_url']) ? esc_url_raw($_POST['music_url']) : '';
    $document_id = isset($_POST['claim_document_id']) ? absint($_POST['claim_document_id']) : 0;
    $music_id = url_to_postid($music_url); // Tenta encontrar o ID do post a partir do URL

    // Função auxiliar para apagar o documento carregado em caso de erro
    $delete_attachment_on_error = function($doc_id) { if ($doc_id > 0) { wp_delete_attachment($doc_id, true); } };

    // Validações
    if ($document_id === 0) {
        wp_send_json_error(['message' => 'Erro: É obrigatório anexar o documento de registo.']);
    }

    if ($music_id > 0) { // Se o URL corresponde a um post válido
        // Verifica se já existe uma reivindicação (pendente ou aprovada) para esta música
        $existing_claims_query = new WP_Query([
            'post_type' => 'claim', // CPT de reivindicações
            'post_status' => ['pending', 'publish', 'claim_approved'], // Status relevantes
            'meta_query' => [['key' => 'music_id', 'value' => $music_id]]
        ]);

        if ($existing_claims_query->have_posts()) {
            $delete_attachment_on_error($document_id); // Apaga o doc carregado, pois já existe claim
            $existing_claims_query->the_post();
            $claim_author_id = get_the_author_meta('ID');
            $claim_status = get_post_status();
            wp_reset_postdata();

            // Mensagem de erro apropriada
            if ($claim_author_id == $artist_id) {
                $message = ($claim_status === 'claim_approved' || $claim_status === 'publish') ? 'Esta música já está na sua lista.' : 'Você já reivindicou esta música. Aguarde a aprovação.';
                wp_send_json_error(['message' => $message]);
            } else {
                wp_send_json_error(['message' => 'Esta música já pertence a outro artista.']);
            }
        } else {
            // Verifica se a música é elegível (verificada por boosts OU o artista é PRO)
            $verified_ids = function_exists('imz_get_verified_post_ids') ? imz_get_verified_post_ids() : []; //
            if (in_array($music_id, $verified_ids) || $is_pro) {
                // Obtem o título limpo (sem badges) para usar no título do pedido
                remove_filter('the_title', 'imz_add_verified_badge_to_title', 10, 2);
                $clean_music_title = get_the_title($music_id);
                add_filter('the_title', 'imz_add_verified_badge_to_title', 10, 2);

                // Cria o post de reivindicação (claim)
                wp_insert_post([
                    'post_type' => 'claim',
                    'post_title' => 'Reivindicação para: ' . $clean_music_title,
                    'post_status' => 'pending', // Status inicial
                    'post_author' => $artist_id,
                    'meta_input' => [
                        'music_id' => $music_id, // ID da música
                        'artist_id' => $artist_id, // ID do artista
                        'status' => 'pending', // Status interno (redundante mas pode ser útil)
                        'claim_document_id' => $document_id // ID do documento carregado
                    ]
                ]);
                wp_send_json_success(['message' => 'Pedido de reivindicação enviado com sucesso.']);
            } else {
                // Não elegível (não verificada E não é PRO)
                $delete_attachment_on_error($document_id);
                wp_send_json_error(['message' => 'Erro: A música precisa de ter pelo menos 5 impulsionamentos ou você precisa de um plano PRO para reivindicar.']);
            }
        }
    } else {
        // URL inválido ou não encontrado
        $delete_attachment_on_error($document_id);
        wp_send_json_error(['message' => 'Erro: URL da música inválida ou não encontrada.']);
    }
    wp_die();
}
?>