import Path from "path"
import { createSource, createSourceOptions, extractImages, downloadImages, getPostIdFromPathname, fetchChannel } from "../lib.js"

let nitter = {}

export const fetchChannelFromInstances = async (source) => {
	let index = 0
	let instances = source.instances
	let cachedLink = source.cache.link
	let channel

	if(cachedLink) {
		instances.unshift(cachedLink.hostname)
	}

	while(!channel && index != instances.length) {
		source.hostname = instances[index]
		channel = await fetchChannel(source)

		if(source.errored) {
			console.error(`Failed to fetch ${source.name} from ${source.hostname}: `, source.error)
			index++
		} else {
			break
		}
	}

	return channel
}

nitter.createSource = (user, options, instances, postReducerCallback, cache) => {
    let source = {
        type: 'nitter',
        description: `Aggregate feed for @${user} on twitter.com`,
        instances,
        pathname: user + '/rss',
        name: `nitter-${user}`,
        displayName: user,
        user,
        ...createSourceOptions(options)
    }

    return createSource(source, fetchChannelFromInstances, postReducerCallback, cache)
}

nitter.isRepost = (post) => {
    let creator = post.item.getElementsByTagName('dc:creator')[0]

    return creator.innerHTML.slice(1) !== post.source.user
}

nitter.pullImages = async (post, view, imageMirrorDomain, discardPostIfNoImages = false, getPostId = getPostIdFromPathname) => {
    let images = extractImages(post)
    const mirrorImage = nitter.createImageMirrorer(post, imageMirrorDomain)

    if(!discardPostIfNoImages || images.length > 0) {
        post.images = await downloadImages(
            images.map(mirrorImage),
            post.source,
            getPostId(post),
            view
        )
        return post
    }
}

nitter.createImageMirrorer =(post, imageMirrorDomain) => {
    let mirrorUrl = new URL(imageMirrorDomain)
    let basePathname = new URL(post.guid).pathname

    return (image, index, images) => {
        mirrorUrl.pathname = Path.join(basePathname, 'photo', (index + 1).toString())

        return mirrorUrl.href
    }
}

export default nitter