<?php

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

// =============================================================================
// FUNÇÕES QUE SALVAM OS DADOS (SAVE FUNCTIONS)
// =============================================================================

add_action('save_post_impulsionamento', 'imz_save_impulsionamento_meta');
add_action('save_post_post', 'imz_save_post_meta');
add_action('save_post_claim', 'imz_handle_claim_moderation');
add_action('save_post_imz_report', 'imz_save_report_meta');
add_action('save_post_imz_takedown', 'imz_save_takedown_meta');
add_action('save_post_imz_subscription', 'imz_save_subscription_meta');
add_action('save_post_imz_purchase', 'imz_handle_purchase_code_reset'); 
// NOTA: O CPT imz_purchase não tem uma função de save aqui porque o seu status é gerido pelo sistema/artista.

function imz_save_impulsionamento_meta($post_id) {
    // Verifica nonces para os meta boxes 'imz_info' e 'imz_extras'
    if ((!isset($_POST['imz_impulsionamento_nonce']) || !wp_verify_nonce($_POST['imz_impulsionamento_nonce'], 'imz_save_impulsionamento_meta')) && 
        (!isset($_POST['imz_impulsionamento_nonce_extra']) || !wp_verify_nonce($_POST['imz_impulsionamento_nonce_extra'], 'imz_save_impulsionamento_meta'))) {
        return;
    }
    if ((defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) || !current_user_can('edit_post', $post_id)) return;

    $old_status = get_post_meta($post_id, 'status', true);
    // Valida o status contra uma lista permitida (allowlist) em vez de sanitizar cegamente
    $allowed_statuses = ['pendente', 'aprovado', 'recusado'];
    $raw_status  = isset($_POST['imz_status']) ? sanitize_key($_POST['imz_status']) : '';
    $new_status  = in_array($raw_status, $allowed_statuses, true) ? $raw_status : $old_status;

    if ($new_status !== $old_status) {
        // Limpa o cache de posts verificados para garantir atualização
        delete_transient('imz_verified_post_ids_list');

        update_post_meta($post_id, 'status', $new_status);
        $music_id = get_post_meta($post_id, 'post_id_original', true); // ID da música associada

        // --- LÓGICA DE VERIFICAÇÃO AUTOMÁTICA POR BOOSTS ---
        if ($music_id && $new_status === 'aprovado') {
            // --- DEFINIR DATAS DE INÍCIO/FIM DO BOOST ---
            $duracao_dias = (int) get_post_meta($post_id, '_boost_duracao_dias', true);
            if ($duracao_dias < 1) $duracao_dias = 1;
            $data_inicio = current_time('Y-m-d H:i:s');
            $data_fim = date('Y-m-d H:i:s', strtotime("+{$duracao_dias} days"));
            update_post_meta($post_id, '_boost_data_inicio', $data_inicio);
            update_post_meta($post_id, '_boost_data_fim', $data_fim);

            $current_boosts = new WP_Query([
                'post_type' => 'impulsionamento',
                'post_status' => 'publish',
                'meta_query' => [
                    ['key' => 'post_id_original', 'value' => $music_id],
                    ['key' => 'status', 'value' => 'aprovado']
                ],
                'fields' => 'ids',
            ]);
            // Se atingir 5 ou mais boosts aprovados, marca a música como verificada
            if ($current_boosts->found_posts >= 5) {
                update_post_meta($music_id, '_is_verified_by_boosts', 'yes'); // Usado por imz_get_verified_post_ids
            }
        }
        // --- FIM DA LÓGICA DE VERIFICAÇÃO ---

        // Atualiza os ganhos totais da música e a parte do artista
        $amount = (int) get_post_meta($post_id, 'valor', true); // Valor do impulsionamento
        $amount_change = ($new_status === 'aprovado') ? $amount : (($old_status === 'aprovado') ? -$amount : 0); // Calcula a diferença
        if ($amount_change !== 0 && $music_id) {
            // Atualiza o total acumulado pela música
            update_post_meta($music_id, '_imz_total_earnings', (int) get_post_meta($music_id, '_imz_total_earnings', true) + $amount_change);
            // Se a música estiver reivindicada, atualiza a parte do artista
            if (get_post_meta($music_id, '_is_claimed', true) === 'yes') {
                $artist_id = get_post_field('post_author', $music_id);
                // Usa a função centralizada para calcular a partilha (20% ou 70%)
                $artist_share = imz_calculate_artist_share($artist_id, $amount_change);
                update_post_meta($music_id, '_artist_earnings', (float) get_post_meta($music_id, '_artist_earnings', true) + $artist_share); // Ganhos do artista nesta música
            }
        }
    }
    // Salva os campos do meta box 'imz_extras'
    if (isset($_POST['valor_total_simulado'])) update_post_meta($post_id, 'valor_total_simulado', absint($_POST['valor_total_simulado'])); // Numérico: força inteiro positivo
    if (isset($_POST['cor_forcada'])) update_post_meta($post_id, 'cor_forcada', sanitize_text_field($_POST['cor_forcada']));
}

