package rest

import (
	"io"
	"os"
)

type IReadCloserLen interface {
	io.ReadCloser
	Len() int64
}

func NewReadCloserLen(rc io.ReadCloser, len int64) IReadCloserLen {
	return &readCloserLen{rc, len}
}

func ReadCloserLenFromFile(f *os.File) (IReadCloserLen, error) {
	fi, err := f.Stat()
	if err != nil {
		return nil, err
	}
	res := NewReadCloserLen(f, fi.Size())
	return res, nil
}

type readCloserLen struct {
	io.ReadCloser
	size int64
}

func (s *readCloserLen) Len() int64 {
	return s.size
}

func NewTemporaryFile(size int64, r io.Reader) (IReadCloserLen, IErrorArgs) {
	// Создаем временный файл
	f, err := os.CreateTemp("", "*")
	if err != nil {
		return nil, ErrorMessage("ErrTempFileCrete", err.Error())
	}
	if _, err := io.CopyN(f, r, size); err != nil {
		f.Close()
		os.Remove(f.Name())
		return nil, ErrorMessage("ErrTempFileCopy", err.Error())
	}
	tmp := &TemporaryFile{
		File: f,
		size: size,
	}
	return tmp, nil
}

type TemporaryFile struct {
	*os.File
	size int64
}

func (s *TemporaryFile) Len() int64 {
	return s.size
}

func (s *TemporaryFile) Close() error {
	if err := s.File.Close(); err != nil {
		return err
	}
	return os.Remove(s.File.Name())
}

type IReadCloser interface {
	io.ReadCloser
	Len() int64
}