package logchannel

import (
	"encoding/binary"
	"io"
	"syscall"
	"time"

	"golang.org/x/crypto/ssh"
)

type logChannel struct {
	channel ssh.Channel
	writer  io.WriteCloser
}

func writeTTYRecHeader(fd io.Writer, length int) {
	t := time.Now()

	tv := syscall.NsecToTimeval(t.UnixNano())

	binary.Write(fd, binary.LittleEndian, int32(tv.Sec))
	binary.Write(fd, binary.LittleEndian, int32(tv.Usec))
	binary.Write(fd, binary.LittleEndian, int32(length))
}

func New(channel ssh.Channel, writer io.WriteCloser) *logChannel {
	return &logChannel{
		channel: channel,
		writer:  writer,
	}
}

func (l *logChannel) Read(data []byte) (int, error) {
	return l.Read(data)
}

func (l *logChannel) Write(data []byte) (int, error) {
	writeTTYRecHeader(l.writer, len(data))
	l.writer.Write(data)

	return l.channel.Write(data)
}

func (l *logChannel) Close() error {
	l.writer.Close()

	return l.channel.Close()
}