function imz_save_post_meta($post_id) {
    // Esta função é um "controlador" que chama todas as funções de salvamento individuais para o tipo 'post'
    
    // Verifica permissões básicas antes de tudo
    if ((defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) || !current_user_can('edit_post', $post_id)) return;

    imz_save_download_details_meta($post_id);
    imz_save_digital_stores_meta($post_id);
    imz_save_disable_boost_meta($post_id);
    imz_handle_demonetize_action($post_id, get_post($post_id));
    imz_save_youtube_link_meta($post_id);

    // --- NOVO: Salvar Proteção 1MZ For Artists ---
    // Apenas tenta salvar se o nonce da caixa de monetização estiver presente
    if (isset($_POST['imz_demonetize_nonce']) && wp_verify_nonce($_POST['imz_demonetize_nonce'], 'imz_demonetize_action')) {
        if (isset($_POST['imz_protected_for_artists'])) {
            update_post_meta($post_id, '_imz_protected_for_artists', 'yes');
        } else {
            // Se o checkbox não vier marcado (e o nonce veio), significa que o utilizador desmarcou
            update_post_meta($post_id, '_imz_protected_for_artists', '');
        }
    }
    // ---------------------------------------------
}

function imz_save_download_details_meta($post_id) {
    // Salva dados do meta box 'imz_download_details_box'
    if (!isset($_POST['imz_download_details_nonce']) || !wp_verify_nonce($_POST['imz_download_details_nonce'], 'imz_save_download_details')) return;
    
    update_post_meta($post_id, '_imz_enable_download', isset($_POST['_imz_enable_download']) ? 'yes' : '');

    // Salva os novos campos de download pago
    $current_paid_status = get_post_meta($post_id, '_imz_enable_paid_download', true); // Guarda o status atual
    $new_paid_status = isset($_POST['_imz_enable_paid_download']) ? 'yes' : '';
    // Só atualiza se o status atual não for 'expired_pro' OU se o novo status for vazio (desmarcado)
    if ($current_paid_status !== 'expired_pro' || $new_paid_status === '') {
        update_post_meta($post_id, '_imz_enable_paid_download', $new_paid_status); // Pode ter o valor 'expired_pro' também
    }

    if (isset($_POST['_imz_paid_download_price'])) {
        update_post_meta($post_id, '_imz_paid_download_price', absint($_POST['_imz_paid_download_price'])); // Força inteiro positivo
    }

    // Salva os outros campos do download gratuito
    if (isset($_POST['_imz_release_date'])) update_post_meta($post_id, '_imz_release_date', sanitize_text_field($_POST['_imz_release_date']));

    // Pre-Save fields
    $presave_enabled = isset($_POST['_imz_presave_enabled']) ? 'yes' : '';
    update_post_meta($post_id, '_imz_presave_enabled', $presave_enabled);
    if (isset($_POST['_imz_presave_date'])) update_post_meta($post_id, '_imz_presave_date', sanitize_text_field($_POST['_imz_presave_date']));

    if (isset($_POST['_imz_quality'])) update_post_meta($post_id, '_imz_quality', sanitize_text_field($_POST['_imz_quality']));
    if (isset($_POST['_imz_file_source_type'])) update_post_meta($post_id, '_imz_file_source_type', sanitize_text_field($_POST['_imz_file_source_type']));
    if (isset($_POST['_imz_download_file_id'])) update_post_meta($post_id, '_imz_download_file_id', absint($_POST['_imz_download_file_id']));
    if (isset($_POST['_imz_download_file_url'])) update_post_meta($post_id, '_imz_download_file_url', esc_url_raw($_POST['_imz_download_file_url']));
}

