package cacheApi

import (
	"epur-pay/model"
	"epur-pay/pkg/rds"
	"epur-pay/pkg/utils"
	"fmt"
	"sync"
)

type RolePermission struct {
	Map       *sync.Map
	duplicate *RolePermission
}

type MenuPermission struct {
	RoleId     int64  `gorm:"column:role_id" json:"roleId"`
	Permission string `gorm:"column:permission" json:"permission"`
}

func (p *RolePermission) Refresh() *RolePermission {
	permission := []MenuPermission{}
	utils.Error(rds.DB.Raw(`
		select rm.role_id, permission from role_menu rm inner join menu as m
		on rm .menu_id = m.id
	`).Scan(&permission).Error)

	p.duplicate = &RolePermission{}
	p.duplicate.Map = &sync.Map{}

	for _, v := range permission {
		roleId := fmt.Sprintf("%d", v.RoleId)
		if row, ok := p.duplicate.Map.Load(roleId); ok {
			row = append(row.(model.ArryString), v.Permission)

			p.duplicate.Map.Store(roleId, row)
		} else {
			p.duplicate.Map.Store(roleId, model.ArryString{v.Permission})
		}
	}

	return p.duplicate
}

// 验证是否有权限
func (p *RolePermission) Check(roleAttr model.Arry, permission string) bool {
	// 用户支持多个角色
	for i := range roleAttr {
		if row, ok := p.Map.Load(fmt.Sprintf("%d", roleAttr[i])); ok {
			if row.(model.ArryString).Of(permission) {
				return true
			}
		}
	}

	return false
}