package accesslog

import (
	"bytes"
	"io"
	"sync"
)

type MockFile struct {
	data     []byte
	position int64
	sync.Mutex
}

func (m *MockFile) Seek(offset int64, whence int) (int64, error) {
	switch whence {
	case io.SeekStart:
		m.position = offset
	case io.SeekCurrent:
		m.position += offset
	case io.SeekEnd:
		m.position = int64(len(m.data)) + offset
	}
	return m.position, nil
}

func (m *MockFile) Write(p []byte) (n int, err error) {
	m.data = append(m.data, p...)
	n = len(p)
	m.position += int64(n)
	return
}

func (m *MockFile) Name() string {
	return "mock"
}

func (m *MockFile) Read(p []byte) (n int, err error) {
	if m.position >= int64(len(m.data)) {
		return 0, io.EOF
	}
	n = copy(p, m.data[m.position:])
	m.position += int64(n)
	return n, nil
}

func (m *MockFile) ReadAt(p []byte, off int64) (n int, err error) {
	if off >= int64(len(m.data)) {
		return 0, io.EOF
	}
	n = copy(p, m.data[off:])
	return n, nil
}

func (m *MockFile) Close() error {
	return nil
}

func (m *MockFile) Truncate(size int64) error {
	m.data = m.data[:size]
	m.position = size
	return nil
}

func (m *MockFile) LineCount() int {
	m.Lock()
	defer m.Unlock()
	return bytes.Count(m.data[:m.position], []byte("\n"))
}

func (m *MockFile) Len() int64 {
	return m.position
}

func (m *MockFile) Content() []byte {
	return m.data[:m.position]
}