/**
# Copyright (c) 2024, HCUOpt CORPORATION.  All rights reserved.
**/

package discover

import (
	"dcu-container-toolkit/internal/info"
	"dcu-container-toolkit/internal/logger"
	"os/user"
	"strconv"
)

type userGroup struct {
	None
	logger logger.Interface
	groups []string
}

var _ Discover = (*userGroup)(nil)

// NewUserGroupDiscover
func NewUserGroupDiscover(logger logger.Interface, groups ...string) Discover {
	if len(groups) == 0 {
		grps, err := info.GetAdditionalGroups()
		if err != nil {
			logger.Warningf("failed to get groups: %v", err)
		}
		groups = append(groups, grps...)
	}
	return &userGroup{
		logger: logger,
		groups: groups,
	}
}

func (g *userGroup) AdditionalGIDs() ([]uint32, error) {
	var gids []uint32

	for _, group := range g.groups {
		gid, err := GetGid(group)
		if err != nil {
			g.logger.Warningf("Failed to get group id: %s, %v", gid, err)
			continue
		}
		gids = append(gids, uint32(gid))
	}

	return gids, nil
}

func GetGid(group string) (int, error) {
	g, err := user.LookupGroup(group)
	if err != nil {
		return -1, err
	}

	return strconv.Atoi(g.Gid)
}
