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

import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.defaultMinSize
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.DropdownMenu
import androidx.compose.material.DropdownMenuItem
import androidx.compose.material.Icon
import androidx.compose.material.Text
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowDownward
import androidx.compose.material.icons.filled.ArrowDropDown
import androidx.compose.material.icons.filled.ArrowDropUp
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberUpdatedState
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.PopupProperties
import com.airbnb.lottie.compose.LottieAnimation
import com.airbnb.lottie.compose.LottieCompositionSpec
import com.airbnb.lottie.compose.rememberLottieComposition
import com.airbnb.lottie.sample.compose.R

@Composable
fun ContentScaleExamplesPage() {
    val composition by rememberLottieComposition(LottieCompositionSpec.RawRes(R.raw.gradient))
    var alignment by remember { mutableStateOf(Alignment.Center) }
    var contentScale by remember { mutableStateOf(ContentScale.Fit) }

    UsageExamplePageScaffold {
        Column(
            modifier = Modifier
                .fillMaxWidth()
        ) {
            OptionsRow(
                alignment,
                contentScale,
                onAlignmentChanged = { alignment = it },
                onContentScaleChanged = { contentScale = it },
            )
            Box(
                modifier = Modifier
                    .fillMaxSize()
                    .padding(8.dp)
                    .border(2.dp, Color.Green)
                    .padding(2.dp)
            ) {
                LottieAnimation(
                    composition,
                    progress = 0f,
                    alignment = alignment,
                    contentScale = contentScale,
                )
            }
        }
    }
}
@Composable
private fun OptionsRow(
    alignment: Alignment,
    contentScale: ContentScale,
    onContentScaleChanged: (ContentScale) -> Unit,
    onAlignmentChanged: (Alignment) -> Unit,
) {
    var scaleExpanded by remember { mutableStateOf(false) }
    var alignmentExpanded by remember { mutableStateOf(false) }

    val onContentScaleChangedState by rememberUpdatedState(onContentScaleChanged)
    val onAlignmentChangedState by rememberUpdatedState(onAlignmentChanged)

    Row(
        horizontalArrangement = Arrangement.SpaceAround,
        verticalAlignment = Alignment.CenterVertically,
        modifier = Modifier
            .fillMaxWidth()
            .height(64.dp)
    ) {
        Row(
            modifier = Modifier
                .clickable {
                    scaleExpanded = true
                    alignmentExpanded = false
                }
                .padding(horizontal = 4.dp, vertical = 16.dp)
        ){
            Text(
                ContentScales[contentScale] ?: "Unknown Content Scale",
                textAlign = TextAlign.Center,
                modifier = Modifier
                    .defaultMinSize(minWidth = 128.dp)
            )
            Icon(
                imageVector = if (scaleExpanded) Icons.Filled.ArrowDropUp else Icons.Filled.ArrowDropDown,
                contentDescription = null,
            )
            DropdownMenu(
                scaleExpanded,
                onDismissRequest = { scaleExpanded = false },
            ) {
                ContentScales.forEach { (cs, label) ->
                    DropdownMenuItem(
                        onClick = { onContentScaleChangedState(cs) },
                    ) {
                        Text(label)
                    }
                }
            }
        }
        Row(
            modifier = Modifier
                .clickable {
                    alignmentExpanded = true
                    scaleExpanded = false
                }
                .padding(horizontal = 4.dp, vertical = 16.dp)
        ) {
            Text(
                Alignments[alignment] ?: "Unknown Alignment",
                textAlign = TextAlign.Center,
                modifier = Modifier
                    .defaultMinSize(minWidth = 128.dp)
            )
            Icon(
                imageVector = if (alignmentExpanded) Icons.Filled.ArrowDropUp else Icons.Filled.ArrowDropDown,
                contentDescription = null,
            )
            DropdownMenu(
                alignmentExpanded,
                onDismissRequest = { alignmentExpanded = false }
            ) {
                Alignments.forEach { (a, label) ->
                    DropdownMenuItem(
                        onClick = { onAlignmentChangedState(a) },
                    ) {
                        Text(label)
                    }
                }
            }
        }
    }
}

private val Alignments = mapOf(
    Alignment.TopStart to "TopStart",
    Alignment.TopCenter to "TopCenter",
    Alignment.TopEnd to "TopEnd",
    Alignment.CenterStart to "CenterStart",
    Alignment.Center to "Center",
    Alignment.CenterEnd to "CenterEnd",
    Alignment.BottomStart to "BottomStart",
    Alignment.BottomCenter to "BottomCenter",
    Alignment.BottomEnd to "BottomEnd",
)

private val ContentScales = mapOf(
    ContentScale.Fit to "Fit",
    ContentScale.Crop to "Crop",
    ContentScale.Inside to "Inside",
    ContentScale.None to "None",
    ContentScale.FillBounds to "FillBounds",
    ContentScale.FillHeight to "FillHeight",
    ContentScale.FillWidth to "FillWidth",
)
