package com.airbnb.lottie.sample.compose.examples

import android.content.Context
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import com.airbnb.lottie.LottieProperty
import com.airbnb.lottie.compose.LottieAnimation
import com.airbnb.lottie.compose.LottieCompositionSpec
import com.airbnb.lottie.compose.LottieConstants
import com.airbnb.lottie.compose.rememberLottieComposition
import com.airbnb.lottie.compose.rememberLottieDynamicProperties
import com.airbnb.lottie.compose.rememberLottieDynamicProperty
import com.airbnb.lottie.sample.compose.R
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext

@Composable
fun ImagesExamplesPage() {
    UsageExamplePageScaffold {
        Column(
            modifier = Modifier
                .fillMaxWidth()
                .verticalScroll(rememberScrollState())
        ) {
            ExampleCard("Inline Image", "base64 image embedded in json file") {
                InlineImage()
            }
            ExampleCard("Assets Image", "Image stored in assets") {
                ImageAssets()
            }
            ExampleCard("Dynamic Properties", "Replace an image with dynamic properties") {
                DynamicProperties()
            }
            ExampleCard("Store on LottieImageAsset", "Store the bitmap within LottieImageAsset") {
                StoredOnImageAsset()
            }
        }
    }
}

@Composable
fun InlineImage() {
    // Don't cache the composition so the bitmaps can get released once the animation is no longer being used.
    val composition by rememberLottieComposition(
        LottieCompositionSpec.RawRes(R.raw.we_accept_inline_image),
        cacheKey = null,
    )
    LottieAnimation(
        composition,
        iterations = LottieConstants.IterateForever,
    )
}

@Composable
fun ImageAssets() {
    // Don't cache the composition so the bitmaps can get released once the animation is no longer being used.
    val composition by rememberLottieComposition(
        LottieCompositionSpec.RawRes(R.raw.we_accept),
        cacheKey = null,
        imageAssetsFolder = "Images/WeAccept",
    )
    LottieAnimation(
        composition,
        iterations = LottieConstants.IterateForever,

    )
}

@Composable
fun DynamicProperties() {
    // Don't cache the composition so the bitmaps can get released once the animation is no longer being used.
    val composition by rememberLottieComposition(
        LottieCompositionSpec.RawRes(R.raw.we_accept),
        cacheKey = null,
    )
    val bitmap = rememberBitmapFromAssets("Images/android.png")

    val dynamicProperties = rememberLottieDynamicProperties(
        rememberLottieDynamicProperty(LottieProperty.IMAGE, bitmap, "weaccept.jpg")
    )

    LottieAnimation(
        composition,
        iterations = LottieConstants.IterateForever,
        dynamicProperties = dynamicProperties,
    )
}

@Composable
fun StoredOnImageAsset() {
    // Don't cache the composition so the bitmaps can get released once the animation is no longer being used.
    val composition by rememberLottieComposition(
        LottieCompositionSpec.RawRes(R.raw.we_accept),
        cacheKey = null,
    )
    val imageAsset by derivedStateOf { composition?.images?.get("image_0") }
    val bitmap = rememberBitmapFromAssets("Images/android.png")
    LaunchedEffect(imageAsset, bitmap) {
        if (imageAsset != null && bitmap != null) {
            // this stores the bitmap on the original composition's image asset which means that it
            // will affect *all* LottieAnimation composables that are rendering this LottieComposition.
            // Use with caution.
            imageAsset?.bitmap = bitmap
        }
    }
    LottieAnimation(
        composition,
        iterations = LottieConstants.IterateForever,
    )
}

@Composable
private fun rememberBitmapFromAssets(asset: String): Bitmap? {
    var bitmap: Bitmap? by remember { mutableStateOf(null) }
    val context = LocalContext.current
    LaunchedEffect(asset) {
        withContext(Dispatchers.IO) {
            bitmap = loadBitmapFromAssets(context, asset)
        }
    }
    return bitmap
}

private fun loadBitmapFromAssets(context: Context, asset: String?): Bitmap? {
    asset ?: return null
    return try {
        val inputSteam = context.assets.open(asset)
        val opts = BitmapFactory.Options()
        opts.inScaled = true
        opts.inDensity = 1606
        BitmapFactory.decodeStream(inputSteam, null, opts)
    } catch (e: Exception) {
        null
    }
}