class Test(unittest.TestCase):
    def setUp(self):
        self.world = World(None)
        self.world.start()
        
        
    def testWorld(self):
        self.world.loader.filename = 'ballformation.sim'
        self.world.loadSimulation(True)
        amount = len(self.world.objects)
        first_item = self.world.objects.keys()[0]
        self.world.deleteObject(first_item)
        amount2 = len(self.world.objects)
        self.assertEqual(amount-1, amount2)
        
        self.world.addObject(AstronomicalObject(vector(0,0,0), vector(0,0,0),0,sphere(position=(0,0,0), make_trail=False),0), 'newObject')
        self.assertEqual(len(self.world.objects), amount)
        self.world.close()
        scene.visible = 0

    def testSimulation(self):
        self.world.loader.filename = 'ballformation.sim'
        self.world.loadSimulation(True)
        self.world.startSimulation()
        sleep(3)
        self.world.stopSimulation()
class MainWindow(QWidget):

    group  = None
    labels = []

    def __init__(self,parent=None):
        super().__init__(parent)

        self.parent = parent
        self.width = parent.width
        self.height = parent.height
        self.clicked = False

        self.world = World(self)

        self.Pi = Vector(0,0)
        self.x = 0
        self.y = 0

        self.initUI()

        self.timer = QTimer()
        self.timer.timeout.connect(self.update)
        self.timer.start(20)

        # self.timer2 = QTimer()
        # self.timer2.timeout.connect(self.updateInfo)
        # self.timer2.start(100)

    def initUI(self):

        # self.group = QGroupBox(self)

        # vbox = QVBoxLayout()
        # for k,v in self.world.info:
        #     hbox = QHBoxLayout()
        #     self.labels.append([self.getTextLabel(k,10),self.getTextLabel(v,10)])
        #     hbox.addWidget(self.labels[-1][0])
        #     hbox.addStretch(1)
        #     hbox.addWidget(self.labels[-1][1])
        #     vbox.addLayout(hbox)


        # self.group.setLayout(vbox)
        # self.group.resize(self.width/7,self.height/2)


        self.setMouseTracking(True)
        self.setGeometry(300,300,1280,720)
        self.setWindowTitle("test")
        self.setStyleSheet("background : black")
        self.showMaximized()

    def paintEvent(self,event):

        self.drawBorder()

        self.world.run()
        
        if self.clicked:
            self.drawArrow(self.Pi,Vector(self.x,self.y))

        self.drawMouse()

        self.drawStatus()

    def drawBorder(self):
        qp = QPainter()
        qp.begin(self)
        pen = QPen(QColor(150,150,0))
        pen.setWidth(10)
        pen.setStyle(Qt.DashDotLine)
        pen.setCapStyle(Qt.RoundCap)
        pen.setJoinStyle(Qt.RoundJoin)
        qp.setPen(pen)
        pos = self.world.planet.location
        rad = self.world.planet.radius*2
        qp.drawEllipse(pos[0]-rad,pos[1]-rad,rad*2,rad*2)
        qp.end()

    def drawStatus(self):

        qp = QPainter()
        qp.begin(self)
        qp.setFont(QFont('Consolas',15))

        for i in range(0,len(self.world.info)):
            pen = QPen(QColor('white'))
            qp.setPen(pen)
            qp.drawText(20,100+i*(self.height/20),self.world.info[i][0])

            pen = QPen(self.getColor(i))
            qp.setPen(pen)
            qp.drawText(self.width/8,100+i*(self.height/20),self.world.getInfo(i))
            
        qp.end()

    def drawText(self,x,y,text):
        qp = QPainter()
        pen = QPen(QColor(255,255,255))
        qp.begin(self)
        qp.setPen(pen)
        qp.drawText(x,y,text)
        qp.end()


    def drawArrow(self,fr,to):

        delta = (to-fr)
        if delta.norm() > self.height/3:
            delta = delta.normalize()*self.height*(1/3)
            to = fr+delta

        t = fr-to
        t = t.normalize()*50

        l = t.rotate2D(45)
        r = t.rotate2D(-45)

        qp = QPainter()
        pen = QPen(QColor(0,150,150))
        pen.setStyle(Qt.DashLine)
        pen.setCapStyle(Qt.RoundCap)
        pen.setJoinStyle(Qt.RoundJoin)
        pen.setWidth(10)

        qp.begin(self)
        qp.setPen(pen)
        qp.drawLine(fr[0],fr[1],to[0],to[1])
        qp.drawLine(to[0],to[1],to[0]+l[0],to[1]+l[1])
        qp.drawLine(to[0],to[1],to[0]+r[0],to[1]+r[1])
        qp.end()

    def drawMouse(self):

        if self.clicked == True:
            return

        if self.parent.moverName == 'Satellite':
            if (Vector(self.x,self.y)-self.world.planet.location).norm()<self.world.planet.radius:
                return
        else:
            if (Vector(self.x,self.y)-self.world.planet.location).norm()<self.world.planet.radius*2:
                return

        qp = QPainter()
        qp.begin(self)
        icon = self.parent.icon
        if icon != None:
            img = icon.pixmap(50,50)
            qp.drawPixmap(self.x-25,self.y-25,img)
        qp.end()

    def mouseReleaseEvent(self,event):
        if not self.clicked:
            return

        to = Vector(self.x,self.y)
        delta = (to-self.Pi)
        if delta.norm() > self.height/3:
            delta = delta.normalize()*self.height*(1/3)
            to = self.Pi+delta

        self.clicked = False
        self.world.addObject(self.parent.moverName,self.Pi,(to-self.Pi)*0.01)

    def mouseMoveEvent(self,event):
        self.x = event.pos().x()
        self.y = event.pos().y()

    def mousePressEvent(self,event):

        if self.parent.moverName == 'Satellite':
            if (Vector(self.x,self.y)-self.world.planet.location).norm() < self.world.planet.radius:
                return
        else:
            if (Vector(self.x,self.y)-self.world.planet.location).norm() < self.world.planet.radius*2:
                return

        self.clicked = True
        self.Pi = Vector(event.pos().x(),event.pos().y())
   

    def getTextLabel(self,text,size):
        ret     = QLabel(str(text),self)
        font    = QFont('Consolas',size)
        font.setBold(True)
        ret.setFont(font)
        ret.setStyleSheet('color : white')
        ret.setFrameStyle(QFrame.Panel | QFrame.Sunken)
        return ret

    def getPixmap(self,img_name,ratio):
        file = os.path.join('data',img_name)
        return QPixmap(file).scaledToWidth(self.width/ratio,mode=Qt.SmoothTransformation)

    def getColor(self,id):

        value = self.world.info[id][1]


        if 5 <= id and id < 8:
            return QColor('white')

        if id < 2 and value >= 1280:
            value = 1279
        if ((id >=2 and id < 5) or id >=8) and value >= 768:
            value = 767

        value = 1279-value

        r = 0
        g = 0 
        b = 0

        if value >= 0 and value < 256 :
            r = 255
            g = value
            b = 0
        elif value >= 256 and value < 512:
            r = 511-value
            g = 255
            b = 0
        elif value >= 512 and value < 768:
            r = 0
            g = 255
            b = value-512
        elif value >= 768 and value < 1024:
            r = 0
            g = 1023-value
            b = 255
        elif value >= 1024 and value < 1280:
            r = value-1024
            g = 0
            b = 255

        return QColor(r,g,b)