package com.airbnb.lottie.snapshots.tests

import android.content.Context
import com.airbnb.lottie.LottieCompositionFactory
import com.airbnb.lottie.snapshots.SnapshotTestCase
import com.airbnb.lottie.snapshots.SnapshotTestCaseContext
import com.airbnb.lottie.snapshots.snapshotComposition
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.asCoroutineDispatcher
import kotlinx.coroutines.channels.produce
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.launch
import java.util.concurrent.Executors

class AssetsTestCase : SnapshotTestCase {
    override suspend fun SnapshotTestCaseContext.run() = coroutineScope {
        val assetsChannel = listAssets()
        val compositionsChannel = parseCompositionsFromAssets(context, assetsChannel)
        repeat(3) {
            launch {
                for ((name, composition) in compositionsChannel) {
                    snapshotComposition(name, composition = composition)
                }
            }
        }
    }
    private fun SnapshotTestCaseContext.listAssets(assets: MutableList<String> = mutableListOf(), pathPrefix: String = ""): List<String> {
        context.assets.list(pathPrefix)?.forEach { animation ->
            val pathWithPrefix = if (pathPrefix.isEmpty()) animation else "$pathPrefix/$animation"
            if (!animation.contains('.')) {
                listAssets(assets, pathWithPrefix)
                return@forEach
            }
            if (!animation.endsWith(".json") && !animation.endsWith(".zip")) return@forEach
            assets += pathWithPrefix
        }
        return assets
    }

    private fun CoroutineScope.parseCompositionsFromAssets(context: Context, assets: List<String>) = produce(
        context = Executors.newSingleThreadExecutor().asCoroutineDispatcher(),
        capacity = 10,
    ) {
        for (asset in assets) {
            val result = LottieCompositionFactory.fromAssetSync(context, asset)
            val composition = result.value ?: throw IllegalArgumentException("Unable to parse $asset.", result.exception)
            send(asset to composition)
        }
    }
}