package com.airbnb.lottie.snapshots.tests

import android.graphics.Canvas
import android.view.LayoutInflater
import android.view.View
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.size
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.unit.dp
import com.airbnb.lottie.LottieCompositionFactory
import com.airbnb.lottie.compose.LottieAnimation
import com.airbnb.lottie.snapshots.SnapshotTestCase
import com.airbnb.lottie.snapshots.SnapshotTestCaseContext
import com.airbnb.lottie.snapshots.databinding.ClipChildrenBinding
import com.airbnb.lottie.snapshots.snapshotComposable

class ClipChildrenTestCase : SnapshotTestCase {
    override suspend fun SnapshotTestCaseContext.run() {
        val composition = LottieCompositionFactory.fromAssetSync(context, "Tests/BeyondBounds.json").value!!
        snapshotComposable("Compose Clip Children", "Clip", renderHardwareAndSoftware = true) { renderMode ->
            Box(
                contentAlignment = Alignment.Center,
                modifier = Modifier
                    .size(400.dp, 400.dp)
            ) {
                LottieAnimation(
                    composition,
                    0.7f,
                    contentScale = ContentScale.Crop,
                    renderMode = renderMode,
                    modifier = Modifier
                        .size(200.dp, 100.dp)
                )
            }
        }

        snapshotComposable("Compose Clip Children", "Dont Clip", renderHardwareAndSoftware = true) { renderMode ->
            Box(
                contentAlignment = Alignment.Center,
                modifier = Modifier
                    .size(400.dp, 400.dp)
            ) {
                LottieAnimation(
                    composition,
                    0.7f,
                    contentScale = ContentScale.Crop,
                    renderMode = renderMode,
                    clipToCompositionBounds = false,
                    modifier = Modifier
                        .size(200.dp, 100.dp)
                )
            }
        }

        val binding = ClipChildrenBinding.inflate(LayoutInflater.from(context))
        binding.animationView.setComposition(composition)
        binding.root.measureAndLayout()

        val bitmap1 = bitmapPool.acquire(binding.root.width, binding.root.height)
        val canvas = Canvas(bitmap1)
        binding.root.draw(canvas)
        snapshotter.record(bitmap1, "Clip Children", "Clip")

        val bitmap2 = bitmapPool.acquire(binding.root.width, binding.root.height)
        canvas.setBitmap(bitmap2)
        binding.animationView.clipToCompositionBounds = false
        binding.root.draw(canvas)
        snapshotter.record(bitmap2, "Clip Children", "Don't Clip")

    }

    private fun View.measureAndLayout() {
        val spec = View.MeasureSpec.makeMeasureSpec(600, View.MeasureSpec.EXACTLY)
        measure(spec, spec)
        layout(0, 0, measuredWidth, measuredHeight)
    }
}