package com.gh.gamecenter.common.pagelevel

import android.os.Parcelable
import kotlinx.parcelize.Parcelize

/**
 * 页面级别
 * @param type 页面级别类型 (T: 顶级, F: 首次跳转的页面, P: 次级)
 * @param bottomTabPosition 底部 tab 位置 (仅首页有值)
 * @param topTabPosition 顶部 tab 位置 (仅包含多 tab 导航页时有值)
 * @param bottomTopTabPositionMap 顶部 tab 与底部 tab 的映射关系 (当 bottomTabPosition 有值时，topTabPosition 的值应从这个 map 里取)
 * @param inferiorPageCount 当前页面是第几个次级页面 (仅次级页面有值)
 * @param supremePageLevel 顶级页面的 PageLevel (仅次级页面有值)
 */
@Parcelize
class PageLevel(
    var type: String,
    var bottomTabPosition: Int = -1,
    private var topTabPosition: Int = -1,
    var bottomTopTabPositionMap: HashMap<Int, Int> = hashMapOf(),
    var inferiorPageCount: Int = -1,
    var supremePageLevel: PageLevel? = null
) : Parcelable {

    override fun toString(): String {
        return toFormattedString()
    }

    /**
     * 获取与当前页面组合后的 PageLevel 字符串
     * 示例： T1(M1)-P2(M5) or F(M1)-P2(M5)
     */
    fun toFormattedString(ignoreBottomTabPositionMap: Boolean = false): String {
        val thisIsSupremePage = type == TYPE_T || type == TYPE_F

        var supremePageLevelString = ""
        var inferiorPageLevelString = ""

        if (thisIsSupremePage) {
            supremePageLevelString = getFormatedString(this, ignoreBottomTabPositionMap)
        } else {
            inferiorPageLevelString = getFormatedString(this)
            if (this.supremePageLevel != null) {
                supremePageLevelString = getFormatedString(this.supremePageLevel!!, ignoreBottomTabPositionMap)
            }
        }

        return if (inferiorPageLevelString.isNotEmpty()) {
            "$supremePageLevelString-$inferiorPageLevelString"
        } else {
            supremePageLevelString
        }
    }

    /**
     * 更新底部 tab 对应的顶部 tab 位置
     * @param bottomTabPosition 底部 tab 位置 （并不会更新实际的 bottomTabPosition！只是辅助更新 topTabPosition!）
     * @param topTabPosition 顶部 tab 位置
     */
    fun updateTopTabPosition(bottomTabPosition: Int, topTabPosition: Int) {
        if (bottomTabPosition == -1) {
            this.topTabPosition = topTabPosition
        } else {
            this.bottomTopTabPositionMap[bottomTabPosition] = topTabPosition
        }
    }

    /**
     * 基于当前 PageLevel，修改部分值获取一个新的 PageLevel
     */
    fun getTempNewPageLevel(bottomTabPosition: Int, topTabPosition: Int): PageLevel {
        return PageLevel(type, bottomTabPosition, topTabPosition, bottomTopTabPositionMap, inferiorPageCount, supremePageLevel)
    }

    companion object {
        const val TYPE_T = "T" // 顶级 (MainActivity)
        const val TYPE_F = "F" // 顶级 (后台配置首次跳转的页面)
        const val TYPE_P = "P" // 次级 (所有非顶级的页面)

        /**
         * 获取格式化后的字符串
         * @param ignoreBottomTabPositionMap 是否忽略 bottomTopTabPositionMap
         */
        private fun getFormatedString(
            pageLevel: PageLevel,
            ignoreBottomTabPositionMap: Boolean = false
        ): String {
            val thisHasBottomTab = pageLevel.bottomTabPosition != -1

            if (!thisHasBottomTab) {
                return getSinglePageLevelFormattedString(
                    pageLevel.type,
                    -1,
                    pageLevel.topTabPosition,
                    pageLevel.inferiorPageCount
                )
            } else {
                val topTabPosition = if (ignoreBottomTabPositionMap) {
                    pageLevel.topTabPosition
                } else {
                    pageLevel.bottomTopTabPositionMap[pageLevel.bottomTabPosition] ?: -1
                }

                return getSinglePageLevelFormattedString(
                    pageLevel.type,
                    pageLevel.bottomTabPosition,
                    topTabPosition,
                    pageLevel.inferiorPageCount
                )
            }
        }

        /**
         * 获取单个页面级别的格式化字符串
         * @param type 页面级别类型
         * @param bottomTabPosition 底部 tab 位置
         * @param topTabPosition 顶部 tab 位置
         * @param inferiorPageCount 当前页面是第几个次级页面
         */
        private fun getSinglePageLevelFormattedString(
            type: String,
            bottomTabPosition: Int,
            topTabPosition: Int,
            inferiorPageCount: Int
        ): String {
            var formattedString = type

            if (type == TYPE_T || type == TYPE_F) {
                if (bottomTabPosition != -1) {
                    formattedString += "${getHumanReadablePosition(bottomTabPosition)}"
                }
            } else {
                formattedString += "$inferiorPageCount"
            }

            if (topTabPosition != -1) {
                formattedString += "(M${getHumanReadablePosition(topTabPosition)})"
            }
            return formattedString
        }

        private fun getHumanReadablePosition(position: Int): Int {
            return position + 1
        }
    }

}