function imz_save_digital_stores_meta($post_id) {
    // Salva dados do meta box 'imz_digital_stores_box'
    if (!isset($_POST['imz_digital_stores_nonce']) || !wp_verify_nonce($_POST['imz_digital_stores_nonce'], 'imz_save_digital_stores')) return;
    
    if (isset($_POST['_imz_digital_stores']) && is_array($_POST['_imz_digital_stores'])) {
        $sanitized_stores = [];
        foreach ($_POST['_imz_digital_stores'] as $store) {
            if (empty($store['store_key']) || empty($store['url'])) continue;
            $sanitized_stores[] = [ 'store_key' => sanitize_key($store['store_key']), 'url' => esc_url_raw($store['url']), 'price' => sanitize_text_field($store['price']) ];
        }
        update_post_meta($post_id, '_imz_digital_stores', $sanitized_stores);
    } else {
        delete_post_meta($post_id, '_imz_digital_stores');
    }
}

function imz_save_disable_boost_meta($post_id) {
    // Salva dados do meta box 'imz_disable_boost_box'
    if (!isset($_POST['imz_disable_boost_nonce']) || !wp_verify_nonce($_POST['imz_disable_boost_nonce'], 'imz_save_disable_boost')) return;
    update_post_meta($post_id, '_imz_nao_e_musica', isset($_POST['imz_nao_e_musica']) ? '1' : '');
}

function imz_handle_demonetize_action($post_id, $post) {
    // Processa a ação do meta box 'imz_monetization_management'
    if (!isset($_POST['imz_demonetize_nonce']) || !wp_verify_nonce($_POST['imz_demonetize_nonce'], 'imz_demonetize_action')) return;
    
    if (isset($_POST['imz_demonetize_action']) && $_POST['imz_demonetize_action'] === '1') {
        // Remove esta própria função do hook para evitar loop infinito
        remove_action('save_post_post', 'imz_save_post_meta');
        // Reverte o autor para o admin (ID 1)
        wp_update_post(['ID' => $post_id, 'post_author' => 1]);
        // Remove os metadados de reivindicação e ganhos
        delete_post_meta($post_id, '_is_claimed');
        delete_post_meta($post_id, '_artist_earnings');
        delete_post_meta($post_id, '_proof_of_ownership_id');
        // Readiciona a função ao hook
        add_action('save_post_post', 'imz_save_post_meta');
    }
}

function imz_save_youtube_link_meta($post_id) {
    // Salva dados do meta box 'imz_youtube_link_box'
    if (!isset($_POST['imz_youtube_link_nonce']) || !wp_verify_nonce($_POST['imz_youtube_link_nonce'], 'imz_save_youtube_link')) return;
    
    // Salva a URL do YouTube
    if (isset($_POST['imz_youtube_url'])) {
        update_post_meta($post_id, '_imz_youtube_url', esc_url_raw($_POST['imz_youtube_url']));
    }
    
    // --- NOVO: Salva Título e Artista Personalizados ---
    if (isset($_POST['imz_custom_audio_title'])) {
        update_post_meta($post_id, '_imz_custom_audio_title', sanitize_text_field($_POST['imz_custom_audio_title']));
    }
    if (isset($_POST['imz_custom_audio_artist'])) {
        update_post_meta($post_id, '_imz_custom_audio_artist', sanitize_text_field($_POST['imz_custom_audio_artist']));
    }
    // ---------------------------------------------------

    update_post_meta($post_id, '_imz_enable_audio_player', isset($_POST['imz_enable_audio_player']) ? 'yes' : '');
    update_post_meta($post_id, '_imz_audio_player_url', isset($_POST['imz_audio_player_url']) ? esc_url_raw($_POST['imz_audio_player_url']) : '');
}

