# CategoryCard.kt

    /*
     * The MIT License
     *
     * Original work sponsored and donated by The Danish Health Data Authority (http://www.sundhedsdatastyrelsen.dk)
     *
     * Copyright (C) 2021 The Danish Health Data Authority (http://www.sundhedsdatastyrelsen.dk)
     *
     *
     * Permission is hereby granted, free of charge, to any person obtaining a copy of
     * this software and associated documentation files (the "Software"), to deal in
     * the Software without restriction, including without limitation the rights to
     * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
     * of the Software, and to permit persons to whom the Software is furnished to do
     * so, subject to the following conditions:
     *
     *
     * The above copyright notice and this permission notice shall be included in all
     * copies or substantial portions of the Software.
     *
     *
     * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
     * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
     * SOFTWARE.
     */

    package dk.nsp.mingraviditet.ui.main.knowledge

    import androidx.core.content.ContextCompat
    import com.commonsense.android.kotlin.views.extensions.gone
    import com.commonsense.android.kotlin.views.extensions.visible
    import dk.nsp.mingraviditet.R
    import dk.nsp.mingraviditet.databinding.CategoryCardBinding
    import dk.nsp.mingraviditet.extensions.bindSrcUrl
    import dk.nsp.mingraviditet.util.android.recycler.BindingViewHolder
    import dk.nsp.mingraviditet.util.android.recycler.DelegationListAdapterInflater
    import dk.nsp.mingraviditet.util.android.recycler.RecyclerAdapterView
    import dk.nsp.util.textmodel.TextModel

    sealed class CategoryCardData(
        val title: TextModel,
        val description: TextModel,
        val tickerText: TextModel,
        val onClick: () -> Unit
    ) {
        class WithIconUrl(
            mTitle: String,
            mDescription: String,
            mTickerText: TextModel,
            val iconUrl: String?,
            mOnClick: () -> Unit
        ) : CategoryCardData(
            TextModel.from(mTitle),
            TextModel.from(mDescription),
            mTickerText,
            mOnClick
        )

        class WithoutIcon(
            mTitle: TextModel,
            mDescription: TextModel,
            mTickerText: TextModel,
            mOnClick: () -> Unit
        ) : CategoryCardData(mTitle, mDescription, mTickerText, mOnClick)
    }

    class CategoryCard(val data: CategoryCardData) : RecyclerAdapterView<CategoryCardBinding> {
        override fun bindData(viewHolder: BindingViewHolder<CategoryCardBinding>) {
            viewHolder.binding.bm = data

            when (data) {
                is CategoryCardData.WithIconUrl -> {
                    viewHolder.binding.icon.apply {
                        bindSrcUrl(
                            data.iconUrl,
                            ContextCompat.getDrawable(
                                viewHolder.binding.root.context,
                                R.drawable.ic_square_placeholder
                            )
                        )
                        visible()
                    }
                }
                is CategoryCardData.WithoutIcon -> {
                    viewHolder.binding.icon.gone()
                }
            }
        }

        override val createHolderFunction: DelegationListAdapterInflater<CategoryCardBinding> =
            CategoryCardBinding::inflate

        override fun isContentTheSameAsInternal(other: RecyclerAdapterView<*>): Boolean {
            val otherAsCategoryCard = other as? CategoryCard

            return (data.title == otherAsCategoryCard?.data?.title
                && data.description == otherAsCategoryCard.data.description)
                && (data as? CategoryCardData.WithIconUrl)?.iconUrl == (otherAsCategoryCard.data as? CategoryCardData.WithIconUrl)?.iconUrl
        }
    }