import cv2
import os
from scipy import misc


def imshow(image, name=0):
    import cv2 as cv
    if isinstance(image, str):
        image = cv.imread(image)
    cv.startWindowThread()
    cv.namedWindow(str(name), cv.WINDOW_NORMAL)
    cv.imshow(str(name), image)


def resizeImage(img, xSize, ySize):
    tUpleSize = (xSize, ySize)
    return misc.imresize(img, tUpleSize)


def cropAndResize(anImage, finalSize):
    imageShape = anImage.shape
    if imageShape[0] < imageShape[1]:
        cut1Cols = round((imageShape[1] - imageShape[0]) / 2)
        cut2Cols = imageShape[1] - round((imageShape[1] - imageShape[0]) / 2)
        cropedImg = anImage[0:imageShape[0] - 1, cut1Cols:cut2Cols]
        return resizeImage(cropedImg, finalSize, finalSize)
    else:

        cut1Rows = int(round((imageShape[0] - imageShape[1]) / 2))
        cut2Rows = int(imageShape[0] -
                       round((imageShape[0] - imageShape[1]) / 2))
        cropedImg = anImage[cut1Rows:cut2Rows, 0:imageShape[1] - 1]
        return resizeImage(cropedImg, finalSize, finalSize)
    # return resizeImage(anImage, finalSize, finalSize)


def transformImagesResize(source, targetDir, size):
    if os.path.isfile(targetDir + '/0001.jpg') or os.path.isfile(
            targetDir + '/001.jpg') or os.path.isfile(
                targetDir + '/0001.jpg'):  # frames are there already
        print('Frames for  ', source, ' already resized')
        return

    dirs = os.listdir(source)
    print('Process Dir', source, ' imgs ', len(dirs))

    for aFile in dirs:
        fileSourcePath = os.path.join(source, aFile)
        print(fileSourcePath)

        img = cv2.imread(fileSourcePath, cv2.IMREAD_COLOR)
        r, g, b = cv2.split(img)

        # Sometimes you want to switch channels thats why this is here
        rescaledR = cropAndResize(r, size)
        rescaledG = cropAndResize(g, size)
        rescaledB = cropAndResize(b, size)

        rescaled = cv2.merge((rescaledR, rescaledG, rescaledB))

        targetImg = os.path.join(targetDir, aFile)
        if not os.path.exists(targetDir):
            os.makedirs(targetDir)
            print('created ', targetDir)

        cv2.imwrite(targetImg, rescaled)


def handleTasksForPerson(aPersonDir, targetPerson, size):
    tasks = os.listdir(aPersonDir)

    for aTask in tasks:
        transformImagesResize(
            os.path.join(aPersonDir, aTask), os.path.join(targetPerson, aTask),
            size)


def handleSubjects(rootPath, targetRoot, size):
    persons = os.listdir(rootPath)
    print('len(dirs)', len(persons))
    for aPerson in persons:
        print('process person', aPerson)
        handleTasksForPerson(
            os.path.join(rootPath, aPerson), os.path.join(targetRoot, aPerson),
            size)


# EXEC CODE
size = 400
root = '/home/afromero/datos/Databases/BP4D/Sequences'
targetRoot = '/home/afromero/datos/Databases/BP4D/Sequences_400'

handleSubjects(root, targetRoot, size)