package com.airbnb.lottie.samples

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.animation.Interpolator
import android.widget.Scroller
import com.airbnb.lottie.LottieAnimationView
import com.matthewtamlin.sliding_intro_screen_library.buttons.IntroButton
import com.matthewtamlin.sliding_intro_screen_library.core.IntroActivity
import com.matthewtamlin.sliding_intro_screen_library.core.LockableViewPager


class AppIntroActivity : IntroActivity() {
    private val ANIMATION_TIMES = floatArrayOf(0f, 0.3333f, 0.6666f, 1f, 1f)

    private val animationView: LottieAnimationView by lazy {
        rootView.inflate(R.layout.app_intro_animation_view, false) as LottieAnimationView
    }
    private val viewPager: LockableViewPager by lazy {
        findViewById<LockableViewPager>(R.id.intro_activity_viewPager)
    }

    override fun generatePages(savedInstanceState: Bundle?): Collection<Fragment> {
        return listOf(
                EmptyFragment.newInstance(),
                EmptyFragment.newInstance(),
                EmptyFragment.newInstance(),
                EmptyFragment.newInstance()
        )
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        rootView.addView(animationView, 0)
        setViewPagerScroller()

        addPageChangeListener(OnPageChangeListenerAdapter(
            onPageScrolled = { position, positionOffset, _ ->
                setAnimationProgress(position, positionOffset)
            }
        ))
    }

    override fun generateFinalButtonBehaviour(): IntroButton.Behaviour {
        return object : IntroButton.Behaviour {
            override fun setActivity(activity: IntroActivity) { finish() }
            override fun getActivity(): IntroActivity? = null
            override fun run() {}
        }
    }

    private fun setAnimationProgress(position: Int, positionOffset: Float) {
        val startProgress = ANIMATION_TIMES[position]
        val endProgress = ANIMATION_TIMES[position + 1]

        animationView.progress = startProgress.lerp(endProgress, positionOffset)
    }

    class EmptyFragment : androidx.fragment.app.Fragment() {

        override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
            return container!!.inflate(R.layout.fragment_empty, false)
        }

        companion object {
            internal fun newInstance(): EmptyFragment {
                return EmptyFragment()
            }
        }
    }

    private fun setViewPagerScroller() {
        try {
            val scrollerField = androidx.viewpager.widget.ViewPager::class.java.getDeclaredField("mScroller")
            scrollerField.isAccessible = true
            val interpolator = androidx.viewpager.widget.ViewPager::class.java.getDeclaredField("sInterpolator")
            interpolator.isAccessible = true

            val scroller = object : Scroller(this, interpolator.get(null) as Interpolator) {
                override fun startScroll(startX: Int, startY: Int, dx: Int, dy: Int, duration: Int) {
                    super.startScroll(startX, startY, dx, dy, duration * 7)
                }
            }
            scrollerField.set(viewPager, scroller)
        } catch (e: NoSuchFieldException) {
            // Do nothing.
        } catch (e: IllegalAccessException) {
            // Do nothing.
        }
    }
}
