<?php
/**
 * [1.6.117] PEDIDOS DE REMOÇÃO DE CONTENT ID — HELPERS
 *
 * Funções utilitárias partilhadas entre front-end (handler do pedido)
 * e admin (lista de pedidos).
 *
 * @package 1MZ_For_Artists
 * @since 1.6.117
 */

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


/**
 * Extrai o video_id de uma URL YouTube (vários formatos suportados).
 *
 * Aceita:
 *   - https://www.youtube.com/watch?v=XXXXXXXXXXX
 *   - https://youtu.be/XXXXXXXXXXX
 *   - https://www.youtube.com/shorts/XXXXXXXXXXX
 *   - https://m.youtube.com/watch?v=XXXXXXXXXXX
 *   - https://www.youtube.com/embed/XXXXXXXXXXX
 *
 * Devolve '' se não conseguir extrair (URL inválido).
 */
function rmbz_contentid_extract_video_id( $url ) {
    $url = trim( (string) $url );
    if ( $url === '' ) return '';

    // Padrão YouTube IDs: 11 caracteres alfanuméricos + - _
    $patterns = [
        '#youtube\.com/watch\?(?:.*&)?v=([a-zA-Z0-9_-]{11})#i',
        '#youtu\.be/([a-zA-Z0-9_-]{11})#i',
        '#youtube\.com/shorts/([a-zA-Z0-9_-]{11})#i',
        '#youtube\.com/embed/([a-zA-Z0-9_-]{11})#i',
        '#youtube\.com/v/([a-zA-Z0-9_-]{11})#i',
    ];

    foreach ( $patterns as $pattern ) {
        if ( preg_match( $pattern, $url, $m ) ) {
            return $m[1];
        }
    }
    return '';
}


/**
 * Valida que a URL é de YouTube e contém video_id reconhecível.
 *
 * @return true|WP_Error
 */
function rmbz_contentid_validate_url( $url ) {
    $url = trim( (string) $url );
    if ( $url === '' ) {
        return new WP_Error( 'empty_url', 'URL é obrigatório.' );
    }
    if ( ! filter_var( $url, FILTER_VALIDATE_URL ) ) {
        return new WP_Error( 'bad_url', 'URL inválido.' );
    }
    if ( ! preg_match( '#youtube\.com|youtu\.be#i', $url ) ) {
        return new WP_Error( 'not_youtube', 'A URL tem que ser de YouTube.' );
    }
    if ( rmbz_contentid_extract_video_id( $url ) === '' ) {
        return new WP_Error( 'no_video_id', 'Não consegui identificar o ID do vídeo. Verifica a URL.' );
    }
    return true;
}


/**
 * Vai buscar todas as faixas de um release (ordem original).
 *
 * @return array Lista de objects {id, track_number, title}
 */
function rmbz_contentid_get_release_tracks( $release_id ) {
    global $wpdb;
    $t = $wpdb->prefix . 'rmbz_distro_tracks';
    if ( $wpdb->get_var( "SHOW TABLES LIKE '$t'" ) !== $t ) {
        return [];
    }
    $rows = $wpdb->get_results( $wpdb->prepare(
        "SELECT id, track_number, title
           FROM $t
          WHERE release_id = %d
          ORDER BY track_number ASC, id ASC",
        (int) $release_id
    ) );
    return $rows ?: [];
}


/**
 * Verifica se já existe pedido pendente para a mesma combinação
 * (artista + vídeo). Não bloqueia — só avisa o front-end.
 *
 * @return int|null ID do pedido pendente, ou null se não há.
 */
function rmbz_contentid_get_pending_for_video( $artist_telemovel, $video_id ) {
    global $wpdb;
    $t = $wpdb->prefix . 'rmbz_contentid_requests';
    if ( $wpdb->get_var( "SHOW TABLES LIKE '$t'" ) !== $t ) {
        return null;
    }
    if ( empty( $video_id ) ) return null;

    $id = $wpdb->get_var( $wpdb->prepare(
        "SELECT id FROM $t
          WHERE artist_telemovel = %s
            AND video_id = %s
            AND status = 'pendente'
          ORDER BY id DESC
          LIMIT 1",
        $artist_telemovel, $video_id
    ) );
    return $id ? (int) $id : null;
}


/**
 * Verifica se um release pertence realmente ao artista (segurança
 * crítica — sem isto qualquer um podia pedir takedown de releases
 * alheios).
 *
 * @return bool
 */
function rmbz_contentid_release_belongs_to_artist( $release_id, $artist_telemovel ) {
    global $wpdb;
    $t = $wpdb->prefix . 'rmbz_distro_releases';
    $owner = $wpdb->get_var( $wpdb->prepare(
        "SELECT artist_telemovel FROM $t WHERE id = %d",
        (int) $release_id
    ) );
    return $owner === $artist_telemovel;
}


/**
 * Verifica se um release está LIVE (pré-requisito — só releases LIVE
 * estão realmente em Content ID).
 *
 * @return bool
 */
function rmbz_contentid_release_is_live( $release_id ) {
    global $wpdb;
    $t = $wpdb->prefix . 'rmbz_distro_releases';
    $status = $wpdb->get_var( $wpdb->prepare(
        "SELECT status FROM $t WHERE id = %d",
        (int) $release_id
    ) );
    return in_array( $status, [ 'live', 'distribuido' ], true );
}


