package chesstitians

import (
	rule "mongo.games.com/game/gamerule/chess"
	"mongo.games.com/game/gamesrv/base"
	"mongo.games.com/game/model"
	"time"
)

// PlayerEx 玩家身上的额外数据
type PlayerEx struct {
	*base.Player      // 玩家信息
	isBlack      bool // 黑棋（默认是白棋先手）
	nextPlay     bool // 是否再来一局

	winCoin    int64 // 本局赢的钱
	taxCoin    int64 // 本局税收
	isWin      int32 // 本局输赢 1赢 2输 0平
	winTimes   int32 // 连赢次数
	otherScore int32 // 额外积分
	nextRank   int32 // 再赢几局晋级
	winScore   int32 // 本局积分变化
	oldGrade   int64 // 原来的积分
	totalTime  int64 // 下棋总时长
	lastTime   time.Time
}

func (p *PlayerEx) init() {
	p.winCoin = 0
	p.isBlack = false
	p.nextPlay = false
	p.oldGrade = 0
	p.totalTime = 0
	p.lastTime = time.Time{}
	if !p.GetScene().IsMatchScene() && !p.GetScene().IsPrivateScene() { //非比赛场 非私有房间
		p.LoadPlayerGameInfo(p.GetScene().KeyGameId)
	}
}

func (p *PlayerEx) Clear() {
	p.winCoin = 0
	p.isBlack = false
	p.nextPlay = false
	p.oldGrade = 0
	p.totalTime = 0
	p.lastTime = time.Time{}
	p.MarkFlag(base.PlayerState_WaitNext)
}

func (p *PlayerEx) CanOp() bool {
	if p.IsGameing() {
		return true
	}
	return false
}

func (p *PlayerEx) LoadPlayerGameInfo(keyGameId string) {
	if p.IsRob {
		return
	}
	if p.GDatas == nil {
		p.GDatas = make(map[string]*model.PlayerGameInfo)
	}
	if data, exist := p.GDatas[keyGameId]; !exist {
		data = new(model.PlayerGameInfo)
		data.Statics.TotalOut = 920000
		data.Statics.TotalIn = 1000000
		p.GDatas[keyGameId] = data
	}
}

// GetTotalTime 获取玩家总下棋消耗的操作时长，单位秒
func (p *PlayerEx) GetTotalTime() int32 {
	if s := p.GetScene(); s != nil && s.GetSceneState().GetState() == rule.SceneStatePlayerOp && p.IsGameing() {
		if ex, ok := s.ExtraData.(*SceneEx); ok {
			if ex.GetCurOpPos() == p.Pos {
				return p.getTotalTime()
			} else {
				return int32(p.totalTime)
			}
		}
	}
	return 0
}

func (p *PlayerEx) getTotalTime() int32 {
	return int32(p.totalTime + int64(time.Now().Sub(p.lastTime).Seconds()))
}
