package main

import (
	//	"encoding/json"
	"errors"
	"go.uber.org/zap"

	"../log"
	"../nnet"
	//	"fmt"
	//	"time"
	"../nt"
	//	"go.uber.org/zap"
	"../utils"
)

var (
	ErrNoMoreData = errors.New("data is not enough")
)

type LoginClientStatus struct {
	VerifyTimeout *utils.NvStore // 用户等待 login 的返回超时队列，如果返回，就取消超时，否则，客户端会按照超时处理
}

func NewLoginClientStatus() *LoginClientStatus {
	return &LoginClientStatus{VerifyTimeout: utils.NewNvStore()}
}

// @return: omitted for now
func (self *LoginClientStatus) OnConnected(ses nnet.ISession) (bool, int32) {
	ses.UpdateId(1)
	return true, 0
}

//TODO 和 login 断开后报警并自动重连
// 重连若干次后根据成功或失败继续产生报警
func (self *LoginClientStatus) OnClosed(ses nnet.ISession, reason int32) {
	log.Debug("LoginClientStatus.OnClosed", zap.Int("sesNum", Login.GetSessionNum()), zap.Int32("reason", reason))
	// reconnect
	ChReconn <- 0

	Ev.OnLoginLostConnection(nt.InstConf.Id, ses.GetRawConn().RemoteAddr().String())
}

func (self *LoginClientStatus) OnMessage(ses nnet.ISession, pkt nnet.IPacket) bool {
	lpkt, ok := pkt.(*LoginPacket)
	if !ok {
		log.Error("IPacket is not LoginPacket interface")
		return false
	}
	login_dispatch(ses, lpkt)
	return true
}

func (self *LoginClientStatus) OnHeartbeat(ses nnet.ISession) bool {
	if Online != 0 {
		LoginPostStatus(ses)
	}

	return true
}
