// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.

package shared

import (
	"errors"
	"io"
)

type SectionWriter struct {
	Count    int64
	Offset   int64
	Position int64
	WriterAt io.WriterAt
}

func NewSectionWriter(c io.WriterAt, off int64, count int64) *SectionWriter {
	return &SectionWriter{
		Count:    count,
		Offset:   off,
		WriterAt: c,
	}
}

func (c *SectionWriter) Write(p []byte) (int, error) {
	remaining := c.Count - c.Position

	if remaining <= 0 {
		return 0, errors.New("end of section reached")
	}

	slice := p

	if int64(len(slice)) > remaining {
		slice = slice[:remaining]
	}

	n, err := c.WriterAt.WriteAt(slice, c.Offset+c.Position)
	c.Position += int64(n)
	if err != nil {
		return n, err
	}

	if len(p) > n {
		return n, errors.New("not enough space for all bytes")
	}

	return n, nil
}
