class TestAlignementTresor(TestCase):

    def setUp(self):
        self.positionZoneDepot = (800, 850)
        self.alignementTresor = AlignementTresor()

    def test_distance_laterale_negative_retourne_deplacement_gauche(self):
        distance_x = -200
        commande, _ = self.alignementTresor.ajusterPositionX(distance_x)
        self.assertEqual('left', commande, "Tresor se trouvant a gauche, mais retourne un deplacement a droite")

    def test_distance_laterale_positive_retourne_deplacement_droite(self):
        distance_x = 300
        commande, _ = self.alignementTresor.ajusterPositionX(distance_x)
        self.assertEqual('right', commande, "Tresor se trouvant a droite, mais retourne un deplacement a gauche")

    def test_distance_frontale_positive_retourne_deplacement_avant(self):
        distance_y = 300
        commande, _ = self.alignementTresor.ajusterPositionY(distance_y)
        self.assertEqual('forward', commande, "tresor se trouvant en avant, mais retourne un deplacement recule")

    def test_distance_elevee_retourne_deux_ajustements(self):
        distance_x = 400
        distance_y = 320
        ajustements = self.alignementTresor.calculerAjustement(distance_x, distance_y)
        self.assertEqual(len(ajustements), 2,
                         "Tresor mal aligne, mais ne retourne pas le bon nombre d'ajustement")

    def test_distance_laterale_negligeable_retourne_ajustement_frontal_seulement(self):
        distance_x = 5
        distance_y = 320
        ajustements = self.alignementTresor.calculerAjustement(distance_x, distance_y)
        self.assertEquals(len(ajustements), 1,
                          "Tresor est alignee devant le robot, mais un alignement lateral est calculer")
 def __init__(self, image):
     self.alignementTresor = AlignementTresor()
     self.imageCamera = image
     self.positionZone = (805, 950)
     self.rayonZone = 20
     self._definirIntervallesCouleurs()
     self.alignementTerminer = False
     self.ajustements = []
 def setUp(self):
     self.positionZoneDepot = (800, 850)
     self.alignementTresor = AlignementTresor()
class DetectionTresor(object):
    def __init__(self, image):
        self.alignementTresor = AlignementTresor()
        self.imageCamera = image
        self.positionZone = (805, 950)
        self.rayonZone = 20
        self._definirIntervallesCouleurs()
        self.alignementTerminer = False
        self.ajustements = []

    def calculerAjustements(self):
        contoursTresor = self._detecterContoursForme(self.intervalleJaune)

        if (contoursTresor is not None):
            distance_x, distance_y = self._trouverDistance(contoursTresor)
            self.ajustements= self.alignementTresor.calculerAjustement(distance_x, distance_y)
        else:
            self.ajustements = None

    def _trouverDistance(self, contoursTresor):
        positionZone_x, positionZone_y = self.positionZone
        position_x, position_y = self._trouverCentreForme(contoursTresor)
        distance_x = (position_x - positionZone_x)
        distance_y = (positionZone_y - position_y)
        return distance_x, distance_y

    def _trouverCentreForme(self, contoursForme):
        MatriceCentreMasse = cv2.moments(contoursForme)
        centre_x = int(MatriceCentreMasse['m10'] / MatriceCentreMasse['m00'])
        centre_y = int(MatriceCentreMasse['m01'] / MatriceCentreMasse['m00'])

        return centre_x, centre_y

    def _detecterContoursForme(self, intervalleCouleur):
        intervalleFonce, intervalleClair, couleurForme = intervalleCouleur
        masqueCouleur = cv2.inRange(self.imageCamera, intervalleFonce, intervalleClair)
        kernel = np.ones((5, 5), np.uint8)
        masqueFermeture = cv2.morphologyEx(masqueCouleur.copy(), cv2.MORPH_CLOSE, kernel)

        _, contoursCouleur, _ = cv2.findContours(masqueFermeture.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

        if (len(contoursCouleur) > 0):
            contoursTresor = self._obtenirFormeInteret(contoursCouleur)

            if (contoursTresor is not None):
                return contoursTresor
            else:
                return None
        else:
            return None

    def _obtenirFormeInteret(self, contoursCouleur):
        contoursNegligeable = []

        for contours in range(len(contoursCouleur)):
            aire = cv2.contourArea(contoursCouleur[contours])
            print(aire)
            if ((aire < AIRE_MINIMALE) or (aire > AIRE_MAXIMALE)):
                contoursNegligeable.append(contours)

        if (len(contoursNegligeable) > 0):
            contoursCouleur = np.delete(contoursCouleur, contoursNegligeable)

        if (len(contoursCouleur) == 0):
            return None
        else:
            contoursCouleur.sort()
            index = len(contoursCouleur)
            return contoursCouleur[index-1]

    def _definirIntervallesCouleurs(self):
        self.intervalleJaune = np.array([0, 90, 90]), np.array([80, 255, 255]), "Jaune"