// Copyright The Monogon Project Authors.
// SPDX-License-Identifier: Apache-2.0

package fat32

import (
	"fmt"
	"io"
	"time"
)

// Wraps a writer and provides support for writing padding up to a specified
// alignment.
type blockWriter struct {
	w io.Writer
	n int64
}

func newBlockWriter(w io.Writer) *blockWriter {
	return &blockWriter{w: w}
}

func (b *blockWriter) Write(p []byte) (n int, err error) {
	n, err = b.w.Write(p)
	b.n += int64(n)
	return
}

func (b *blockWriter) ReadFrom(r io.Reader) (n int64, err error) {
	// io.Copy forwards to b.w.ReadFrom if available.
	n, err = io.Copy(b.w, r)
	b.n += n
	return
}

func (b *blockWriter) FinishBlock(alignment int64, mustZero bool) (err error) {
	requiredBytes := (alignment - (b.n % alignment)) % alignment
	if requiredBytes == 0 {
		return nil
	}
	// Do not actually write out zeroes if not necessary
	if s, ok := b.w.(io.Seeker); ok && !mustZero {
		if _, err := s.Seek(requiredBytes-1, io.SeekCurrent); err != nil {
			return fmt.Errorf("failed to seek to create hole for empty block: %w", err)
		}
		if _, err := b.w.Write([]byte{0x00}); err != nil {
			return fmt.Errorf("failed to write last byte to create hole: %w", err)
		}
		b.n += requiredBytes
		return
	}
	emptyBuf := make([]byte, 1*1024*1024)
	for requiredBytes > 0 {
		curBlockBytes := requiredBytes
		if curBlockBytes > int64(len(emptyBuf)) {
			curBlockBytes = int64(len(emptyBuf))
		}
		_, err = b.Write(emptyBuf[:curBlockBytes])
		if err != nil {
			return
		}
		requiredBytes -= curBlockBytes
	}
	return
}

// timeToMsDosTime converts a time.Time to an MS-DOS date and time.
// The resolution is 2s with fTime and 10ms if fTenMils is also used.
// See: http://msdn.microsoft.com/en-us/library/ms724274(v=VS.85).aspx
func timeToMsDosTime(t time.Time) (fDate uint16, fTime uint16, fTenMils uint8) {
	t = t.In(time.UTC)
	if t.Year() < 1980 {
		t = time.Date(1980, 1, 1, 0, 0, 0, 0, time.UTC)
	}
	if t.Year() > 2107 {
		t = time.Date(2107, 12, 31, 23, 59, 59, 0, time.UTC)
	}
	fDate = uint16(t.Day() + int(t.Month())<<5 + (t.Year()-1980)<<9)
	fTime = uint16(t.Second()/2 + t.Minute()<<5 + t.Hour()<<11)
	fTenMils = uint8(t.Nanosecond()/1e7 + (t.Second()%2)*100)
	return
}
