package auth

import (
	"github.com/kami/maven/internal/ipc"
)

// Scope — the resolved authority of a caller. Built by Enrollment *once*
// when a connection is accepted (or once per call, depending on impl), then
// threaded through Check → Can as pure data. The impure part (looking up the
// module enrollment table from ipc.Caller Uid+Pid) ends at the Enrollment
// boundary; everything downstream is pure.
type Scope struct {
	// Surface — the channel the caller entered through. Caps the layer.
	Surface Surface

	// Module — the enrolled module name ("tts", "poll:healthcheck",
	// "router", "telegram-relay", ""). "" ⇒ unenrolled; Check refuses.
	// The daemon's in-process path sets "core" by convention.
	Module string

	// SourceScope — the sources this module may WriteFact under. The spec's
	// exact "compromised poller can't forge a trigger" guard: a module
	// only writes sources it owns. The floor enrollment grants "*"
	// (anything); a real enrollment scopes a poller to one source prefix.
	// Empty slice ⇒ refuse all writes (fail closed); the daemon never sets
	// this empty for an enrolled caller.
	SourceScope []string
}

// Lookup — the Enroller's input: ipc.Caller when present (Uid/Pid from
// SO_PEERCRED on the socket), or the zero value for in-process (no Caller
// attached to ctx — the daemon treats this as SurfaceCoreProcess, "core").
type Lookup struct {
	// Caller — when CallerFrom(ctx) is absent (the in-process path), this is
	// the zero ipc.Caller. The Enrollment floor returns SurfaceCoreProcess in
	// that case.
	Caller    ipc.Caller
	HasCaller bool
}
