package com.gamedog.vididin.core.login.login import com.ama.core.architecture.util.AndroidUtil import com.ama.core.architecture.util.DateUtil import com.ama.core.architecture.util.DeviceUtil import com.ama.core.architecture.util.SpUtil import com.ama.core.architecture.util.eventbus.NotifyMan import com.gamedog.vididin.VidiConst import com.gamedog.vididin.VididinEvents import com.gamedog.vididin.beans.Account import com.gamedog.vididin.beans.BankInfo import kotlinx.coroutines.sync.Mutex object AccountManager { private val mutex = Mutex() init { NotifyMan.instance().register(object: NotifyMan.ICallback(true) { override fun onEvent(data: NotifyMan.NotifyData<*>?) { when (data?.mEventType) { VididinEvents.EVENT_AD_WATCHED_FOR_ZEROBUY_EARN_DIAMOND -> { addDiamond(VidiConst.DIAMOND_NUM_FOR_ONE_AD) } } } }, VididinEvents.EVENT_AD_WATCHED_FOR_ZEROBUY_EARN_DIAMOND) } private val mAccount: Account? by lazy { var account = SpUtil.instance().getObject(SpUtil.KEY_ACCOUNT) if (account == null) { val deviceUUId = DeviceUtil.generateDeviceId() account = Account(accountId = "user_$deviceUUId", deviceUUId=deviceUUId, createdAt = DateUtil.getCurTimeMs()) account.let { SpUtil.instance().putObject(SpUtil.KEY_ACCOUNT, account) } } account } private fun saveAccountInfo() { SpUtil.instance().putObject(SpUtil.KEY_ACCOUNT, mAccount) } fun getAccount() : Account? { return mAccount } fun getGold(): Long { return mAccount?.goldCount ?: 0L } fun getCash(): Float { return mAccount?.cashCount ?: 0F } @Synchronized fun addGold(newGold: Int) { mAccount?.goldCount += newGold saveAccountInfo() NotifyMan.instance().sendEvent(VididinEvents.Event_Account_Gold_Changed, null) } @Synchronized private fun addDiamond(diamondNum: Int) { mAccount?.diamondCount += diamondNum saveAccountInfo() NotifyMan.instance().sendEvent(VididinEvents.Event_Account_Diamond_Changed, null) } @Synchronized fun adjustAccountCash(newCash: Float): Boolean { val result = false mAccount?.let { val newCashTotal = it.cashCount + newCash if (newCashTotal >= 0F) { it.cashCount = newCashTotal saveAccountInfo() NotifyMan.instance().sendEvent(VididinEvents.Event_Account_Cash_Changed, null) return true } } return result } fun getBankInfo(): BankInfo? { return mAccount?.bankInfo } fun hasValidBankInfo(): Boolean { val backInfo = getBankInfo() return !backInfo?.bankName.isNullOrEmpty() && !backInfo.bankAccount.isNullOrEmpty() } fun saveBankAccount(bankAccount: String?) { if (bankAccount.isNullOrEmpty()) { mAccount?.bankInfo = null } else { mAccount?.bankInfo = BankInfo(bankAccount=bankAccount) } saveAccountInfo() NotifyMan.instance().sendEvent( VididinEvents.Event_Account_Bank_Info_Changed, NotifyMan.NotifyData(bankAccount)) } @Synchronized fun convertGold2Cash(): Boolean { try { val couldCovertCashTotal = mAccount?.goldCount?.div(VidiConst.PER_01CASH_COST_GOLD_NUM) ?: 0 if (couldCovertCashTotal > 0) { val costGoldNum = couldCovertCashTotal * VidiConst.PER_01CASH_COST_GOLD_NUM mAccount?.goldCount?.let { if (it >= costGoldNum) { addGold(-1 * costGoldNum.toInt()) adjustAccountCash(couldCovertCashTotal * 0.1F) AndroidUtil.showToast("Has convert $costGoldNum gold to $couldCovertCashTotal cash.") return true } } } else { AndroidUtil.showToast("You don't have enough gold.") } } catch (e: Exception) { e.printStackTrace() } return false } fun saveUserIdInfo(userId: Int) { mAccount?.let { it.userId = userId saveAccountInfo() } } fun isBankAccountExist(): Boolean { return !mAccount?.bankInfo?.bankAccount.isNullOrEmpty() } fun adjustDiamond(diamondCost: Int): Boolean { mAccount?.let { if (it.diamondCount >= diamondCost) { it.diamondCount -= diamondCost saveAccountInfo() NotifyMan.instance().sendEvent(VididinEvents.Event_Account_Diamond_Changed, null) return true } } return false } }