function imz_handle_claim_moderation($post_id) {
    // Processa ações do meta box 'imz_claim_actions'
    if (!isset($_POST['imz_claim_moderation_nonce']) || !wp_verify_nonce($_POST['imz_claim_moderation_nonce'], 'imz_claim_moderation_action') || !current_user_can('edit_post', $post_id)) return;
    if (!isset($_POST['imz_claim_action']) || empty($_POST['imz_claim_action'])) return;

    // Remove esta função do hook para evitar loop ao atualizar o post
    remove_action('save_post_claim', 'imz_handle_claim_moderation');
    $action = sanitize_text_field($_POST['imz_claim_action']);
    $artist_id = get_post_meta($post_id, 'artist_id', true);

    if ($action === 'approve') {
        $music_id = get_post_meta($post_id, 'music_id', true);
        $document_id = get_post_meta($post_id, 'claim_document_id', true);
        if ($music_id && $artist_id) {
            // Muda o autor da música para o artista que reivindicou
            wp_update_post(['ID' => $music_id, 'post_author' => $artist_id]);
            // Marca a música como reivindicada
            update_post_meta($music_id, '_is_claimed', 'yes');
            // Associa o documento de prova
            update_post_meta($music_id, '_proof_of_ownership_id', $document_id);

            // Verifica se o artista é PRO
            $is_pro = function_exists('imz_is_artist_pro') && imz_is_artist_pro($artist_id);
            // Verifica se a música já atingiu a verificação por boosts
            $is_verified = in_array($music_id, imz_get_verified_post_ids());

            // Se for PRO e a música ainda não for verificada, simula 5 boosts para verificar automaticamente
            if ($is_pro && !$is_verified) {
                $music_title = get_the_title($music_id);
                for ($i = 0; $i < 5; $i++) {
                    wp_insert_post([
                        'post_type' => 'impulsionamento', 'post_title' => 'Verificação PRO - ' . $music_title,
                        'post_status' => 'publish', 'meta_input' => [
                            'post_id_original' => $music_id, 'valor' => 1, 'nome' => 'Verificação PRO',
                            'metodo_pagamento' => 'Automático', 'status' => 'aprovado'
                        ]
                    ]);
                }
                 // Limpa cache após simular boosts
                 delete_transient('imz_verified_post_ids_list');
            }
        }
        // Muda o status da reivindicação para 'Aprovado'
        wp_update_post(['ID' => $post_id, 'post_status' => 'claim_approved']);
    } elseif ($action === 'reject_fraud' && $artist_id) {
        // Adiciona um strike (aviso) ao artista
        $strikes = get_user_meta($artist_id, '_fraudulent_claim_strikes', true);
        if (!is_array($strikes)) { $strikes = []; }
        $strikes[] = time(); // Guarda o timestamp do strike
        update_user_meta($artist_id, '_fraudulent_claim_strikes', $strikes);
        // Muda o status da reivindicação para 'Rejeitado'
        wp_update_post(['ID' => $post_id, 'post_status' => 'claim_rejected']);
    }
    // Readiciona a função ao hook
    add_action('save_post_claim', 'imz_handle_claim_moderation');
}

function imz_save_report_meta($post_id) {
    // Salva dados do meta box 'imz_report_status'
    if (!isset($_POST['imz_report_nonce']) || !wp_verify_nonce($_POST['imz_report_nonce'], 'imz_save_report_meta') || !current_user_can('edit_post', $post_id)) return;
    if (isset($_POST['imz_report_status'])) update_post_meta($post_id, '_report_status', sanitize_text_field($_POST['imz_report_status']));
}

function imz_save_takedown_meta($post_id) {
    // Salva dados dos meta boxes 'imz_takedown_log' e 'imz_takedown_status'
     if (!isset($_POST['imz_takedown_nonce']) || !wp_verify_nonce($_POST['imz_takedown_nonce'], 'imz_save_takedown_meta')) {
         if (!isset($_POST['imz_takedown_nonce_log']) || !wp_verify_nonce($_POST['imz_takedown_nonce_log'], 'imz_save_takedown_meta')) {
            return;
        }
    }
    if ((defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) || !current_user_can('edit_post', $post_id)) return;

    // Salva o status do pedido
    if (isset($_POST['imz_takedown_status'])) {
        update_post_meta($post_id, '_takedown_status', sanitize_text_field($_POST['imz_takedown_status']));
    }
    // Salva a nova nota no histórico
    if (isset($_POST['imz_new_takedown_note']) && !empty(trim($_POST['imz_new_takedown_note']))) {
        $new_note = sanitize_textarea_field($_POST['imz_new_takedown_note']);
        $log_entries = get_post_meta($post_id, '_takedown_log', true);
        if (!is_array($log_entries)) { $log_entries = []; }
        $log_entries[] = [ 'timestamp' => current_time('timestamp'), 'note' => $new_note ];
        update_post_meta($post_id, '_takedown_log', $log_entries);
    }
}

