from PyQt5 import QtGui, QtCore, QtWidgets

class Cursor(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y
        
    def move(self, dx, dy):
        self.x += dx
        self.y += dy

    def moveAbsolute(self, x, y):
        self.x = x
        self.y = y

    def getPosition(self):
        return self.x, self.y

def enum(**enums):
    return type('Enum', (), enums)

Directions = enum(Left=1, Right=2, Up=3, Down=4, End=5, Home=6, CtrlEnd=7, CtrlHome=8)


class ConsoleEmulator():
    def __init__(self, qp, rows, cols):
        self.qp = qp
        self._x = 0
        self._y = 0
        self._rows = rows
        self._cols = cols

        fm = QtGui.QFontMetrics(self.qp.font())
        self.fontWidth  = fm.width('a')
        self.fontHeight = fm.height()

    def incrementPosition(self):
        if self._x < self._cols - 1:
            self._x += 1
        else:
            self._x = 0
            self._y += 1


    def newLine(self):
        self.LF()
        self.CR()

    def LF(self):
        if self._y < self._rows:
            self._y += 1

    def CR(self):
        self._x = 0

    def _validatePosition(self, x, y):
        if x >= self._cols:
            raise Exception("x > cols")

        if y >= self._rows:
            raise Exception("y > rows")

        return True

    def write(self, s, noBackgroudOnSpaces=False):
#        self.qp.drawText(self._x * self.fontWidth, self.fontHeight + self._y * self.fontHeight, s )
 #       x, y = self.getXY()
  #      self.gotoXY(x, y)
   #     return

        background = self.qp.backgroundMode()
        if type(s) == bytes:
            s = s.decode('cp437')
        for c in s:
            if self._validatePosition(self._x, self._y):
                if noBackgroudOnSpaces and c == ' ':
                    self.qp.setBackgroundMode(0)


                self.qp.drawText(int(self._x * self.fontWidth), int(self.fontHeight + self._y * self.fontHeight), c)
                self.incrementPosition()        
        self.qp.setBackgroundMode(background)

    def write_c(self, c, noBackgroudOnSpaces=False):
        background = self.qp.backgroundMode()
        if self._validatePosition(self._x, self._y):
            if noBackgroudOnSpaces and c == ' ':
                self.qp.setBackgroundMode(0)

            self.qp.drawText(self._x * self.fontWidth, self.fontHeight + self._y * self.fontHeight, c)
            self.incrementPosition()        
        self.qp.setBackgroundMode(background)

    def getXY(self):
        return (self._x, self._y)

    def writeAt(self, x, y, s, noBackgroudOnSpaces=False):
        self.gotoXY(x, y)
        self.write(s, noBackgroudOnSpaces)

    def writeAt_c(self, x, y, c, noBackgroudOnSpaces=False):
        self.gotoXY(x, y)
        self.write_c(c, noBackgroudOnSpaces)

    def writeLn(self):
        if True:#self._validatePosition(self._x, self._y):
            self._y += 1
            self._x = 0

    def gotoXY(self, x, y):
        if self._validatePosition(x, y):
            self._x = x
            self._y = y