package org.jetbrains.anko

import android.view.Menu
import android.view.MenuItem
import android.view.SubMenu

/**
 * Create a plain menu item
 */
fun Menu.item(
    title: CharSequence, /*@DrawableRes*/
    icon: Int = 0,
    checkable: Boolean = false,
): MenuItem =
    add(title).apply {
        setIcon(icon)
        isCheckable = checkable
    }

/**
 * Create a menu item and configure it
 */
inline fun Menu.item(
    title: CharSequence, /*@DrawableRes*/
    icon: Int = 0,
    checkable: Boolean = false,
    configure: MenuItem.() -> Unit,
): MenuItem =
    add(title).apply {
        setIcon(icon)
        isCheckable = checkable
        configure()
    }

/**
 * Create a menu item with title from resources
 */
fun Menu.item(
/*@StringRes*/
    titleRes: Int, /*@DrawableRes*/
    icon: Int = 0,
    checkable: Boolean = false,
): MenuItem =
    add(titleRes).apply {
        setIcon(icon)
        isCheckable = checkable
    }

/**
 * Create a menu item with title from resources and configure it
 */
inline fun Menu.item(
/*@StringRes*/
    titleRes: Int, /*@DrawableRes*/
    icon: Int = 0,
    checkable: Boolean = false,
    configure: MenuItem.() -> Unit,
): MenuItem =
    add(titleRes).apply {
        setIcon(icon)
        isCheckable = checkable
        configure()
    }

/**
 * Create a submenu
 */
fun Menu.subMenu(title: CharSequence): SubMenu =
    addSubMenu(title)

/**
 * Create a submenu and configure it
 */
inline fun Menu.subMenu(title: CharSequence, configure: SubMenu.() -> Unit): SubMenu =
    addSubMenu(title).apply { configure() }

/**
 * Create a submenu with title from resources
 */
fun Menu.subMenu(/*@StringRes*/ titleRes: Int): SubMenu =
    addSubMenu(titleRes)

/**
 * Create a submenu with title from resources and configure it
 */
inline fun Menu.subMenu(/*@StringRes*/ titleRes: Int, configure: SubMenu.() -> Unit): SubMenu =
    addSubMenu(titleRes).apply { configure() }

/**
 * Create a checkable menu item for use in NavigationView
 */
fun Menu.navigationItem(title: CharSequence, /*@DrawableRes*/ icon: Int = 0) {
    add(title).apply {
        setIcon(icon)
        isCheckable = true
    }
}

/**
 * Create a navigation item with OnClickListener
 */
inline fun Menu.navigationItem(
    title: CharSequence, /*@DrawableRes*/
    icon: Int = 0,
    crossinline onClick: () -> Unit,
) {
    add(title).apply {
        setIcon(icon)
        isCheckable = true
        setOnMenuItemClickListener {
            onClick()
            false
        }
    }
}

/**
 * Create a navigation item with title from resources
 */
fun Menu.navigationItem(/*@StringRes*/ titleRes: Int, /*@DrawableRes*/ icon: Int = 0) {
    add(titleRes).apply {
        setIcon(icon)
        isCheckable = true
    }
}

/**
 * Create a navigation item with title from resources and onClick listener
 */
inline fun Menu.navigationItem(
/*@StringRes*/
    titleRes: Int, /*@DrawableRes*/
    icon: Int = 0,
    crossinline onClick: () -> Unit,
) {
    add(titleRes).apply {
        setIcon(icon)
        isCheckable = true
        setOnMenuItemClickListener {
            onClick()
            false
        }
    }
}

/**
 * Set OnClickListener on a menu item
 */
inline fun MenuItem.onClick(consume: Boolean = true, crossinline action: () -> Unit) {
    setOnMenuItemClickListener { action(); consume }
}