"""Run NatBot."""
import time

from langchain.chains.natbot.base import NatBotChain
from langchain.chains.natbot.crawler import Crawler  # type: ignore


def run_cmd(cmd: str, _crawler: Crawler) -> None:
    """Run command."""
    cmd = cmd.split("\n")[0]

    if cmd.startswith("SCROLL UP"):
        _crawler.scroll("up")
    elif cmd.startswith("SCROLL DOWN"):
        _crawler.scroll("down")
    elif cmd.startswith("CLICK"):
        commasplit = cmd.split(",")
        id = commasplit[0].split(" ")[1]
        _crawler.click(id)
    elif cmd.startswith("TYPE"):
        spacesplit = cmd.split(" ")
        id = spacesplit[1]
        text_pieces = spacesplit[2:]
        text = " ".join(text_pieces)
        # Strip leading and trailing double quotes
        text = text[1:-1]

        if cmd.startswith("TYPESUBMIT"):
            text += "\n"
        _crawler.type(id, text)

    time.sleep(2)


if __name__ == "__main__":

    objective = "Make a reservation for 2 at 7pm at bistro vida in menlo park"
    print("\nWelcome to natbot! What is your objective?")
    i = input()
    if len(i) > 0:
        objective = i
    quiet = False
    nat_bot_chain = NatBotChain.from_default(objective)
    _crawler = Crawler()
    _crawler.go_to_page("google.com")
    try:
        while True:
            browser_content = "\n".join(_crawler.crawl())
            llm_command = nat_bot_chain.execute(_crawler.page.url, browser_content)
            if not quiet:
                print("URL: " + _crawler.page.url)
                print("Objective: " + objective)
                print("----------------\n" + browser_content + "\n----------------\n")
            if len(llm_command) > 0:
                print("Suggested command: " + llm_command)

            command = input()
            if command == "r" or command == "":
                run_cmd(llm_command, _crawler)
            elif command == "g":
                url = input("URL:")
                _crawler.go_to_page(url)
            elif command == "u":
                _crawler.scroll("up")
                time.sleep(1)
            elif command == "d":
                _crawler.scroll("down")
                time.sleep(1)
            elif command == "c":
                id = input("id:")
                _crawler.click(id)
                time.sleep(1)
            elif command == "t":
                id = input("id:")
                text = input("text:")
                _crawler.type(id, text)
                time.sleep(1)
            elif command == "o":
                objective = input("Objective:")
            else:
                print(
                    "(g) to visit url\n(u) scroll up\n(d) scroll down\n(c) to click"
                    "\n(t) to type\n(h) to view commands again"
                    "\n(r/enter) to run suggested command\n(o) change objective"
                )
    except KeyboardInterrupt:
        print("\n[!] Ctrl+C detected, exiting gracefully.")
        exit(0)