package nfs

import (
	"github.com/willscott/go-nfs-client/nfs/rpc"
)

// FHSize is the maximum size of a FileHandle
const FHSize = 64

// MNTNameLen is the maximum size of a mount name
const MNTNameLen = 255

// MntPathLen is the maximum size of a mount path
const MntPathLen = 1024

// FileHandle maps to a fhandle3
type FileHandle []byte

// MountStatus defines the response to the Mount Procedure
type MountStatus uint32

// MountStatus Codes
const (
	MountStatusOk             MountStatus = 0
	MountStatusErrPerm        MountStatus = 1
	MountStatusErrNoEnt       MountStatus = 2
	MountStatusErrIO          MountStatus = 5
	MountStatusErrAcces       MountStatus = 13
	MountStatusErrNotDir      MountStatus = 20
	MountStatusErrInval       MountStatus = 22
	MountStatusErrNameTooLong MountStatus = 63
	MountStatusErrNotSupp     MountStatus = 10004
	MountStatusErrServerFault MountStatus = 10006
)

// MountProcedure is the valid RPC calls for the mount service.
type MountProcedure uint32

// MountProcedure Codes
const (
	MountProcNull MountProcedure = iota
	MountProcMount
	MountProcDump
	MountProcUmnt
	MountProcUmntAll
	MountProcExport
)

func (m MountProcedure) String() string {
	switch m {
	case MountProcNull:
		return "Null"
	case MountProcMount:
		return "Mount"
	case MountProcDump:
		return "Dump"
	case MountProcUmnt:
		return "Umnt"
	case MountProcUmntAll:
		return "UmntAll"
	case MountProcExport:
		return "Export"
	default:
		return "Unknown"
	}
}

// AuthFlavor is a form of authentication, per rfc1057 section 7.2
type AuthFlavor uint32

// AuthFlavor Codes
const (
	AuthFlavorNull  AuthFlavor = 0
	AuthFlavorUnix  AuthFlavor = 1
	AuthFlavorShort AuthFlavor = 2
	AuthFlavorDES   AuthFlavor = 3
)

// MountRequest contains the format of a client request to open a mount.
type MountRequest struct {
	rpc.Header
	Dirpath []byte
}

// MountResponse is the server's response with status `MountStatusOk`
type MountResponse struct {
	rpc.Header
	FileHandle
	AuthFlavors []int
}