require 'securerandom'

class TerminalSession
  def initialize(width: 80, height: 24, prompt: '', term: 'xterm-256color')
    tmux_command("new-session -d -x #{width} -y #{height} 'PS1=#{prompt} TERM=#{term} zsh -f'")
  end

  def run_command(command)
    send_string(command)
    send_keys('enter')
  end

  def send_string(str)
    tmux_command("send-keys -t 0 -l '#{str.gsub("'", "\\'")}'")
  end

  def send_keys(*keys)
    tmux_command("send-keys -t 0 #{keys.join(' ')}")
  end

  def content(esc_seqs: false)
    cmd = 'capture-pane -p -t 0'
    cmd += ' -e' if esc_seqs
    tmux_command(cmd).strip
  end

  def clear
    send_keys('C-l')
  end

  def destroy
    tmux_command('kill-session')
  end

  def cursor
    tmux_command("display-message -t 0 -p '\#{cursor_x},\#{cursor_y}'").
      strip.
      split(',').
      map(&:to_i)
  end

  private

  def socket_name
    @socket_name ||= SecureRandom.hex(6)
  end

  def tmux_command(cmd)
    out = `tmux -u -L #{socket_name} #{cmd}`

    raise('tmux error') unless $?.success?

    out
  end
end