package common

import (
	"crypto/sha1"
	"fmt"
	"io/ioutil"
	"sync"

	"github.com/pelletier/go-toml"
)

var (
	users       = map[string]User{}
	limitClient = map[string]int{"_all": 0}
	limitMux    = sync.Mutex{}
)

type User struct {
	Group     string `toml:"group"`
	Username  string `toml:"-"`
	Password  string `toml:"password"`
	OtpSecret string `toml:"otp_secret"`
}

func CheckUser(name, pwd, group string) bool {
	user, ok := users[name]
	if !ok {
		return false
	}
	pwdHash := hashPass(pwd)
	if user.Password == pwdHash {
		return true
	}
	return false
}

func hashPass(pwd string) string {
	sum := sha1.Sum([]byte(pwd))
	return fmt.Sprintf("%x", sum)
}

func LimitClient(name string, close bool) bool {
	limitMux.Lock()
	defer limitMux.Unlock()
	// defer fmt.Println(limitClient)

	_all := limitClient["_all"]
	c, ok := limitClient[name]
	if !ok { // 不存在用户
		limitClient[name] = 0
	}

	if close {
		limitClient[name] = c - 1
		limitClient["_all"] = _all - 1
		return true
	}

	// 全局判断
	if _all >= ServerCfg.MaxClient {
		return false
	}

	// 超出同一个用户限制
	if c >= ServerCfg.MaxUserClient {
		return false
	}

	limitClient[name] = c + 1
	limitClient["_all"] = _all + 1
	return true
}

func loadUser() {
	b, err := ioutil.ReadFile(ServerCfg.UserFile)
	if err != nil {
		panic(err)
	}
	err = toml.Unmarshal(b, &users)
	if err != nil {
		panic(err)
	}

	// 添加用户名
	for k, v := range users {
		v.Username = k
		users[k] = v
	}

	fmt.Println("users:", users)
}