package fat32

const (
	// FAT32 entries are only 28 bits
	fatMask = 0x0fffffff
	// Free entries are 0
	fatFree = 0x0
	// Entry at the end of a cluster chain
	fatEOF = 0x0ffffff8
)

// FAT32 Boot Sector and BIOS Parameter Block. This structure is 512 bytes long,
// even if the logical block size is longer. The rest should be filled up with
// zeroes.
type bootSector struct {
	// Jump instruction to boot code.
	JmpInstruction [3]byte
	// Creator name. "MSWIN4.1" recommended for compatibility.
	OEMName [8]byte
	// Count of bytes per block (i.e. logical block size)
	// Must be one of 512, 1024, 2048 or 4096
	BlockSize uint16
	// Number of blocks per allocation unit (cluster).
	// Must be a power of 2 that is greater than 0.
	BlocksPerCluster uint8
	// Number of reserved blocks in the reserved region of the volume starting
	// at the first block of the volume. This field must not be 0.
	ReservedBlocks uint16
	// The count of FAT data structures on the volume. This field should always
	// contain the value of 2 for any FAT volume of any type.
	NumFATs uint8
	_       [4]byte
	// Legacy value for media determination, must be 0xf8.
	MediaCode uint8
	_         [2]byte
	// Number of sectors per track for 0x13 interrupts.
	SectorsPerTrack uint16
	// Number of heads for 0x13 interrupts.
	NumHeads uint16
	// Count of hidden blocks preceding the partition that contains this FAT
	// volume.
	HiddenBlocks uint32
	// Total count of blocks on the volume.
	TotalBlocks uint32
	// Count of blocks per FAT.
	BlocksPerFAT uint32
	// Flags for FAT32
	Flags uint16
	_     [2]byte
	// Cluster number of the first cluster of the root directory. Usually 2.
	RootClusterNumber uint32
	// Block number of the FSINFO structure in the reserved area.
	FSInfoBlock uint16
	// Block number of the copy of the boot record in the reserved area.
	BackupStartBlock uint16
	_                [12]byte
	// Drive number for 0x13 interrupts.
	DriveNumber   uint8
	_             [1]byte
	BootSignature uint8
	// ID of this filesystem
	ID uint32
	// Human-readable label of this filesystem, padded with spaces (0x20)
	Label [11]byte
	// Always set to ASCII "FAT32    "
	Type [8]byte
	_    [420]byte
	// Always 0x55, 0xAA
	Signature [2]byte
}

// Special block (usually at block 1) containing additional metadata,
// specifically the number of free clusters and the next free cluster.
// Always 512 bytes, rest of the block should be padded with zeroes.
type fsinfo struct {
	// Validates that this is an FSINFO block. Always 0x52, 0x52, 0x61, 0x41
	LeadSignature [4]byte
	_             [480]byte
	// Another signature. Always 0x72, 0x72, 0x41, 0x61
	StructSignature [4]byte
	// Last known number of free clusters on the volume.
	FreeCount uint32
	// Next free cluster hint. All 1's is interpreted as undefined.
	NextFreeCluster uint32
	_               [14]byte
	// One more signature. Always 0x55, 0xAA.
	TrailingSignature [2]byte
}

// Directory entry
type dirEntry struct {
	// DOS 8.3 file name.
	DOSName [11]byte
	// Attribtes of the file or directory, 0x0f reserved to mark entry as a
	// LFN entry (see lfnEntry below)
	Attributes        uint8
	_                 byte
	CreationTenMilli  uint8 // Actually 10ms units, 0-199 range
	CreationTime      uint16
	CreationDate      uint16
	_                 [2]byte
	FirstClusterHigh  uint16
	LastWrittenToTime uint16
	LastWrittenToDate uint16
	FirstClusterLow   uint16
	FileSize          uint32
}

const (
	// lastSequenceNumberFlag is logically-ORed with the sequence number of the
	// last Long File Name entry to mark it as such.
	lastSequenceNumberFlag = 0x40
	// codepointsPerEntry is the number of UTF-16 codepoints that fit into a
	// single Long File Name entry.
	codepointsPerEntry = 5 + 6 + 2
)

// VFAT long file name prepended entry
type lfnEntry struct {
	SequenceNumber uint8
	// First 5 UTF-16 code units
	NamePart1 [5]uint16
	// Attributes (must be 0x0f)
	Attributes uint8
	_          byte
	// Checksum of the 8.3 name.
	Checksum uint8
	// Next 6 UTF-16 code units
	NamePart2 [6]uint16
	_         [2]byte
	// Next 2 UTF-16 code units
	NamePart3 [2]uint16
}
