import cv2
import numpy as np

CASCADE_PATH = "haarcascade_frontalface_default.xml"

RESIZE_SCALE = 3
REC_COLOR = (0, 255, 0)

def getFaceCoordinates(image):
    cascade = cv2.CascadeClassifier(CASCADE_PATH)
    
    img_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    img_gray = cv2.equalizeHist(img_gray)
    rects = cascade.detectMultiScale(
        img_gray,
        scaleFactor=1.1,
        minNeighbors=3,
        minSize=(48, 48)
        )

    # For now, we only deal with the case that we detect one face.
    if(len(rects) != 1) :
        return None
    
    face = rects[0]
    bounding_box = [face[0], face[1], face[0] + face[2], face[1] + face[3]]

    # return map((lambda x: x), bounding_box)
    return bounding_box

def drawFace(img, faceCoordinates):
    cv2.rectangle(np.asarray(img), (faceCoordinates[0], faceCoordinates[1]), \
    (faceCoordinates[2], faceCoordinates[3]), REC_COLOR, thickness=2)

def crop_face(img, faceCoordinates):
    '''
    extend_len_x =  (256 - (faceCoordinates[3] - faceCoordinates[1]))/2
    extend_len_y =  (256 - (faceCoordinates[0] - faceCoordinates[2]))/2
    img_size = img.shape
    if (faceCoordinates[1] - extend_len_x) >= 0 :
        faceCoordinates[1] -= extend_len_x
    if (faceCoordinates[3] + extend_len_x) < img_size[0]:
        faceCoordinates[3] += extend_len_x
    if (faceCoordinates[0] - extend_len_y) >= 0 :
        faceCoordinates[0] -= extend_len_y
    if (faceCoordinates[2] + extend_len_y) < img_size[1]:
        faceCoordinates[2] += extend_len_y
    '''
    return img[faceCoordinates[1]:faceCoordinates[3], faceCoordinates[0]:faceCoordinates[2]]

def preprocess(img, faceCoordinates, face_shape=(48, 48)):
    '''
        This function will crop user's face from the original frame
    '''
    face = crop_face(img, faceCoordinates)
    #face = img
    face_scaled = cv2.resize(face, face_shape)
    face_gray = cv2.cvtColor(face_scaled, cv2.COLOR_BGR2GRAY)
    
    return face_gray