package models

import (
	"git.solsynth.dev/hypernet/nexus/pkg/nex"
	"git.solsynth.dev/hypernet/passport/pkg/proto"
	"gorm.io/datatypes"
)

type Realm struct {
	BaseModel

	Alias        string            `json:"alias" gorm:"uniqueIndex"`
	Name         string            `json:"name"`
	Description  string            `json:"description"`
	Members      []RealmMember     `json:"members"`
	Avatar       *string           `json:"avatar"`
	Banner       *string           `json:"banner"`
	AccessPolicy datatypes.JSONMap `json:"access_policy"`
	IsPublic     bool              `json:"is_public"`
	IsCommunity  bool              `json:"is_community"`
	AccountID    uint              `json:"account_id"`
}

func NewRealmFromProto(proto *proto.RealmInfo) Realm {
	return Realm{
		BaseModel: BaseModel{
			ID: uint(proto.GetId()),
		},
		Alias:        proto.GetAlias(),
		Name:         proto.GetName(),
		Description:  proto.GetDescription(),
		Avatar:       &proto.Avatar,
		Banner:       &proto.Banner,
		IsPublic:     proto.GetIsPublic(),
		IsCommunity:  proto.GetIsCommunity(),
		AccessPolicy: nex.DecodeMap(proto.GetAccessPolicy()),
	}
}

type RealmMember struct {
	BaseModel

	RealmID    uint    `json:"realm_id"`
	AccountID  uint    `json:"account_id"`
	Realm      Realm   `json:"realm"`
	Account    Account `json:"account"`
	PowerLevel int     `json:"power_level"`
}

func NewRealmMemberFromProto(proto *proto.RealmMemberInfo) RealmMember {
	return RealmMember{
		BaseModel: BaseModel{
			ID: uint(proto.GetId()),
		},
		RealmID:    uint(proto.GetRealmId()),
		AccountID:  uint(proto.GetUserId()),
		PowerLevel: int(proto.GetPowerLevel()),
	}
}