package authority

import (
	"encoding/json"
	teaconst "github.com/TeaOSLab/EdgeAPI/internal/const"
	_ "github.com/go-sql-driver/mysql"
	"github.com/iwind/TeaGo/Tea"
	"github.com/iwind/TeaGo/dbs"
	timeutil "github.com/iwind/TeaGo/utils/time"
	"time"
)

type AuthorityKeyDAO dbs.DAO

func NewAuthorityKeyDAO() *AuthorityKeyDAO {
	return dbs.NewDAO(&AuthorityKeyDAO{
		DAOObject: dbs.DAOObject{
			DB:     Tea.Env,
			Table:  "edgeAuthorityKeys",
			Model:  new(AuthorityKey),
			PkName: "id",
		},
	}).(*AuthorityKeyDAO)
}

var SharedAuthorityKeyDAO *AuthorityKeyDAO

func init() {
	dbs.OnReady(func() {
		SharedAuthorityKeyDAO = NewAuthorityKeyDAO()

		// 初始化IsPlus值
		_, _ = SharedAuthorityKeyDAO.IsPlus(nil)
	})
}

// UpdateKey 设置Key
func (this *AuthorityKeyDAO) UpdateKey(tx *dbs.Tx, value string, dayFrom string, dayTo string, hostname string, macAddresses []string, company string) error {
	one, err := this.Query(tx).
		AscPk().
		Find()
	if err != nil {
		return err
	}
	op := NewAuthorityKeyOperator()
	if one != nil {
		op.Id = one.(*AuthorityKey).Id
	}
	op.Value = value
	op.DayFrom = dayFrom
	op.DayTo = dayTo
	op.Hostname = hostname

	if len(macAddresses) == 0 {
		macAddresses = []string{}
	}
	macAddressesJSON, err := json.Marshal(macAddresses)
	if err != nil {
		return err
	}

	op.MacAddresses = macAddressesJSON
	op.Company = company
	op.UpdatedAt = time.Now().Unix()

	return this.Save(tx, op)
}

// ReadKey 读取Key
func (this *AuthorityKeyDAO) ReadKey(tx *dbs.Tx) (key *AuthorityKey, err error) {
	one, err := this.Query(tx).
		AscPk().
		Find()
	if err != nil {
		return nil, err
	}
	if one == nil {
		return nil, nil
	}
	key = one.(*AuthorityKey)

	// 顺便更新相关变量
	if key.DayTo >= timeutil.Format("Y-m-d") {
		teaconst.IsPlus = true
	}

	return
}

// ResetKey 重置Key
func (this *AuthorityKeyDAO) ResetKey(tx *dbs.Tx) error {
	_, err := this.Query(tx).
		Delete()
	return err
}

// IsPlus 判断是否为企业版
func (this *AuthorityKeyDAO) IsPlus(tx *dbs.Tx) (bool, error) {
	key, err := this.ReadKey(tx)
	if err != nil {
		return false, err
	}
	if key == nil {
		return false, nil
	}
	teaconst.IsPlus = key.DayTo >= timeutil.Format("Y-m-d")
	return teaconst.IsPlus, nil
}
