package container

import (
	"encoding/gob"
	"fmt"
	"os"

	"hakurei.app/check"
)

func init() { gob.Register(new(MkdirOp)) }

// Mkdir is a helper for appending [MkdirOp] to [Ops].
func (f *Ops) Mkdir(name *check.Absolute, perm os.FileMode) *Ops {
	*f = append(*f, &MkdirOp{name, perm})
	return f
}

// MkdirOp creates a directory at container Path with permission bits set to Perm.
type MkdirOp struct {
	Path *check.Absolute
	Perm os.FileMode
}

func (m *MkdirOp) Valid() bool                                { return m != nil && m.Path != nil }
func (m *MkdirOp) early(*setupState, syscallDispatcher) error { return nil }
func (m *MkdirOp) apply(_ *setupState, k syscallDispatcher) error {
	return k.mkdirAll(toSysroot(m.Path.String()), m.Perm)
}
func (m *MkdirOp) late(*setupState, syscallDispatcher) error { return nil }

func (m *MkdirOp) Is(op Op) bool {
	vm, ok := op.(*MkdirOp)
	return ok && m.Valid() && vm.Valid() &&
		m.Path.Is(vm.Path) &&
		m.Perm == vm.Perm
}
func (*MkdirOp) prefix() (string, bool) { return "creating", true }
func (m *MkdirOp) String() string       { return fmt.Sprintf("directory %q perm %s", m.Path, m.Perm) }
