<?php
/**
 * 1MZ For Artists — Artist DSP Profiles Endpoints
 *
 * Adiciona endpoints para a app gerir os perfis do artista nas 8 DSPs:
 *
 *   GET /profile/dsp-profiles    — catálogo + URLs guardados
 *   PUT /profile/dsp-profiles    — actualiza/limpa um ou vários perfis
 *
 * Reutiliza 100% da lógica existente em distribution-artist-profiles.php:
 *   - rmbz_artist_profiles_catalog()    — catálogo com regex de validação
 *   - rmbz_artist_profiles_validate()   — valida URL + extrai ID
 *   - rmbz_artist_profiles_get_all()    — devolve tudo indexado por slug
 *
 * Não toca nos controllers existentes — só regista 2 rotas novas.
 *
 * REGRAS:
 *   - Para cada DSP no payload, URL vazia = APAGAR esse perfil
 *   - URL inválida segundo o regex = devolve erro com mensagem útil
 *   - Permite actualização parcial (não precisa enviar os 8)
 *
 * @package 1MZ_For_Artists
 * @since 1.6.17
 */

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

if ( ! defined( 'RMBZ_API_DSP_PROFILES_VERSION' ) ) {
    define( 'RMBZ_API_DSP_PROFILES_VERSION', '1.6.17.1' );
}

add_action( 'rest_api_init', 'rmbz_api_register_dsp_profiles_routes' );

function rmbz_api_register_dsp_profiles_routes() {
    register_rest_route( RMBZ_API_NAMESPACE, '/profile/dsp-profiles', [
        [
            'methods'             => 'GET',
            'callback'            => 'rmbz_api_handle_get_dsp_profiles',
            'permission_callback' => 'rmbz_api_require_auth',
        ],
        [
            'methods'             => 'PUT',
            'callback'            => 'rmbz_api_handle_update_dsp_profiles',
            'permission_callback' => 'rmbz_api_require_auth',
            'args'                => [
                'profiles' => [
                    'required'    => true,
                    'description' => 'Mapa { dsp_slug: url }. URL vazia = apagar.',
                ],
            ],
        ],
    ] );
}

/* ============================================================================
 * HELPER — formata um item do catálogo + URL guardado
 * ============================================================================ */

/**
 * Devolve um item da resposta:
 *   {
 *     slug, name, icon, color, example, hint, essential,
 *     url:        string (vazio se não configurado),
 *     extracted_id: string|null,
 *     verified:   bool,
 *     configured: bool
 *   }
 */
function rmbz_api_format_dsp_profile_item( $slug, $catalog_entry, $stored_row ) {
    return [
        'slug'         => (string) $slug,
        'name'         => (string) $catalog_entry['name'],
        'icon'         => (string) $catalog_entry['icon'],
        'color'        => (string) $catalog_entry['color'],
        'example'      => (string) $catalog_entry['example'],
        'hint'         => (string) $catalog_entry['hint'],
        'essential'    => (bool) $catalog_entry['essential'],
        'url'          => $stored_row ? (string) $stored_row->url : '',
        'extracted_id' => $stored_row && ! empty( $stored_row->artist_id_extracted )
                          ? (string) $stored_row->artist_id_extracted
                          : null,
        'verified'     => $stored_row ? (bool) $stored_row->verified : false,
        'configured'   => $stored_row !== null,
    ];
}


/* ============================================================================
 * GET /profile/dsp-profiles
 * ============================================================================ */
function rmbz_api_handle_get_dsp_profiles( WP_REST_Request $request ) {
    $tel = (string) $request->get_param( 'rmbz_telemovel' );

    if ( ! function_exists( 'rmbz_artist_profiles_catalog' )
         || ! function_exists( 'rmbz_artist_profiles_get_all' ) ) {
        return rmbz_api_error(
            'Sistema indisponível: módulo de DSP profiles não carregado.',
            500,
            'dsp_profiles_module_missing'
        );
    }

    $catalog = rmbz_artist_profiles_catalog();
    $stored  = rmbz_artist_profiles_get_all( $tel );

    $items = [];
    foreach ( $catalog as $slug => $entry ) {
        $items[] = rmbz_api_format_dsp_profile_item(
            $slug,
            $entry,
            isset( $stored[ $slug ] ) ? $stored[ $slug ] : null
        );
    }

    // Resumo útil para a UI: "X/8 configurados"
    $configured_count = count( array_filter( $items, function( $it ) {
        return $it['configured'];
    } ) );
    $essential_total = 0;
    $essential_configured = 0;
    foreach ( $items as $it ) {
        if ( $it['essential'] ) {
            $essential_total++;
            if ( $it['configured'] ) $essential_configured++;
        }
    }

    return rmbz_api_ok( [
        '_api_version'         => RMBZ_API_DSP_PROFILES_VERSION,
        'items'                => $items,
        'total'                => count( $items ),
        'configured_count'     => $configured_count,
        'essential_total'      => $essential_total,
        'essential_configured' => $essential_configured,
    ] );
}


