package model

import (
	"fmt"
	"math"
)

const (
	LoginPlatAccount = "h5"
	LoginPlatWeiXin  = "wx"
	LoginPlatQQ      = "qq"
	LoginPlatTouTiao = "tt"
	LoginPlatMgc     = "mt"
	LoginPlatQuick   = "QuickSDK"
)

const (
	CostSourceFortLevel          = 1  //联盟升级
	CostSourceEnterChapter       = 2  //进入章节
	CostSourcePartRuneLevel      = 3  //符文升级
	CostSourcePartRuneRecast     = 4  //符文重铸
	CostSourceHeroLevel          = 5  //英雄升级
	CostSourceTreasureLevel      = 6  //宝物升级
	CostSourceTreasureStar       = 7  //宝物升星
	CostSourceHeroRecruit        = 8  //英雄招募
	CostSourceTreasureRecruit    = 9  //宝物招募
	CostSourceEpigraphRecruit    = 10 //铭文招募
	CostSourcePointsRecruit      = 11 //积分招募
	CostSourceRuneDisintegration = 12 //符文分解
	CostSourceHeroBuy            = 13 //购买英雄
	CostSourceHeroSkinActive     = 14 //英雄皮肤兑换
	CostSourceAdmin              = 15 //后台添加
	CostItemBuy                  = 16 //游戏货币购买道具
	CostSourceChapterSettle      = 17 // 章节结算
	CostSourceEmojiUnlock        = 18 //表情解锁
	CostSourceLegendReset        = 19 //铭文重铸
	CostSourceLegendExcelIn      = 20 //铭文精通
	CostSourcePatrol             = 21 //巡逻
	CostSourceTask               = 22 //任务
	CostSourceDrawLetterExtra    = 23 //邮件
	CostSourceUnlock             = 24 //解锁
	CostSourcePlayerLevelUp      = 25 //玩家升级
	CostSourceRefreshShop        = 26 //刷新商店
	CostSourceShopBuy            = 27 //商店购买商品
	CostSourceUseBox             = 28 //开箱子
	CostSourceActivities         = 29 //精彩活动
	CostSourcePayBuy             = 30 //充值
	CostSourceInviteFriend       = 31 //邀请好友
	CostSourceSevenDayTask       = 32 //七日任务
	CostSourceGacha              = 33 //扭蛋
	CostSourceHuntTreasure       = 34 //寻宝
	CostSourceFirstCharge        = 35 //首充
	CostSourceWarOrder           = 36 //战令
	CostSourceSevenDaySignIn     = 37 //7日签到
	CostSourceDailyDeal          = 38 //每日特惠
	CostSourceDiscountPack       = 39 //特惠礼包
	CostSourceFriendGive         = 40 //好友赠送体力
)

const (
	LineBit  = 12
	LineMask = 0x0fff
)

func CalcDocId2(dbId int64, line int64) int64 {
	return (dbId << LineBit) + int64(line)
}

func SplitDocId(docId int64) (dbId int64, line int) {

	// 分离出 dbId 和 line
	dbId = (docId >> LineBit) & math.MaxInt64 // 这里使用右移和位与操作来提取 dbId

	line = int(docId & LineMask)
	return
}

type VersionControl struct {
	Version string `json:"version"`
}

type PlatGroup struct {
	GId         int       `json:"id"`
	Plats       []string  `json:"group"`
	ChangeItems [][]int64 `json:"change"`
}

// SumMaterialToSlice 材料信息切片到map的转换
func SumMaterialToMap(materials [][]int64) (map[int64]int64, error) {
	if len(materials) == 0 {
		return make(map[int64]int64), nil
	}

	costMap := make(map[int64]int64)
	for _, v := range materials {
		if len(v) != 2 {
			return nil, fmt.Errorf("material slice must have length of 2, but got %d", len(v))
		}
		costMap[v[0]] += v[1] // 使用 += 操作符更简洁
	}
	return costMap, nil
}

// func ExtractLineId(docId int64) int {
// 	return int(docId & LineMask)
// }

// 合并同种材料
// func MergeSameMaterials(lst []*MaterialData) []*MaterialData {
// 	ret := make([]*MaterialData, 0)
// 	for _, v := range lst {
// 		isOk := false
// 		for _, vv := range ret {
// 			if vv.ID == v.ID {
// 				vv.Count += v.Count
// 				isOk = true
// 				break
// 			}
// 		}
// 		if !isOk {
// 			tmp := &MaterialData{ID: v.ID, Count: v.Count}
// 			ret = append(ret, tmp)
// 		}
// 	}
// 	return ret
// }
