import type { Page } from "@playwright/test"
import { disconnectTerminal, runTerminal, terminalConnects, waitTerminalReady } from "../actions"
import { test, expect } from "../fixtures"
import { terminalSelector } from "../selectors"
import { terminalToggleKey } from "../utils"

async function open(page: Page) {
  const term = page.locator(terminalSelector).first()
  const visible = await term.isVisible().catch(() => false)
  if (!visible) await page.keyboard.press(terminalToggleKey)
  await waitTerminalReady(page, { term })
  return term
}

test("terminal reconnects without replacing the pty", async ({ page, project }) => {
  await project.open()
  const name = `OPENCODE_E2E_RECONNECT_${Date.now()}`
  const token = `E2E_RECONNECT_${Date.now()}`

  await project.gotoSession()

  const term = await open(page)
  const id = await term.getAttribute("data-pty-id")
  if (!id) throw new Error("Active terminal missing data-pty-id")

  const prev = await terminalConnects(page, { term })

  await runTerminal(page, {
    term,
    cmd: `export ${name}=${token}; echo ${token}`,
    token,
  })

  await disconnectTerminal(page, { term })

  await expect.poll(() => terminalConnects(page, { term }), { timeout: 15_000 }).toBeGreaterThan(prev)
  await expect.poll(() => term.getAttribute("data-pty-id"), { timeout: 5_000 }).toBe(id)

  await runTerminal(page, {
    term,
    cmd: `echo $${name}`,
    token,
    timeout: 15_000,
  })
})
