package com.topjohnwu.magisk.utils

import android.content.res.Resources
import android.widget.TextView
import androidx.databinding.BindingAdapter
import androidx.databinding.InverseBindingAdapter
import com.topjohnwu.magisk.ktx.get

sealed class TransitiveText {

    abstract val isEmpty: Boolean
    abstract fun getText(resources: Resources): CharSequence

    // ---

    class String(
        private val value: CharSequence
    ) : TransitiveText() {

        override val isEmpty = value.isEmpty()
        override fun getText(resources: Resources) = value

    }

    class Res(
        private val value: Int,
        private vararg val params: Any
    ) : TransitiveText() {

        override val isEmpty = value == 0
        override fun getText(resources: Resources) =
            resources.getString(value, *params)

    }

    // ---

    companion object {
        val EMPTY = String("")
    }

}


fun Int.asTransitive(vararg params: Any) = TransitiveText.Res(this, *params)
fun CharSequence.asTransitive() = TransitiveText.String(this)


@BindingAdapter("android:text")
fun TextView.setText(text: TransitiveText) {
    this.text = text.getText(get())
}

@InverseBindingAdapter(attribute = "android:text", event = "android:textAttrChanged")
fun TextView.getTransitiveText() = text.asTransitive()
