import os
import shutil
import pandas as pd
import tensorflow as tf
from PIL import Image
from tensorflow.keras.preprocessing import image
from tensorflow.keras.layers import CenterCrop
import numpy as np
from tqdm import tqdm


def load_sort_data(meta_filename = str, image_folder = str,sub_dir= str):
    """[summary]

    Args:
        meta_filename ([type], optional): [description]. Defaults to str.
        image_folder ([type], optional): [description]. Defaults to str.
        sub_dir (str,optional): Parent directory of the output folders. 

    Returns:
        [type]: [description]
    """
    data_dir = os.getcwd() + "/data/"
    dest_dir = data_dir + sub_dir 
    metadata = pd.read_csv(data_dir + '/' + meta_filename)
    labels = metadata['dx'].unique()
    label_images = []
    
    for i in tqdm(labels):
        if os.path.exists(dest_dir + str(i) + '/'):
            shutil.rmtree(dest_dir + str(i) + '/')
        os.mkdir(dest_dir + str(i) + '/')
        sample = metadata[metadata['dx'] == i]['image_id']
        label_images.extend(sample)
        for id in tqdm(label_images):
            shutil.copyfile((data_dir + image_folder + '/' + id + '.jpg'), (dest_dir + i + '/' + id + '.jpg'))
        label_images = []
    
    return metadata, dest_dir

def transform(path, size = (200, 150)):
    # create a list of images
    img_list = [fn for fn in os.listdir(path) if fn.endswith('.jpg')]
    (left, upper, right, lower) = (15, 15, 135,185)
    #iterating over each .jpg
    for fn in tqdm(img_list):
        fp = path + '/' + fn
        current_image = image.load_img(fp, target_size = size, 
                                    color_mode = 'grayscale')
        crop_image = current_image.crop((left, upper, right, lower))
        
        # print("current image", type(current_image), current_image)
        # print("crop image", type(crop_image), crop_image)
        # convert image to a matrix
        img_ts = image.img_to_array(crop_image)
        
        # print(type(img_ts), img_ts)
        # turn that into a vector / 1D array
        img_ts = [img_ts.ravel()]
        try:
            # concatenate different images
            full_mat = np.concatenate((full_mat, img_ts))
        except UnboundLocalError: 
            # if not assigned yet, assign one
            full_mat = img_ts
    return full_mat