package com.airbnb.lottie.snapshots.tests

import androidx.compose.foundation.layout.size
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.scale
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.unit.dp
import com.airbnb.lottie.compose.LottieAnimation
import com.airbnb.lottie.snapshots.SnapshotTestCase
import com.airbnb.lottie.snapshots.SnapshotTestCaseContext
import com.airbnb.lottie.snapshots.loadCompositionFromAssetsSync
import com.airbnb.lottie.snapshots.snapshotComposable

class ComposeScaleTypesTestCase : SnapshotTestCase {
    override suspend fun SnapshotTestCaseContext.run() {
        val composition = loadCompositionFromAssetsSync("Lottie Logo 1.json")
        snapshotComposable("Compose Scale Types", "Wrap Content", renderHardwareAndSoftware = true) { renderMode ->
            LottieAnimation(
                composition,
                { 1f },
                renderMode = renderMode,
            )
        }

        snapshotComposable("Compose Scale Types", "720p", renderHardwareAndSoftware = true) { renderMode ->
            LottieAnimation(
                composition,
                { 1f },
                renderMode = renderMode,
                modifier = Modifier
                    .size(720.dp, 1280.dp)
            )
        }

        snapshotComposable("Compose Scale Types", "300x300@2x", renderHardwareAndSoftware = true) { renderMode ->
            LottieAnimation(
                composition,
                { 1f },
                renderMode = renderMode,
                modifier = Modifier
                    .size(300.dp, 300.dp)
                    .scale(2f)
            )
        }

        snapshotComposable("Compose Scale Types", "300x300@4x", renderHardwareAndSoftware = true) { renderMode ->
            LottieAnimation(
                composition,
                { 1f },
                renderMode = renderMode,
                modifier = Modifier
                    .size(300.dp, 300.dp)
                    .scale(4f)
            )
        }

        snapshotComposable("Compose Scale Types", "300x300 Crop", renderHardwareAndSoftware = true) { renderMode ->
            LottieAnimation(
                composition,
                { 1f },
                contentScale = ContentScale.Crop,
                renderMode = renderMode,
                modifier = Modifier
                    .size(300.dp, 300.dp)
            )
        }

        snapshotComposable("Compose Scale Types", "300x300 Inside", renderHardwareAndSoftware = true) { renderMode ->
            LottieAnimation(
                composition,
                { 1f },
                contentScale = ContentScale.Inside,
                renderMode = renderMode,
                modifier = Modifier
                    .size(300.dp, 300.dp)
            )
        }

        snapshotComposable("Compose Scale Types", "300x300 FillBounds", renderHardwareAndSoftware = true) { renderMode ->
            LottieAnimation(
                composition,
                { 1f },
                contentScale = ContentScale.FillBounds,
                renderMode = renderMode,
                modifier = Modifier
                    .size(300.dp, 300.dp)
            )
        }

        snapshotComposable("Compose Scale Types", "300x300 Fit 2x", renderHardwareAndSoftware = true) { renderMode ->
            LottieAnimation(
                composition,
                { 1f },
                contentScale = ContentScale.Fit,
                renderMode = renderMode,
                modifier = Modifier
                    .size(300.dp, 300.dp)
                    .scale(2f)
            )
        }

        snapshotComposable("Compose Scale Types", "300x300 Crop 2x", renderHardwareAndSoftware = true) { renderMode ->
            LottieAnimation(
                composition,
                { 1f },
                contentScale = ContentScale.Crop,
                renderMode = renderMode,
                modifier = Modifier
                    .size(300.dp, 300.dp)
                    .scale(2f)
            )
        }

        snapshotComposable("Compose Scale Types", "600x600 Inside", renderHardwareAndSoftware = true) { renderMode ->
            LottieAnimation(
                composition,
                { 1f },
                contentScale = ContentScale.Inside,
                renderMode = renderMode,
                modifier = Modifier
                    .size(600.dp, 600.dp)
            )
        }

        snapshotComposable("Compose Scale Types", "600x600 FillBounds", renderHardwareAndSoftware = true) { renderMode ->
            LottieAnimation(
                composition,
                { 1f },
                contentScale = ContentScale.FillBounds,
                renderMode = renderMode,
                modifier = Modifier
                    .size(600.dp, 600.dp)
            )
        }

        snapshotComposable("Compose Scale Types", "600x600 Fit", renderHardwareAndSoftware = true) { renderMode ->
            LottieAnimation(
                composition,
                { 1f },
                contentScale = ContentScale.Fit,
                renderMode = renderMode,
                modifier = Modifier
                    .size(600.dp, 600.dp)
            )
        }

        snapshotComposable("Compose Scale Types", "300x600 FitBounds", renderHardwareAndSoftware = true) { renderMode ->
            LottieAnimation(
                composition,
                { 1f },
                contentScale = ContentScale.FillBounds,
                renderMode = renderMode,
                modifier = Modifier
                    .size(300.dp, 600.dp)
            )
        }
    }
}