<?php
/**
 * 1MZ For Artists — Limpeza de média órfã
 *
 * [1.6.364] Quando uma conta é apagada (expiração do 1º depósito 24h) ou um
 * projeto/submissão/release é removido, as imagens associadas ficavam no
 * servidor (e na biblioteca de média) — comprovativos de depósito, imagens de
 * projeto, etc. Este helper apaga, a partir de uma URL, o ANEXO do WordPress
 * (post + ficheiro + todos os tamanhos) ou, se não for anexo, o ficheiro local.
 *
 * @package 1MZ_For_Artists
 */

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

/**
 * Apaga a média referenciada por uma URL. Devolve um rótulo textual (para log).
 */
function rmbz_delete_media_by_url( $url ) {
    $url = trim( (string) $url );
    if ( $url === '' ) return 'sem_url';

    // 1) É um ANEXO do WordPress? → apaga post + ficheiro + miniaturas.
    if ( function_exists( 'attachment_url_to_postid' ) ) {
        $att_id = attachment_url_to_postid( $url );
        if ( $att_id ) {
            if ( ! function_exists( 'wp_delete_attachment' ) ) {
                require_once ABSPATH . 'wp-admin/includes/post.php';
            }
            wp_delete_attachment( (int) $att_id, true );
            return 'anexo:' . (int) $att_id;
        }
    }

    // 2) Ficheiro local dentro de uploads (URL http/https).
    $u         = wp_upload_dir();
    $base_url  = trailingslashit( $u['baseurl'] );
    $base_path = trailingslashit( $u['basedir'] );
    $variants  = [
        $base_url,
        str_replace( 'https://', 'http://', $base_url ),
        str_replace( 'http://', 'https://', $base_url ),
    ];
    foreach ( $variants as $variant ) {
        if ( strpos( $url, $variant ) === 0 ) {
            $abs = $base_path . substr( $url, strlen( $variant ) );
            if ( file_exists( $abs ) ) {
                return @unlink( $abs ) ? 'ficheiro' : 'erro_unlink';
            }
            return 'nao_existe';
        }
    }

    // 3) Caminho absoluto.
    if ( isset( $url[0] ) && $url[0] === '/' && file_exists( $url ) ) {
        return @unlink( $url ) ? 'absoluto' : 'erro_unlink_abs';
    }

    return 'externo_ou_desconhecido';
}

/**
 * [1.6.364] Recolhe, recursivamente, todas as URLs que apontam para a pasta de
 * uploads dentro de um blob JSON (ex.: scenario_details/extra_data de um projeto
 * — imagens de KYC, referências, conceito de vídeo). Não adivinha chaves: apanha
 * qualquer string que seja uma URL de uploads.
 *
 * @param string $json_or_value JSON (string) ou já um array/valor.
 * @return array<int,string> Lista de URLs de uploads encontradas.
 */
function rmbz_collect_uploads_urls_from_json( $json_or_value ) {
    static $base = null;
    if ( $base === null ) {
        $u = wp_upload_dir();
        $base = trailingslashit( $u['baseurl'] );
    }
    $data = $json_or_value;
    if ( is_string( $data ) ) {
        $trim = trim( $data );
        if ( $trim === '' ) return [];
        $decoded = json_decode( $trim, true );
        $data = ( $decoded !== null ) ? $decoded : $trim;
    }

    $out = [];
    $walk = function ( $v ) use ( &$walk, &$out, $base ) {
        if ( is_array( $v ) ) {
            foreach ( $v as $item ) $walk( $item );
        } elseif ( is_string( $v ) && $v !== '' ) {
            // Apanha a URL mesmo dentro de texto (variantes http/https).
            $needle = preg_quote( preg_replace( '#^https?://#', '', $base ), '#' );
            if ( preg_match_all( '#https?://' . $needle . '[^\s"\'<>]+#i', $v, $m ) ) {
                foreach ( $m[0] as $url ) $out[] = $url;
            }
        }
    };
    $walk( $data );
    return array_values( array_unique( $out ) );
}

/**
 * Apaga várias URLs de uma só vez (ignora vazias/duplicadas). Devolve quantas
 * foram tratadas.
 */
function rmbz_delete_media_urls( array $urls ) {
    $done = 0;
    $seen = [];
    foreach ( $urls as $u ) {
        $u = trim( (string) $u );
        if ( $u === '' || isset( $seen[ $u ] ) ) continue;
        $seen[ $u ] = 1;
        rmbz_delete_media_by_url( $u );
        $done++;
    }
    return $done;
}
