package browser

import (
	"fmt"
	"time"
)

// CdpTypeText escribe texto en el elemento activo de la pagina caracter por caracter.
// Usa Input.dispatchKeyEvent para simular pulsaciones de teclado reales.
// Recomienda usar CdpClick primero para enfocar el elemento objetivo.
func CdpTypeText(c *CDPConn, text string) error {
	if c == nil {
		return fmt.Errorf("cdp type text: conexion nula")
	}

	for _, ch := range text {
		charStr := string(ch)

		// keyDown
		keyDown := map[string]any{
			"type": "keyDown",
			"key":  charStr,
			"text": charStr,
		}
		if _, err := c.sendCDP("Input.dispatchKeyEvent", keyDown); err != nil {
			return fmt.Errorf("cdp type text: keyDown %q: %w", charStr, err)
		}

		// char (dispara el evento input en el elemento)
		keyChar := map[string]any{
			"type": "char",
			"key":  charStr,
			"text": charStr,
		}
		if _, err := c.sendCDP("Input.dispatchKeyEvent", keyChar); err != nil {
			return fmt.Errorf("cdp type text: char %q: %w", charStr, err)
		}

		// keyUp
		keyUp := map[string]any{
			"type": "keyUp",
			"key":  charStr,
			"text": charStr,
		}
		if _, err := c.sendCDP("Input.dispatchKeyEvent", keyUp); err != nil {
			return fmt.Errorf("cdp type text: keyUp %q: %w", charStr, err)
		}

		// Pequena pausa entre caracteres para simular escritura humana
		time.Sleep(10 * time.Millisecond)
	}

	return nil
}
