package sftp

// Methods on the Request object to make working with the Flags bitmasks and
// Attr(ibutes) byte blob easier. Use Pflags() when working with an Open/Write
// request and AttrFlags() and Attributes() when working with SetStat requests.
import "os"

// FileOpenFlags defines Open and Write Flags. Correlate directly with with os.OpenFile flags
// (https://golang.org/pkg/os/#pkg-constants).
type FileOpenFlags struct {
	Read, Write, Append, Creat, Trunc, Excl bool
}

func newFileOpenFlags(flags uint32) FileOpenFlags {
	return FileOpenFlags{
		Read:   flags&sshFxfRead != 0,
		Write:  flags&sshFxfWrite != 0,
		Append: flags&sshFxfAppend != 0,
		Creat:  flags&sshFxfCreat != 0,
		Trunc:  flags&sshFxfTrunc != 0,
		Excl:   flags&sshFxfExcl != 0,
	}
}

// Pflags converts the bitmap/uint32 from SFTP Open packet pflag values,
// into a FileOpenFlags struct with booleans set for flags set in bitmap.
func (r *Request) Pflags() FileOpenFlags {
	return newFileOpenFlags(r.Flags)
}

// FileAttrFlags that indicate whether SFTP file attributes were passed. When a flag is
// true the corresponding attribute should be available from the FileStat
// object returned by Attributes method. Used with SetStat.
type FileAttrFlags struct {
	Size, UidGid, Permissions, Acmodtime bool
}

func newFileAttrFlags(flags uint32) FileAttrFlags {
	return FileAttrFlags{
		Size:        (flags & sshFileXferAttrSize) != 0,
		UidGid:      (flags & sshFileXferAttrUIDGID) != 0,
		Permissions: (flags & sshFileXferAttrPermissions) != 0,
		Acmodtime:   (flags & sshFileXferAttrACmodTime) != 0,
	}
}

// AttrFlags returns a FileAttrFlags boolean struct based on the
// bitmap/uint32 file attribute flags from the SFTP packaet.
func (r *Request) AttrFlags() FileAttrFlags {
	return newFileAttrFlags(r.Flags)
}

// FileMode returns the Mode SFTP file attributes wrapped as os.FileMode
func (a FileStat) FileMode() os.FileMode {
	return os.FileMode(a.Mode)
}

// Attributes parses file attributes byte blob and return them in a
// FileStat object.
func (r *Request) Attributes() *FileStat {
	fs, _ := getFileStat(r.Flags, r.Attrs)
	return fs
}
