# Script para gerar thumbs de imagens dentro das pastas em upload_files
from PIL import Image
from glob import glob
import datetime
import time
import os
import socket
import pathlib
import pwd
import grp

hostname = socket.gethostname()
pathRoot = os.path.sep
pathRoot = os.path.join(pathRoot, 'var', 'www', 'html')

# Guarda a data atual e a de ontem para utilizar no log e na validacao de ate qual arquivo deve ser percorrido
today = datetime.datetime.now()
yesterday = today - datetime.timedelta(days = 1)
today_str = today.strftime('%d/%m/%Y')
yesterday_str = yesterday.strftime('%d/%m/%Y')

# Adiciona o arquivo de log
# @param path - Caminho onde o log sera armazenado
# @param message - Mensagem que sera adicionada ao arquivo de log
def log(path, message):
    hours = '{:02d}{:02d}{:02d}'.format(today.hour, today.minute, today.second)
    dateAsString = '{}{:02d}{:02d}'.format(today.year, today.month, today.day)
    file = open(os.path.join(path, '{date}.log').format(date=dateAsString), 'a+')
    file.write("{date}{hours}: {message}\n".format(date=dateAsString, hours=hours, message=message))

# Percorre os arquivos atuais da pasta informada, e cria suas respectivas thumbs
# @param folder - Pasta onde as imagens se encontram dentro do upload_files
# @param validarData - Verifica se deve validar somente os arquivos atuais (data de hoje e ontem) ou se percorre todos os arquivos (mais utilizado para carga inicial) 
def createThumb(folder, validarData = True):
    folderThumb = folder
    folderLog = folder

    # Para nao modificar como funciona hj os arquivos que ja sao gerados para a previa
    if folder == 'laudoprevia':
        folderThumb = 'previa'
        folderLog = 'thumbnailPrevia'

    # Define o diretorio onde buscara as imagens (pathFolder), onde armazenara as thumbs(pathThumb) e os logs(pathLogs)
    pathFolder = os.path.join(pathRoot, 'application', 'upload_files', folder)
    pathThumb = os.path.join(pathRoot, 'agronet', 'resources', 'imagens', 'thumbnail', folderThumb)
    pathLogs = os.path.join(pathRoot, 'agronet', 'rotinas', 'logs', folderLog)

    # Cria a pasta da thumbs caso nao exista
    if not os.path.isdir(pathThumb):
        pathlib.Path(pathThumb).mkdir(mode=0o775, parents=True, exist_ok=True)

        # Caso seja ambiente de testes, setamos o usuario www-data para conseguir excluir a thumb ao excluir a img do upload_files via rotina no sistema
        if  hostname != "agrobr-app02":
            uid = pwd.getpwnam("www-data").pw_uid
            gid = grp.getgrnam("www-data").gr_gid
            os.chown(pathThumb, uid, gid)

    # Cria a pasta de logs caso nao exista
    if not os.path.isdir(pathLogs):
        pathlib.Path(pathLogs).mkdir(parents=True, exist_ok=True)

    # Busca todos os arquivos de imagens do diretorio
    list_of_files = glob(pathFolder + '/*.[Jj][Pp][Gg]')
    list_of_files.extend(glob(pathFolder + '/*.[Pp][Nn][Gg]'))
    list_of_files.extend(glob(pathFolder + '/*.[Jj][Pp][Ee][Gg]'))
    list_of_files.extend(glob(pathFolder + '/*.[Bb][Mm][Pp]'))
    list_of_files.extend(glob(pathFolder + '/*.[Gg][Ii][Ff]'))
    list_of_files.extend(glob(pathFolder + '/*.[Tt][Ii][Ff]'))
    list_of_files.extend(glob(pathFolder + '/*.[Jj][Ff][Ii][Ff]'))
    list_of_files.extend(glob(pathFolder + '/*.[Jj][Pp][Ee]'))

    # Ordena os arquivos na ordem desc da data de modificacao
    list_of_files = sorted(list_of_files, key=lambda t: -os.stat(t).st_mtime)

    # Percorre os arquivos para verificar se já existe thumb criado para eles
    for file_path in list_of_files:
        # Caso o parametro validarData seja true, validamos se a dada de modificacao do arquivo esta entre a data de hoje ou ontem
        timestamp_str = time.strftime('%d/%m/%Y', time.gmtime(os.path.getmtime(file_path)))
        if validarData and today_str != timestamp_str and yesterday_str != timestamp_str:
            break
        
        filenameThumb = os.path.join(pathThumb, os.path.basename(file_path))

        # Para nao modificar como funciona hoje os arquivos que ja sao gerados para a previa
        if folder == 'laudoprevia':
            basename = os.path.basename(file_path)
            file, ext = os.path.splitext(basename)
            filenameThumb = os.path.join(pathThumb, file + "_thumb" + ext)

        # valida se o arquivo da thumb ja foi gerado
        if not os.path.isfile(filenameThumb):
            try:
                # Abre a imagem original, a redimensiona e salva no diretorio da thumb
                im = Image.open(file_path)
                im.thumbnail((100, 70))
                im.save(filenameThumb)

                # Adiciona ao log uma mensagem de sucesso ao criar a thumb
                if os.path.isfile(filenameThumb):
                    log(pathLogs, "Thumbnail gerado com sucesso! ({name})".format(name= os.path.basename(filenameThumb)))
            except Exception as e:
                print(pathLogs, str(e))

#Chamadas do metodo createThumb
#createThumb('laudoprevia')
createThumb('laudopreliminar')
createThumb('laudofinal')
