package main

import (
	"encoding/json"
	"os"
	"path"

	"git.gensokyo.uk/security/fortify/internal/fmsg"
)

type payloadU struct {
	UserName      string   `json:"userName"`
	Uid           int      `json:"uid"`
	Gid           int      `json:"gid"`
	MemberOf      []string `json:"memberOf,omitempty"`
	RealName      string   `json:"realName"`
	HomeDirectory string   `json:"homeDirectory"`
	Shell         string   `json:"shell"`
}

func writeUser(userName string, uid int, us string, realName, homeDirectory, shell string, out string) {
	userFileName := userName + ".user"
	if f, err := os.OpenFile(path.Join(out, userFileName), os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644); err != nil {
		fmsg.Fatalf("cannot create %s: %v", userName, err)
	} else if err = json.NewEncoder(f).Encode(&payloadU{
		UserName:      userName,
		Uid:           uid,
		Gid:           uid,
		RealName:      realName,
		HomeDirectory: homeDirectory,
		Shell:         shell,
	}); err != nil {
		fmsg.Fatalf("cannot serialise %s: %v", userName, err)
	} else if err = f.Close(); err != nil {
		fmsg.Printf("cannot close %s: %v", userName, err)
	}
	if err := os.Symlink(userFileName, path.Join(out, us+".user")); err != nil {
		fmsg.Fatalf("cannot link %s: %v", userName, err)
	}
}

type payloadG struct {
	GroupName string   `json:"groupName"`
	Gid       int      `json:"gid"`
	Members   []string `json:"members,omitempty"`
}

func writeGroup(groupName string, gid int, gs string, members []string, out string) {
	groupFileName := groupName + ".group"
	if f, err := os.OpenFile(path.Join(out, groupFileName), os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644); err != nil {
		fmsg.Fatalf("cannot create %s: %v", groupName, err)
	} else if err = json.NewEncoder(f).Encode(&payloadG{
		GroupName: groupName,
		Gid:       gid,
		Members:   members,
	}); err != nil {
		fmsg.Fatalf("cannot serialise %s: %v", groupName, err)
	} else if err = f.Close(); err != nil {
		fmsg.Printf("cannot close %s: %v", groupName, err)
	}
	if err := os.Symlink(groupFileName, path.Join(out, gs+".group")); err != nil {
		fmsg.Fatalf("cannot link %s: %v", groupName, err)
	}
}