package main

import (
	"git.wamblee.org/converge/pkg/agent/session"
	"io"
	"time"
)

type WriteDetector[T io.ReadWriter] struct {
	session          T
	lastReportedTime time.Time
}

func (conn *WriteDetector[T]) Read(p []byte) (int, error) {
	return conn.session.Read(p)
}

func (conn *WriteDetector[T]) Write(p []byte) (int, error) {
	n, err := conn.session.Write(p)
	if err == nil && n > 0 {
		// because downloads can generate a lot of write in a short time, we do some throttling
		// It could also negatively impact download speed if we handle all the events.
		now := time.Now()
		if now.Sub(conn.lastReportedTime).Seconds() > 1 {
			conn.lastReportedTime = now
			session.UserActivityDetected()
		}
	}
	return n, err
}

func NewWriteDetector(conn io.ReadWriter) *WriteDetector[io.ReadWriter] {
	return &WriteDetector[io.ReadWriter]{session: conn}
}

type SftpActivityDetector struct {
	WriteDetector[io.ReadWriteCloser]
}

func (conn *SftpActivityDetector) Close() error {
	return conn.session.Close()
}

func NewSftpActivityDetector(conn io.ReadWriteCloser) *SftpActivityDetector {
	return &SftpActivityDetector{
		WriteDetector: WriteDetector[io.ReadWriteCloser]{
			session: conn,
		},
	}
}