package group

import "github.com/netbirdio/netbird/management/server/integration_reference"

const (
	GroupIssuedAPI         = "api"
	GroupIssuedJWT         = "jwt"
	GroupIssuedIntegration = "integration"
)

// Group of the peers for ACL
type Group struct {
	// ID of the group
	ID string

	// AccountID is a reference to Account that this object belongs
	AccountID string `json:"-" gorm:"index"`

	// Name visible in the UI
	Name string

	// Issued defines how this group was created (enum of "api", "integration" or "jwt")
	Issued string

	// Peers list of the group
	Peers []string `gorm:"serializer:json"`

	IntegrationReference integration_reference.IntegrationReference `gorm:"embedded;embeddedPrefix:integration_ref_"`
}

// EventMeta returns activity event meta related to the group
func (g *Group) EventMeta() map[string]any {
	return map[string]any{"name": g.Name}
}

func (g *Group) Copy() *Group {
	group := &Group{
		ID:                   g.ID,
		Name:                 g.Name,
		Issued:               g.Issued,
		Peers:                make([]string, len(g.Peers)),
		IntegrationReference: g.IntegrationReference,
	}
	copy(group.Peers, g.Peers)
	return group
}

// HasPeers checks if the group has any peers.
func (g *Group) HasPeers() bool {
	return len(g.Peers) > 0
}

// IsGroupAll checks if the group is a default "All" group.
func (g *Group) IsGroupAll() bool {
	return g.Name == "All"
}

// AddPeer adds peerID to Peers if not present, returning true if added.
func (g *Group) AddPeer(peerID string) bool {
	if peerID == "" {
		return false
	}

	for _, itemID := range g.Peers {
		if itemID == peerID {
			return false
		}
	}

	g.Peers = append(g.Peers, peerID)
	return true
}

// RemovePeer removes peerID from Peers if present, returning true if removed.
func (g *Group) RemovePeer(peerID string) bool {
	for i, itemID := range g.Peers {
		if itemID == peerID {
			g.Peers = append(g.Peers[:i], g.Peers[i+1:]...)
			return true
		}
	}
	return false
}