package com.airbnb.lottie.samples

import android.annotation.SuppressLint
import android.graphics.PointF
import android.os.Bundle
import android.util.Log
import androidx.annotation.FloatRange
import androidx.appcompat.app.AppCompatActivity
import com.airbnb.lottie.LottieProperty
import com.airbnb.lottie.model.KeyPath
import com.airbnb.lottie.samples.databinding.DynamicActivityBinding
import com.airbnb.lottie.samples.utils.viewBinding

private val COLORS = arrayOf(
    0xff5a5f,
    0x008489,
    0xa61d55
)
private val EXTRA_JUMP = arrayOf(0f, 20f, 50f)

class DynamicActivity : AppCompatActivity() {
    private val binding: DynamicActivityBinding by viewBinding()

    private var speed = 1
    private var colorIndex = 0
    private var extraJumpIndex = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding.speedButton.setOnClickListener {
            speed = ++speed % 4
            updateButtonText()
        }

        binding.colorButton.setOnClickListener {
            colorIndex = (colorIndex + 1) % COLORS.size
            updateButtonText()
        }

        binding.jumpHeight.setOnClickListener {
            extraJumpIndex = (extraJumpIndex + 1) % EXTRA_JUMP.size
            updateButtonText()
            setupValueCallbacks()
        }

        binding.animationView.addLottieOnCompositionLoadedListener { _ ->
            binding.animationView.resolveKeyPath(KeyPath("**")).forEach {
                Log.d(TAG, it.keysToString())
                setupValueCallbacks()
            }
        }
        binding.animationView.setFailureListener { e ->
            Log.e(TAG, "Failed to load animation!", e)
        }

        updateButtonText()
    }

    private fun setupValueCallbacks() {
        binding.animationView.addValueCallback(KeyPath("LeftArmWave"), LottieProperty.TIME_REMAP) { frameInfo ->
            2 * speed.toFloat() * frameInfo.overallProgress
        }

        val shirt = KeyPath("Shirt", "Group 5", "Fill 1")
        val leftArm = KeyPath("LeftArmWave", "LeftArm", "Group 6", "Fill 1")
        val rightArm = KeyPath("RightArm", "Group 6", "Fill 1")

        binding.animationView.addValueCallback(shirt, LottieProperty.COLOR) { COLORS[colorIndex] }
        binding.animationView.addValueCallback(leftArm, LottieProperty.COLOR) { COLORS[colorIndex] }
        binding.animationView.addValueCallback(rightArm, LottieProperty.COLOR) { COLORS[colorIndex] }
        val point = PointF()
        binding.animationView.addValueCallback(KeyPath("Body"),
            LottieProperty.TRANSFORM_POSITION) { frameInfo ->
            val startX = frameInfo.startValue.x
            var startY = frameInfo.startValue.y
            var endY = frameInfo.endValue.y

            if (startY > endY) {
                startY += EXTRA_JUMP[extraJumpIndex]
            } else if (endY > startY) {
                endY += EXTRA_JUMP[extraJumpIndex]
            }
            point.set(startX, lerp(startY, endY, frameInfo.interpolatedKeyframeProgress))
            point
        }
    }

    @SuppressLint("SetTextI18n")
    private fun updateButtonText() {
        binding.speedButton.text = "Wave: ${speed}x Speed"
        binding.jumpHeight.text = "Extra jump height ${EXTRA_JUMP[extraJumpIndex]}"
    }

    fun lerp(a: Float, b: Float, @FloatRange(from = 0.0, to = 1.0) percentage: Float) =  a + percentage * (b - a)

    companion object {
        val TAG = DynamicActivity::class.simpleName
    }
}
