class DetectFace:
    def __init__(self, vid, smile=False, eye=False):
        self.active = True
        self.smile = smile
        self.eye = eye
        self.vid = vid
        self.faceCascade = CascadeFile("haarcascade_frontalface_default.xml").getClassifier()

        if self.eye:
            pass  # self.eyeCascade = CascadeFile("haarcascade_eye.xml").getClassifier()
        if self.smile:
            self.smileCascade = CascadeFile("haarcascade_smile.xml").getClassifier()

        self.activate()

    def activate(self):
        while self.active:
            ret, frame = self.vid.read()

            gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

            faces = self.faceCascade.detectMultiScale(
                gray,
                scaleFactor=1.4,
                minNeighbors=5,
                minSize=(15, 15)
            )

            # Draw a rectangle around the faces
            for (x, y, w, h) in faces:
                cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
                if self.smile:
                    roi_gray = gray[y:y + h, x:x + w]
                    roi_color = frame[y:y + h, x:x + w]
                    smiles = self.smileCascade.detectMultiScale(
                        roi_gray,
                        scaleFactor=1.05,
                        minNeighbors=5,
                        minSize=(15, 15)
                    )

                    for (ex, ey, ew, eh) in smiles[:1]:
                        cv2.rectangle(roi_color, (ex, ey), (ex + ew, ey + eh), (255, 0, 255), 2)
                if self.eye:
                    pass  # Implement eye detection

            # Display the resulting frame
            cv2.imshow('Facial Detection', frame)

            k = cv2.waitKey(1)
            if k == 27 or k == 113:  # Esc key to stop
                self.active = False
                cv2.destroyAllWindows()
            if k == 115:  # Toggle smile
                self.smile = not self.smile
                continue
            elif k == -1:  # normally -1 returned,so don't print it
                continue
            else:
                continue
    def __init__(self, vid, smile=False, eye=False):
        self.active = True
        self.smile = smile
        self.eye = eye
        self.vid = vid
        self.faceCascade = CascadeFile("haarcascade_frontalface_default.xml").getClassifier()

        if self.eye:
            pass  # self.eyeCascade = CascadeFile("haarcascade_eye.xml").getClassifier()
        if self.smile:
            self.smileCascade = CascadeFile("haarcascade_smile.xml").getClassifier()

        self.activate()