package infra

import (
	"context"
	"strings"
	"testing"
	"time"
)

func TestPTYCaptureIdle(t *testing.T) {
	t.Run("captura output de echo hola", func(t *testing.T) {
		if testing.Short() {
			t.Skip("skip en modo corto")
		}
		ctx := context.Background()
		out, err := PTYCaptureIdle(ctx, "echo", []string{"hola"}, 100*time.Millisecond, nil, 0, 300*time.Millisecond, 5*time.Second)
		if err != nil {
			t.Fatalf("error inesperado: %v", err)
		}
		if !strings.Contains(out, "hola") {
			t.Errorf("se esperaba 'hola' en el output, got: %q", out)
		}
	})

	t.Run("input interactivo con cat", func(t *testing.T) {
		if testing.Short() {
			t.Skip("skip en modo corto: timing sensible en CI")
		}
		ctx := context.Background()
		// cat repite stdin a stdout via PTY; el PTY hace echo del input ademas.
		// "ping\r" simula Enter; la palabra "ping" debe aparecer en el output.
		out, err := PTYCaptureIdle(
			ctx,
			"cat", nil,
			200*time.Millisecond,
			[]string{"ping\r"},
			100*time.Millisecond,
			500*time.Millisecond,
			5*time.Second,
		)
		if err != nil {
			t.Fatalf("error inesperado: %v", err)
		}
		if !strings.Contains(out, "ping") {
			t.Errorf("se esperaba 'ping' en el output, got: %q", out)
		}
	})

	t.Run("timeout duro con sleep 10", func(t *testing.T) {
		if testing.Short() {
			t.Skip("skip en modo corto: espera ~1s de timeout")
		}
		ctx := context.Background()
		start := time.Now()
		_, err := PTYCaptureIdle(
			ctx,
			"sleep", []string{"10"},
			50*time.Millisecond,
			nil,
			0,
			600*time.Millisecond,
			1*time.Second,
		)
		elapsed := time.Since(start)
		if err != nil {
			// Un error de señal/exit es esperado; no falla el test.
			t.Logf("error (esperado al matar sleep): %v", err)
		}
		// La función debe retornar en menos de 3s, no esperar los 10s del sleep.
		if elapsed >= 3*time.Second {
			t.Errorf("la función tardó %v, se esperaba < 3s", elapsed)
		}
	})
}
