#!/usr/bin/env python3

import os
import sys
import signal
import socket
import argparse


class Thorin:
    def __init__(self, host, port):
        try:
            self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.socket.connect(
                (
                    host,
                    port,
                )
            )
            signal.signal(signal.SIGINT, self.signal_handler)
        except socket.error as err:
            print("Failed to connect to erebor: %s" % (err))

    def erebor(self, message):
        message = message + "\n"
        self.socket.send(message.encode())
        return self.socket.recv(65536).decode().strip()

    def signal_handler(self, sig, frame):
        print()
        sys.exit(0)


# Main
p = argparse.ArgumentParser()
p.add_argument("--host", type=str, default="127.0.0.1")
p.add_argument("--port", type=int, default=8044)
p.add_argument(
    "command",
    metavar="command",
    type=str,
    nargs="*",
    help="pass a command directly to thorin in the cli",
)
args = p.parse_args()

# Try to connect to erebor
try:
    s = Thorin(host=args.host, port=args.port)
    peer = s.socket.getpeername()
    prompt = peer[0] + ":" + str(peer[1]) + "> "
except:
    sys.exit(1)

# Non-interactive mode
if len(args.command) > 0:
    text = " ".join(
        ['"{}"'.format(a) if " " in a else "{}".format(a) for a in args.command]
    )
    print(s.erebor(text))
    sys.exit(0)

# Interactive mode
while True:
    text = input(prompt)
    match text:
        case "quit":
            exit(0)
        case "exit":
            exit(0)
        case "":
            continue
        case _:
            print(s.erebor(text))
