• Merge results from direct AniList search and fallback sources, deduplicating by manga ID.

    Parameters

    Returns {
        mergedResults: AniListManga[];
        comickSourceMap: ComickSourceMap;
        mangaDexSourceMap: MangaDexSourceMap;
    }

    Merged results and source maps.

    export function mergeSourceResults(
    originalResults: AniListManga[],
    comickResults: AniListManga[],
    mangaDexResults: AniListManga[],
    comickSourceMap: ComickSourceMap,
    mangaDexSourceMap: MangaDexSourceMap,
    ): {
    mergedResults: AniListManga[];
    comickSourceMap: ComickSourceMap;
    mangaDexSourceMap: MangaDexSourceMap;
    } {
    const seenIds = new Set<number>();
    const mergedResults: AniListManga[] = [];
    const finalComickSourceMap = new Map(comickSourceMap);
    const finalMangaDexSourceMap = new Map(mangaDexSourceMap);

    // Add original results first
    for (const manga of originalResults) {
    if (!seenIds.has(manga.id)) {
    seenIds.add(manga.id);
    mergedResults.push(manga);
    }
    }

    // Add Comick results, checking for duplicates
    for (const manga of comickResults) {
    if (seenIds.has(manga.id)) {
    // If duplicate, keep the Comick source info
    console.debug(
    `[MangaSearchService] 🔄 Found duplicate manga ID ${manga.id} from Comick, keeping source info`,
    );
    } else {
    seenIds.add(manga.id);
    mergedResults.push(manga);
    }
    }

    // Add MangaDex results, checking for duplicates
    for (const manga of mangaDexResults) {
    if (seenIds.has(manga.id)) {
    // If duplicate, keep the MangaDex source info
    console.debug(
    `[MangaSearchService] 🔄 Found duplicate manga ID ${manga.id} from MangaDex, keeping source info`,
    );
    } else {
    seenIds.add(manga.id);
    mergedResults.push(manga);
    }
    }

    console.debug(
    `[MangaSearchService] 🔗 Merged results: ${originalResults.length} original + ${comickResults.length} Comick + ${mangaDexResults.length} MangaDex = ${mergedResults.length} unique results`,
    );

    return {
    mergedResults,
    comickSourceMap: finalComickSourceMap,
    mangaDexSourceMap: finalMangaDexSourceMap,
    };
    }