<template>
    <!-- Composant invisible qui écoute les événements Mercure -->
</template>

<script setup>
    import { ref, onMounted, onBeforeUnmount, watch, inject } from 'vue';
    import { useMangaStore } from '../../application/store/mangaStore';
    import { useQueryClient } from '@tanstack/vue-query';

    const props = defineProps({
        mangaId: {
            type: String,
            required: true
        }
    });

    const store = useMangaStore();
    const eventSource = ref(null);
    // On récupère le client de requête pour invalider le cache
    const queryClient = useQueryClient();

    const setupMercureEventSource = () => {
        if (eventSource.value) {
            eventSource.value.close();
        }

        // Créer les topics à écouter
        const topics = [`manga/${props.mangaId}/chapters`, 'scraping/status'];

        // Construire l'URL du hub Mercure avec les topics
        const mercureHubUrl = new URL('/.well-known/mercure', window.location.origin);
        topics.forEach(topic => {
            mercureHubUrl.searchParams.append('topic', topic);
        });

        console.log(`MercureListener: Abonnement aux topics pour manga ${props.mangaId}`);
        console.log(`MercureListener: URL Mercure - ${mercureHubUrl.toString()}`);

        // Créer la source d'événements
        eventSource.value = new EventSource(mercureHubUrl, { withCredentials: true });

        // Définir les gestionnaires d'événements
        eventSource.value.onmessage = event => {
            try {
                console.log('MercureListener: Événement reçu', event.data);
                const data = JSON.parse(event.data);
                handleMercureEvent(data);
            } catch (error) {
                console.error("Erreur lors du traitement de l'événement Mercure:", error);
            }
        };

        eventSource.value.onerror = error => {
            console.error('Erreur de connexion à Mercure:', error);
            // Tenter de reconnecter après un délai
            setTimeout(() => {
                if (eventSource.value) {
                    setupMercureEventSource();
                }
            }, 5000);
        };
    };

    const handleMercureEvent = data => {
        if (!data || !data.type) {
            console.warn('MercureListener: Événement sans type reçu', data);
            return;
        }

        switch (data.type) {
            case 'chapter.scraped':
                console.log(`MercureListener: Chapitre ${data.chapterNumber} scrappé avec succès!`, data);

                // Vérifier que l'ID du chapitre est présent et au bon format
                if (!data.chapterId) {
                    console.error("MercureListener: ID du chapitre manquant dans l'événement", data);
                    return;
                }

                // Mettre à jour l'état du chapitre dans le store
                try {
                    // Mettre à jour le store Pinia
                    store.updateChapterAvailability(data.chapterId, true);
                    console.log(
                        `MercureListener: Chapitre ${data.chapterNumber} (ID: ${data.chapterId}) marqué comme disponible`
                    );

                    // Invalider le cache des requêtes pour forcer un rechargement frais
                    console.log(`MercureListener: Invalidation du cache pour les chapitres du manga ${props.mangaId}`);
                    queryClient.invalidateQueries(['manga', ref(props.mangaId), 'chapters']);

                    // Force le rechargement des chapitres via le store
                    setTimeout(() => {
                        console.log('MercureListener: Rechargement forcé des chapitres via le store');
                        store.loadChapters(props.mangaId);
                    }, 100);
                } catch (error) {
                    console.error('MercureListener: Erreur lors de la mise à jour du chapitre', error);
                }
                break;

            case 'chapter.scraping.failed':
                console.error(`MercureListener: Échec du scraping du chapitre ${data.chapterNumber}:`, data.reason);
                break;

            default:
                console.log('MercureListener: Événement Mercure non géré:', data);
        }
    };

    watch(
        () => props.mangaId,
        (newMangaId, oldMangaId) => {
            console.log(`MercureListener: MangaId changé de ${oldMangaId} à ${newMangaId}`);
            if (newMangaId) {
                setupMercureEventSource();
            } else if (eventSource.value) {
                eventSource.value.close();
                eventSource.value = null;
            }
        }
    );

    onMounted(() => {
        setupMercureEventSource();
    });

    onBeforeUnmount(() => {
        if (eventSource.value) {
            eventSource.value.close();
            eventSource.value = null;
        }
    });
</script>
