package accesslog

import (
	"bytes"
	"io"

	"github.com/spf13/afero"
)

type noLock struct{}

func (noLock) Lock()   {}
func (noLock) Unlock() {}

type MockFile struct {
	afero.File
	noLock
}

var _ SupportRotate = (*MockFile)(nil)

func NewMockFile() *MockFile {
	f, _ := afero.TempFile(afero.NewMemMapFs(), "", "")
	f.Seek(0, io.SeekEnd)
	return &MockFile{
		File: f,
	}
}

func (m *MockFile) Len() int64 {
	filesize, _ := m.Seek(0, io.SeekEnd)
	_, _ = m.Seek(0, io.SeekStart)
	return filesize
}

func (m *MockFile) Content() []byte {
	buf := bytes.NewBuffer(nil)
	m.Seek(0, io.SeekStart)
	_, _ = buf.ReadFrom(m.File)
	m.Seek(0, io.SeekStart)
	return buf.Bytes()
}

func (m *MockFile) NumLines() int {
	content := m.Content()
	count := bytes.Count(content, []byte("\n"))
	// account for last line if it does not end with a newline
	if len(content) > 0 && content[len(content)-1] != '\n' {
		count++
	}
	return count
}

func (m *MockFile) Size() (int64, error) {
	stat, _ := m.Stat()
	return stat.Size(), nil
}

func (m *MockFile) MustSize() int64 {
	size, _ := m.Size()
	return size
}