/**
 * [1.6.117.1 → 1.6.117.3] Verifica se o release foi APROVADO no programa
 * YouTube Content ID. Critério único: yt_content_id_status = 'approved'.
 *
 * Antes exigia também release LIVE, mas:
 *   - Releases podem estar em "delivered", "approved" etc. e mesmo assim
 *     ter Content ID aprovado e claims activos
 *   - Se yt_content_id_status = 'approved' a música está mesmo no programa
 *     e há claims para gerir, ponto final
 *
 * Não há claims a remover se:
 *   - yt_content_id_status = 'not_requested' (não pediu)
 *   - 'requested' (à espera de decisão)
 *   - 'rejected' / 'conflict' (não foi aceite)
 *
 * @return bool
 */
function rmbz_contentid_release_is_in_content_id( $release_id ) {
    global $wpdb;
    // [1.6.117.6] Tabela correcta é `rmbz_distro_release_platforms`
    // (com `release_` no meio), não `rmbz_distro_platforms`.
    $t = $wpdb->prefix . 'rmbz_distro_release_platforms';
    if ( $wpdb->get_var( "SHOW TABLES LIKE '$t'" ) !== $t ) return false;

    $status = $wpdb->get_var( $wpdb->prepare(
        "SELECT yt_content_id_status FROM $t WHERE release_id = %d",
        (int) $release_id
    ) );
    return $status === 'approved';
}


/**
 * Notifica admin de novo pedido (email).
 */
function rmbz_contentid_notify_admin_new( $request_id ) {
    global $wpdb;
    $t = $wpdb->prefix . 'rmbz_contentid_requests';
    $req = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $t WHERE id = %d", $request_id ) );
    if ( ! $req ) return;

    $tr = $wpdb->prefix . 'rmbz_distro_releases';
    $rel = $wpdb->get_row( $wpdb->prepare( "SELECT title FROM $tr WHERE id = %d", $req->release_id ) );
    $rel_title = $rel ? $rel->title : 'Release #' . $req->release_id;

    $admin_email = 'jaimemetano@gmail.com';
    $subject = sprintf( '[1MZ] Novo pedido de remoção Content ID — %s', $rel_title );
    $admin_url = function_exists( 'rmbz_contentid_admin_url' )
        ? rmbz_contentid_admin_url( [ 'view' => 'detail', 'id' => $req->id ] )
        : admin_url( 'admin.php?page=rmbz-admin-distribution&tab=contentid&view=detail&id=' . $req->id );

    $body  = "Novo pedido de remoção de Content ID:\n\n";
    $body .= "Release: $rel_title (ID: {$req->release_id})\n";
    $body .= "Artista: {$req->artist_telemovel}\n";
    $body .= "Vídeo: {$req->video_url}\n";
    if ( ! empty( $req->reason ) ) {
        $body .= "\nMotivo: {$req->reason}\n";
    }
    $body .= "\nGerir: $admin_url\n";

    wp_mail( $admin_email, $subject, $body );
}


/**
 * Notifica artista quando pedido é processado.
 * Envia email + cria notificação na app (via tabela existente).
 */
function rmbz_contentid_notify_artist_processed( $request_id ) {
    global $wpdb;
    $t = $wpdb->prefix . 'rmbz_contentid_requests';
    $req = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $t WHERE id = %d", $request_id ) );
    if ( ! $req ) return;

    $tr = $wpdb->prefix . 'rmbz_distro_releases';
    $rel = $wpdb->get_row( $wpdb->prepare( "SELECT title FROM $tr WHERE id = %d", $req->release_id ) );
    $rel_title = $rel ? $rel->title : 'Release #' . $req->release_id;

    // 1. Email
    $user_email = '';
    if ( function_exists( 'rmbz_get_user_email_by_telemovel' ) ) {
        $user_email = rmbz_get_user_email_by_telemovel( $req->artist_telemovel );
    }
    if ( ! $user_email ) {
        $user = get_user_by( 'login', $req->artist_telemovel );
        if ( $user ) $user_email = $user->user_email;
    }

    if ( $user_email ) {
        $status_pt = $req->status === 'aprovado' ? '✓ Aprovado' : '✗ Rejeitado';
        $subject = sprintf( '[1MZ] Pedido Content ID %s — %s', $status_pt, $rel_title );
        $body  = "Olá!\n\n";
        $body .= "O teu pedido de remoção de Content ID foi processado.\n\n";
        $body .= "Release: $rel_title\n";
        $body .= "Vídeo: {$req->video_url}\n";
        $body .= "Estado: $status_pt\n";
        if ( ! empty( $req->admin_response ) ) {
            $body .= "\nResposta: {$req->admin_response}\n";
        }
        $body .= "\n— Equipa 1MZ Records";
        wp_mail( $user_email, $subject, $body );
    }

    // 2. Notificação na app (se existe a função de notificações)
    if ( function_exists( 'rmbz_api_push_notification' ) ) {
        $status_emoji = $req->status === 'aprovado' ? '✓' : '✗';
        $title = sprintf( '%s Pedido Content ID processado', $status_emoji );
        $msg   = sprintf( '"%s" — %s', $rel_title, $req->status );
        rmbz_api_push_notification( $req->artist_telemovel, $title, $msg, [
            'type'       => 'contentid_processed',
            'request_id' => (int) $req->id,
            'release_id' => (int) $req->release_id,
            'status'     => $req->status,
        ] );
    }
}