function imz_save_subscription_meta($post_id) {
    // Salva dados do meta box 'imz_subscription_status'
    if (!isset($_POST['imz_subscription_nonce']) || !wp_verify_nonce($_POST['imz_subscription_nonce'], 'imz_save_subscription_meta') || (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) || !current_user_can('edit_post', $post_id)) return;

    $old_status = get_post_meta($post_id, 'status', true);
    $new_status = isset($_POST['imz_subscription_status']) ? sanitize_text_field($_POST['imz_subscription_status']) : '';

    if ($new_status && $new_status !== $old_status) {
        update_post_meta($post_id, 'status', $new_status);
        $artist_id = get_post_meta($post_id, 'artist_id', true);
        if ($artist_id > 0) {
            if ($new_status === 'aprovado') {
                // Define a data de expiração para daqui a 1 mês
                $expiration_timestamp = strtotime('+1 month');
                update_user_meta($artist_id, '_imz_pro_expiration_date', $expiration_timestamp); // Usado por imz_is_artist_pro

                // --- REATIVAR MÚSICAS PAGAS ANTERIORES ---
                $args_posts = [
                    'post_type' => 'post',
                    'author' => $artist_id,
                    'posts_per_page' => -1,
                    'meta_key' => '_imz_enable_paid_download', // Encontra músicas marcadas como 'expired_pro'
                    'meta_value' => 'expired_pro',
                    'fields' => 'ids'
                ];

                $reactivate_posts = new WP_Query($args_posts);

                if ($reactivate_posts->have_posts()) {
                    foreach ($reactivate_posts->posts as $post_id_to_reactivate) {
                        // Reativa o download pago
                        update_post_meta($post_id_to_reactivate, '_imz_enable_paid_download', 'yes');
                        // Desativa o download gratuito
                        update_post_meta($post_id_to_reactivate, '_imz_enable_download', '');
                    }
                }
                // --- FIM DA LÓGICA DE REATIVAÇÃO ---

            } else {
                // Se for rejeitado ou outro status, remove a data de expiração (caso exista)
                delete_user_meta($artist_id, '_imz_pro_expiration_date');
            }
        }
    }
}

/**
 * ** NOVO: Lida com o reset do código de compra no admin. **
 */
function imz_handle_purchase_code_reset($post_id) {
    // Verifica se a ação de reset foi acionada
    if (!isset($_POST['imz_reset_purchase_code']) || $_POST['imz_reset_purchase_code'] !== '1') {
        return;
    }

    // Verifica o nonce
    if (!isset($_POST['imz_reset_purchase_nonce']) || !wp_verify_nonce($_POST['imz_reset_purchase_nonce'], 'imz_reset_purchase_code_action_' . $post_id)) {
        return;
    }

    // Verifica permissões
    if (!current_user_can('edit_post', $post_id)) {
        return;
    }

    // Garante que só executa uma vez por request (evita loops)
    if (defined('IMZ_PURCHASE_RESET_RUNNING') && IMZ_PURCHASE_RESET_RUNNING === $post_id) {
        return;
    }
    define('IMZ_PURCHASE_RESET_RUNNING', $post_id);


    $current_status = get_post_meta($post_id, '_status', true);

    // Só reinicia se o status atual for 'usado'
    if ($current_status === 'usado') {
        update_post_meta($post_id, '_status', 'concluido'); // Volta para concluído

        // Adiciona uma mensagem admin (opcional)
        add_action('admin_notices', function() use ($post_id) {
             $post_title = get_the_title($post_id);
             echo '<div class="notice notice-success is-dismissible"><p>Código de compra para "' . esc_html($post_title) . '" foi reiniciado com sucesso.</p></div>';
        });

        // Limpar cache de contagens pendentes pode ser útil se afetar algo
        delete_transient('imz_pending_counts');
    }
}
?>