#!/usr/bin/env python
"""
Mark the start and end of the prompt with Final term (iterm2) escape sequences.
See: https://iterm2.com/finalterm.html
"""

import sys

from prompt_toolkit import prompt
from prompt_toolkit.formatted_text import ANSI

BEFORE_PROMPT = "\033]133;A\a"
AFTER_PROMPT = "\033]133;B\a"
BEFORE_OUTPUT = "\033]133;C\a"
AFTER_OUTPUT = (
    "\033]133;D;{command_status}\a"  # command_status is the command status, 0-255
)


def get_prompt_text():
    # Generate the text fragments for the prompt.
    # Important: use the `ZeroWidthEscape` fragment only if you are sure that
    #            writing this as raw text to the output will not introduce any
    #            cursor movements.
    return [
        ("[ZeroWidthEscape]", BEFORE_PROMPT),
        ("", "Say something: # "),
        ("[ZeroWidthEscape]", AFTER_PROMPT),
    ]


if __name__ == "__main__":
    # Option 1: Using a `get_prompt_text` function:
    answer = prompt(get_prompt_text)

    # Option 2: Using ANSI escape sequences.
    before = "\001" + BEFORE_PROMPT + "\002"
    after = "\001" + AFTER_PROMPT + "\002"
    answer = prompt(ANSI(f"{before}Say something: # {after}"))

    # Output.
    sys.stdout.write(BEFORE_OUTPUT)
    print(f"You said: {answer}")
    sys.stdout.write(AFTER_OUTPUT.format(command_status=0))
