#!/usr/bin/env python3
import PyQt5.QtGui as QtGui
import PyQt5.QtCore as QtCore
import numpy as numpy

class Guide:
   def __init__(self, pen=None):
       if pen is None:
           pen = QtGui.QPen()
       assert isinstance(pen, QtGui.QPen)
       self.pen = pen

   def drawShape(self, pen):
       assert isinstance(pen, QtGui.QPainter)
       pen.save()
       pen.setPen(self.pen)

class LineGuide(Guide):
   def __init__(self, origin, direction, pen=None):
       super().__init__(pen)
       self.origin = origin
       self.direction = direction

   def drawShape(self, pen):
       super().drawShape(pen)
       p1 = self.origin + (9999 * QtCore.QPointF(numpy.cos(self.direction), numpy.sin(self.direction)))
       p2 = self.origin - (9999 * QtCore.QPointF(numpy.cos(self.direction), numpy.sin(self.direction)))
       pen.drawLine(QtCore.QLineF(p1, p2))
       pen.restore()

class ArcGuide(Guide):
   @classmethod
   def radTo16Deg(cls, radians):
       return int(round(numpy.rad2deg(radians) * 16))

   def __init__(self, center=None, radius=1, startAng=0, endAng=(2*numpy.pi), pen=None):
       if center is None:
           center = QtCore.QPointF(0, 0)
       super().__init__(pen)
       self.center = center
       self.radius = int(radius)
       self.startAng = startAng
       self.endAng = endAng

   def drawShape(self, pen):
       super().drawShape(pen)
       assert isinstance(pen, QtGui.QPainter)
       x, y = int(round(self.center.x())), int(round(self.center.y()))
       pen.drawArc(x - self.radius, y - self.radius, 2 * self.radius, 2 * self.radius, ArcGuide.radTo16Deg(self.startAng),
                   -ArcGuide.radTo16Deg(self.endAng - self.startAng))
       pen.restore()