package common

import (
	"dbweb/core"
	"encoding/base64"

	"dbweb/lib/lsession"

	"github.com/linlexing/dbx/ddb"

	"time"

	"github.com/linlexing/dbx/data"
)

const modelOnlineUserName = "ONLINEUSER"

type onlineUser struct{}
type online struct{}
type modelOnlineUser struct {
	SID      string    `dbx:"str(50) primary key"`
	UserName string    `dbx:"str(300)"`
	DeptCode string    `dbx:"str(50)"`
	DeptName string    `dbx:"str(300)"`
	LastTime time.Time `dbx:"date"`
}

func (a *online) Get(p *core.ElementHandleArgs) {
	rows := []map[string]interface{}{}
	for _, sinfo := range lsession.GetSessionList() {
		row := map[string]interface{}{
			"SID":      base64.RawStdEncoding.EncodeToString(sinfo.SID),
			"LASTTIME": sinfo.LastTime,
		}
		if vu := lsession.GetSessionValue(sinfo.SID, "$user"); vu != nil {
			var user *core.User
			user = vu.(*core.User)
			row["USERNAME"] = user.Name
			row["DEPTCODE"] = user.Dept.Code
			row["DEPTNAME"] = user.Dept.Name
		} else {
			row["USERNAME"] = nil
			row["DEPTCODE"] = nil
			row["DEPTNAME"] = nil
		}
		rows = append(rows, row)
	}
	if err := ddb.RunAtTx(p.DB, func(db ddb.Txer) error {
		if _, err := db.Exec("delete from ONLINEUSER"); err != nil {
			return err
		}
		tab, err := data.OpenTable(db.DriverName(), db, "ONLINEUSER")
		if err != nil {
			return err
		}
		if err := tab.Insert(rows); err != nil {
			return err
		}
		return nil

	}); err != nil {
		core.LOG.Panic(err)
	}
	p.Redirect(p.User.Sign("/onlineusers"))
}
func init() {
	core.RegisterModel(modelOnlineUser{}, 1, false, modelOnlineUserName)
	core.RegisterBill("OnlineUser", new(onlineUser), modelOnlineUserName)
	core.RegisterFun("Online", new(online))
}
