/*
 * Copyright (C) 2024 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.settings.widget

import android.content.Context
import android.content.res.Resources
import android.util.AttributeSet
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.vectorResource
import com.android.settings.spa.preference.ComposePreference
import com.android.settingslib.spa.widget.card.CardButton
import com.android.settingslib.spa.widget.card.CardModel
import com.android.settingslib.spa.widget.card.SettingsCard

/** A preference for settings banner tips card. */
class TipCardPreference
@JvmOverloads
constructor(
    context: Context,
    attr: AttributeSet? = null,
) : ComposePreference(context, attr) {

    /** A icon resource id for displaying icon on tips card. */
    var iconResId: Int? = null

    /** A color resource id for displaying icon and button text on tips card. */
    var tintColorResId: Int? = null

    /** The primary button's text. */
    var primaryButtonText: String = ""

    /** The accessibility content description of the primary button. */
    var primaryButtonContentDescription: String? = null

    /** The action for click on primary button. */
    var primaryButtonAction: () -> Unit = {}

    /** The visibility of primary button on tips card. The default value is `false`. */
    var primaryButtonVisibility: Boolean = false

    /** The text on the second button of this [SettingsCard]. */
    var secondaryButtonText: String = ""

    /** The accessibility content description of the secondary button. */
    var secondaryButtonContentDescription: String? = null

    /** The action for click on secondary button. */
    var secondaryButtonAction: () -> Unit = {}

    /** The visibility of secondary button on tips card. The default value is `false`. */
    var secondaryButtonVisibility: Boolean = false

    var onClick: (() -> Unit)? = null

    /** The callback for click on card preference itself. */
    private var onDismiss: (() -> Unit)? = null

    /** Enable the dismiss button on tips card. */
    fun enableDismiss(enable: Boolean) =
        if (enable) onDismiss = { isVisible = false } else onDismiss = null

    /** Clear layout state if needed. */
    fun resetLayoutState() {
        primaryButtonVisibility = false
        secondaryButtonVisibility = false
        notifyChanged()
    }

    /** Build the tips card content to apply any changes of this card's property. */
    fun buildContent() {
        setContent {
            SettingsCard(
                CardModel(
                    title = title?.toString() ?: "",
                    text = summary?.toString() ?: "",
                    buttons = listOfNotNull(configPrimaryButton(), configSecondaryButton()),
                    tintColor = tintColorResId?.let { Color(context.getColor(it)) }
                        ?: Color.Unspecified,
                    onDismiss = onDismiss,
                    imageVector =
                    iconResId
                        ?.takeIf { it != Resources.ID_NULL }
                        ?.let { ImageVector.vectorResource(it) },
                    onClick = onClick,
                )
            )
        }
    }

    private fun configPrimaryButton(): CardButton? {
        return if (primaryButtonVisibility)
            CardButton(
                text = primaryButtonText,
                contentDescription = primaryButtonContentDescription,
                onClick = primaryButtonAction,
            )
        else null
    }

    private fun configSecondaryButton(): CardButton? {
        return if (secondaryButtonVisibility)
            CardButton(
                text = secondaryButtonText,
                contentDescription = secondaryButtonContentDescription,
                onClick = secondaryButtonAction,
            )
        else null
    }

    override fun notifyChanged() {
        buildContent()
        super.notifyChanged()
    }
}
