<?php
/**
 * 1MZ For Artists — Releases DSP Links Endpoint
 *
 * Adiciona endpoint para a app obter os links das DSPs (Spotify, Apple
 * Music, etc.) onde um release está disponível:
 *
 *   GET /releases/{id}/dsp-links
 *
 * Reutiliza 100% da lógica existente em distribution-release-workflow.php:
 *   - rmbz_release_get_links_for_tracker($release) — devolve links exactos
 *     ou pesquisas auto-geradas
 *   - rmbz_release_links_dsp_catalog() — catálogo com label, color, slug
 *
 * Não toca no releases-controller.php existente — só regista uma rota nova.
 *
 * @package 1MZ_For_Artists
 * @since 1.6.16
 */

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

if ( ! defined( 'RMBZ_API_DSP_LINKS_VERSION' ) ) {
    define( 'RMBZ_API_DSP_LINKS_VERSION', '1.6.16.1' );
}

add_action( 'rest_api_init', 'rmbz_api_register_dsp_links_routes' );

function rmbz_api_register_dsp_links_routes() {
    register_rest_route( RMBZ_API_NAMESPACE, '/releases/(?P<id>\d+)/dsp-links', [
        'methods'             => 'GET',
        'callback'            => 'rmbz_api_handle_get_dsp_links',
        'permission_callback' => 'rmbz_api_require_auth',
        'args' => [
            'id' => [ 'type' => 'integer', 'required' => true ],
        ],
    ] );
}

/**
 * GET /releases/{id}/dsp-links
 *
 * Devolve a lista de DSPs (Spotify, Apple Music, etc.) com os links onde
 * o release pode ser ouvido.
 *
 * Cada item devolvido tem:
 *   - slug:      identificador interno (spotify, apple_music, ...)
 *   - label:     nome para mostrar (Spotify, Apple Music, ...)
 *   - color:     hex da cor de marca (#1DB954, ...)
 *   - initial:   1-2 letras para badge fallback (S, A, ...)
 *   - url:       URL final — exacto OU pesquisa
 *   - is_exact:  true se admin colou URL; false se é pesquisa auto-gerada
 *
 * Restrições:
 *   - Release tem de pertencer ao utilizador autenticado (404 senão)
 *   - Status tem de ser live, distribuido ou delivered (409 senão)
 */
function rmbz_api_handle_get_dsp_links( WP_REST_Request $request ) {
    $telemovel = (string) $request->get_param( 'rmbz_telemovel' );
    $id        = (int) $request->get_param( 'id' );

    if ( $id <= 0 ) {
        return rmbz_api_error( 'ID de release inválido.', 400, 'invalid_id' );
    }

    global $wpdb;
    $release = $wpdb->get_row( $wpdb->prepare(
        "SELECT id, title, status, artist_telemovel
         FROM {$wpdb->prefix}rmbz_distro_releases
         WHERE id = %d AND artist_telemovel = %s",
        $id, $telemovel
    ) );

    if ( ! $release ) {
        return rmbz_api_error( 'Release não encontrado.', 404, 'not_found' );
    }

    // Só faz sentido pedir links se o release está nas lojas (ou a caminho).
    // Para outros estados, devolvemos 409 com instrução para o app esconder
    // a secção em vez de mostrar erro.
    $allowed_statuses = [ 'live', 'distribuido', 'delivered' ];
    if ( ! in_array( $release->status, $allowed_statuses, true ) ) {
        return rmbz_api_error(
            'Os links das plataformas só ficam disponíveis quando o release '
            . 'estiver entregue às lojas (status actual: ' . $release->status . ').',
            409,
            'release_not_live'
        );
    }

    if ( ! function_exists( 'rmbz_release_get_links_for_tracker' )
         || ! function_exists( 'rmbz_release_links_dsp_catalog' ) ) {
        return rmbz_api_error(
            'Sistema indisponível: módulo de links DSP não carregado.',
            500,
            'dsp_module_missing'
        );
    }

    $catalog = rmbz_release_links_dsp_catalog();
    $links   = rmbz_release_get_links_for_tracker( $release );

    $items = [];
    foreach ( $catalog as $slug => $dsp ) {
        $link = isset( $links[ $slug ] ) ? $links[ $slug ] : null;
        $items[] = [
            'slug'     => (string) $slug,
            'label'    => (string) $dsp['label'],
            'color'    => (string) $dsp['color'],
            'initial'  => (string) $dsp['initial'],
            'url'      => $link ? (string) $link['url'] : '',
            'is_exact' => $link ? (bool) $link['is_exact'] : false,
        ];
    }

    return rmbz_api_ok( [
        '_api_version' => RMBZ_API_DSP_LINKS_VERSION,
        'release_id'   => (int) $release->id,
        'release_title'=> (string) $release->title,
        'items'        => $items,
    ] );
}
