package tool

import (
	"bytes"
	"encoding/base64"
	"encoding/json"
	"github.com/PandaXGO/PandaKit/biz"
	"github.com/google/uuid"
	"gorm.io/gorm"
	"math/rand"
	"pandax/apps/system/entity"
	"pandax/apps/system/services"
	"pandax/pkg/global"
	"strconv"
	"strings"
	"time"
)

type DeviceAuth struct {
	Owner       string `json:"owner"`
	OrgId       int64  `json:"orgId"`
	DeviceId    string `json:"device_id"`
	DeviceType  string `json:"device_type"`
	ProductId   string `json:"product_id"`
	RuleChainId string `json:"rule_chain_id"`
	Name        string `json:"name"`
	Token       string `json:"token"`
	CreatedAt   int64  `json:"created_at"`
	ExpiredAt   int64  `json:"expired_at"`
}

func (entity *DeviceAuth) CreateDeviceToken(key string) (err error) {
	return global.RedisDb.Set(key, entity.GetMarshal(), time.Hour*24*365)
}

func (entity *DeviceAuth) GetDeviceToken(key string) error {
	if err := global.RedisDb.Get(key, entity); err != nil {
		return err
	}
	return nil
}

func (token *DeviceAuth) MD5ID() string {
	buf := bytes.NewBufferString(token.DeviceId)
	buf.WriteString(token.DeviceType)
	buf.WriteString(strconv.FormatInt(token.CreatedAt, 10))
	access := base64.URLEncoding.EncodeToString([]byte(uuid.NewMD5(uuid.Must(uuid.NewRandom()), buf.Bytes()).String()))
	access = strings.TrimRight(access, "=")
	return access
}
func (token *DeviceAuth) GetMarshal() string {
	marshal, _ := json.Marshal(*token)
	return string(marshal)
}

func (token *DeviceAuth) GetUnMarshal(data []byte) error {
	return json.Unmarshal(data, token)
}

// 序列化
func (m *DeviceAuth) MarshalBinary() (data []byte, err error) {
	return json.Marshal(m)
}

// 反序列化
func (m *DeviceAuth) UnmarshalBinary(data []byte) error {
	return json.Unmarshal(data, m)
}

func OrgAuthSet(tx *gorm.DB, roleId int64, owner string) {
	if roleId == 0 {
		return
	}
	//TODO 使用缓存
	role, err := services.SysRoleModelDao.FindOrganizationsByRoleId(roleId)
	biz.ErrIsNil(err, "查询角色数据权限失败")
	if role.DataScope != entity.SELFDATASCOPE {
		biz.IsTrue(len(role.Org) > 0, "该角色下未分配组织权限")
		tx.Where("org_id in (?)", strings.Split(role.Org, ","))
	} else {
		tx.Where("owner = ?", owner)
	}
}
func GenerateID() string {
	rand.Seed(time.Now().UnixNano())
	id := make([]byte, 7) // 由于base64编码会增加字符数，这里使用7个字节生成10位ID
	_, err := rand.Read(id)
	if err != nil {
		panic(err) // 错误处理，根据实际情况进行处理
	}
	return base64.URLEncoding.EncodeToString(id)[:10]
}
