import main
from core.parser import parseCommand
from twisted.internet.protocol import Factory, Protocol
from utils.logging.log import log, warn


class Server(Protocol):
    def __init__(self, addr):
        self.addr = addr
        self.authed = False
        if main.config["UsePassword"] is False:
            self.authed = True

    def send(self, data):
        data += "\r\n"
        data = data.encode("utf-8", "replace")
        self.transport.write(data)

    def dataReceived(self, data):
        data = data.decode("utf-8", "replace")
        # log("Data received from %s:%s -- %s" % (self.addr.host, self.addr.port, repr(data)))
        if "\n" in data:
            splitData = [x for x in data.split("\n") if x]
            if "\n" in data:
                for i in splitData:
                    parseCommand(self.addr, self.authed, i)
                return
        parseCommand(self.addr, self.authed, data)

    def connectionMade(self):
        log("Connection from %s:%s" % (self.addr.host, self.addr.port))
        self.send("Greetings.")

    def connectionLost(self, reason):
        self.authed = False
        log(
            "Connection lost from %s:%s -- %s"
            % (self.addr.host, self.addr.port, reason.getErrorMessage())
        )
        if self.addr in main.connections.keys():
            del main.connections[self.addr]
        else:
            warn("Tried to remove a non-existant connection.")


class ServerFactory(Factory):
    def buildProtocol(self, addr):
        entry = Server(addr)
        main.connections[addr] = entry
        return entry

    def send(self, addr, data):
        if addr in main.connections.keys():
            connection = main.connections[addr]
            connection.send(data)
        else:
            return
