package lscolors

import (
	
)

type feature int

const (
	featureInvalid feature = iota

	featureOrphanedSymlink
	featureSymlink

	featureMultiHardLink

	featureNamedPipe
	featureSocket
	featureDoor
	featureBlockDevice
	featureCharDevice

	featureWorldWritableStickyDirectory
	featureWorldWritableDirectory
	featureStickyDirectory
	featureDirectory

	featureCapability

	featureSetuid
	featureSetgid
	featureExecutable

	featureRegular
)

// Weirdly, permission masks for group and other are missing on platforms other
// than linux, darwin and netbsd. So we replicate some of them here.
const (
	worldWritable = 02   // Writable by other
	executable    = 0111 // Executable
)

func ( string,  bool) (feature, error) {
	,  := os.Lstat()

	if  != nil {
		return featureInvalid, 
	}

	 := .Mode()

	// Symlink and OrphanedSymlink has highest precedence
	if is(, os.ModeSymlink) {
		,  := os.Stat()
		if  != nil {
			return featureOrphanedSymlink, nil
		}
		return featureSymlink, nil
	}

	// featureMultiHardLink
	if  && isMultiHardlink() {
		return featureMultiHardLink, nil
	}

	// type bits features
	switch {
	case is(, os.ModeNamedPipe):
		return featureNamedPipe, nil
	case is(, os.ModeSocket): // Never on Windows
		return featureSocket, nil
	case isDoor():
		return featureDoor, nil
	case is(, os.ModeCharDevice):
		return featureCharDevice, nil
	case is(, os.ModeDevice):
		// There is no dedicated os.Mode* flag for block device. On all
		// supported Unix platforms, when os.ModeDevice is set but
		// os.ModeCharDevice is not, the file is a block device (i.e.
		// syscall.S_IFBLK is set). On Windows, this branch is unreachable.
		//
		// On Plan9, this in inaccurate.
		return featureBlockDevice, nil
	case is(, os.ModeDir):
		// Perm bits features for directory
		 := .Perm()
		switch {
		case is(, os.ModeSticky) && is(, worldWritable):
			return featureWorldWritableStickyDirectory, nil
		case is(, worldWritable):
			return featureWorldWritableDirectory, nil
		case is(, os.ModeSticky):
			return featureStickyDirectory, nil
		default:
			return featureDirectory, nil
		}
	}

	// TODO(xiaq): Support featureCapacity

	// Perm bits features for regular files
	switch {
	case is(, os.ModeSetuid):
		return featureSetuid, nil
	case is(, os.ModeSetgid):
		return featureSetgid, nil
	case &executable != 0:
		return featureExecutable, nil
	}

	// Check extension
	return featureRegular, nil
}

func (,  os.FileMode) bool {
	return & == 
}