/* ============================================================================
 * PUT /profile/dsp-profiles
 *
 * Body esperado:
 *   { "profiles": { "spotify": "https://...", "tiktok": "" } }
 *
 * URL vazia = apaga. Apenas DSPs presentes no body são afectados — para
 * actualização parcial, basta omitir os outros.
 * ============================================================================ */
function rmbz_api_handle_update_dsp_profiles( WP_REST_Request $request ) {
    $tel      = (string) $request->get_param( 'rmbz_telemovel' );
    $profiles = $request->get_param( 'profiles' );

    if ( ! function_exists( 'rmbz_artist_profiles_catalog' )
         || ! function_exists( 'rmbz_artist_profiles_validate' ) ) {
        return rmbz_api_error(
            'Sistema indisponível: módulo de DSP profiles não carregado.',
            500,
            'dsp_profiles_module_missing'
        );
    }

    if ( ! is_array( $profiles ) || empty( $profiles ) ) {
        return rmbz_api_error(
            'Payload inválido: campo "profiles" deve ser um objecto { dsp_slug: url }.',
            422,
            'invalid_payload'
        );
    }

    $catalog = rmbz_artist_profiles_catalog();

    // ─── 1ª passagem: VALIDAR todos antes de gravar nada ──────────────
    // Se algum URL é inválido, devolvemos erro com TODOS os erros para o
    // user corrigir de uma vez, em vez de gravar parcialmente.
    $errors = [];
    $sanitized = [];
    foreach ( $profiles as $slug => $raw_url ) {
        $slug = sanitize_key( (string) $slug );
        if ( ! isset( $catalog[ $slug ] ) ) {
            $errors[ $slug ] = 'DSP desconhecido.';
            continue;
        }
        $url = trim( (string) $raw_url );
        if ( $url === '' ) {
            // URL vazia é válida — significa "apagar"
            $sanitized[ $slug ] = '';
            continue;
        }
        $r = rmbz_artist_profiles_validate( $slug, $url );
        if ( ! $r['valid'] ) {
            $errors[ $slug ] = $r['error'];
            continue;
        }
        $sanitized[ $slug ] = [
            'url'          => $url,
            'extracted_id' => isset( $r['id'] ) ? (string) $r['id'] : '',
        ];
    }

    if ( ! empty( $errors ) ) {
        return new WP_REST_Response( [
            'success' => false,
            'error'   => [
                'code'    => 'validation_failed',
                'message' => 'Há URLs inválidos. Verifica e tenta de novo.',
                'fields'  => (object) $errors,  // chave por DSP (regra 12.10)
            ],
        ], 422 );
    }

    // ─── 2ª passagem: GRAVAR / APAGAR ──────────────────────────────────
    global $wpdb;
    $t   = $wpdb->prefix . 'rmbz_artist_profiles';
    $now = current_time( 'mysql' );

    foreach ( $sanitized as $slug => $payload ) {
        if ( $payload === '' ) {
            // Apagar
            $wpdb->delete( $t, [
                'artist_telemovel' => $tel,
                'dsp_slug'         => $slug,
            ], [ '%s', '%s' ] );
            continue;
        }

        $existing = $wpdb->get_var( $wpdb->prepare(
            "SELECT id FROM $t WHERE artist_telemovel = %s AND dsp_slug = %s",
            $tel, $slug
        ) );

        if ( $existing ) {
            $wpdb->update( $t,
                [
                    'url'                 => $payload['url'],
                    'artist_id_extracted' => $payload['extracted_id'],
                    'updated_at'          => $now,
                ],
                [ 'id' => (int) $existing ],
                [ '%s', '%s', '%s' ], [ '%d' ]
            );
        } else {
            $wpdb->insert( $t, [
                'artist_telemovel'    => $tel,
                'dsp_slug'            => $slug,
                'url'                 => $payload['url'],
                'artist_id_extracted' => $payload['extracted_id'],
                'created_at'          => $now,
                'updated_at'          => $now,
            ], [ '%s', '%s', '%s', '%s', '%s', '%s' ] );
        }
    }

    // Devolver estado actualizado (reaproveita o handler GET)
    return rmbz_api_handle_get_dsp_profiles( $request );
}
