package com.airbnb.lottie.samples

import android.arch.lifecycle.Observer
import android.arch.lifecycle.ViewModelProviders
import android.content.Intent
import android.os.Bundle
import android.support.v4.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.airbnb.epoxy.EpoxyController
import com.airbnb.epoxy.EpoxyRecyclerView
import com.airbnb.lottie.samples.model.CompositionArgs
import com.airbnb.lottie.samples.model.ShowcaseItem
import com.airbnb.lottie.samples.views.LoadingViewModel_
import com.airbnb.lottie.samples.views.MarqueeModel_
import com.airbnb.lottie.samples.views.ShowcaseAnimationItemViewModel_
import com.airbnb.lottie.samples.views.ShowcaseCarouselModel_
import kotlinx.android.synthetic.main.fragment_epoxy_recycler_view.*

class ShowcaseFragment : Fragment(), EpoxyRecyclerView.ModelBuilderCallback {

    private val showcaseItems = listOf(
            ShowcaseItem(R.drawable.showcase_preview_lottie, R.string.showcase_item_app_intro) {
                startActivity(Intent(requireContext(), AppIntroActivity::class.java))
            },
            ShowcaseItem(R.drawable.showcase_preview_lottie, R.string.showcase_item_dynamic_properties) {
                startActivity(Intent(requireContext(), DynamicActivity::class.java))
            },
            ShowcaseItem(R.drawable.gilbert_animated, R.string.showcase_item_animated_text) {
                startActivity(Intent(requireContext(), TypographyDemoActivity::class.java))
            },
            ShowcaseItem(R.drawable.gilbert_animated, R.string.showcase_item_dynamic_text) {
                startActivity(Intent(requireContext(), DynamicTextActivity::class.java))
            },
            ShowcaseItem(R.drawable.showcase_preview_lottie, R.string.showcase_item_bullseye) {
                startActivity(Intent(requireContext(), BullseyeActivity::class.java))
            },
            ShowcaseItem(R.drawable.showcase_preview_lottie, R.string.showcase_item_recycler_viwe) {
                startActivity(Intent(requireContext(), ListActivity::class.java))
            }
    )
    private val viewModel by lazy { ViewModelProviders.of(this).get(ShowcaseViewModel::class.java) }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? =
            inflater.inflate(R.layout.fragment_epoxy_recycler_view, container, false)

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        recyclerView.buildModelsWith(this)

        viewModel.collection.observe(this, Observer {
            recyclerView.requestModelBuild()
        })

        viewModel.loading.observe(this, Observer {
            recyclerView.requestModelBuild()
        })

        viewModel.fetchAnimations()
    }

    override fun buildModels(controller: EpoxyController) {
        MarqueeModel_()
                .id("showcase")
                .title("Showcase")
                .addTo(controller)
        ShowcaseCarouselModel_()
                .id("carousel")
                .showcaseItems(showcaseItems)
                .addTo(controller)

        viewModel.collection.value?.data?.forEach {
            ShowcaseAnimationItemViewModel_()
                    .id(it.id)
                    .title(it.title)
                    .previewUrl(it.preview)
                    .onClickListener { _ ->
                        startActivity(PlayerActivity.intent(requireContext(), CompositionArgs(animationData = it)))
                    }
                    .addTo(controller)
        }

        LoadingViewModel_()
                .id("loading")
                .addIf(viewModel.loading.value ?: false, controller)
    }
}