#!/usr/bin/python
# -*- coding: utf-8 -*-
# resizeImg.py
#
# Redimensionner des images 
# @author: Cristian Rubilar <crubilar#cylabh.com>
# @version:  1.0
# @since: 2015-07-08
# 

from __future__ import division
import os, sys
import shutil
import fnmatch
import tarfile
import timeit
import time
try:
    from PIL import Image
except ImportError:
    import Image


class ResizeImg:
	""" Classe pour gérer la redimension des images (.bmp,.jpg,.png,.gif) """
	maintenant = time.strftime("%Y%m%d%H%M%S")
	typeImg = ['*.bmp','*.jpg','*.png','*.gif'] # Type d'images
	pathImg = os.path.dirname(os.path.abspath(__file__)) # répertoire actuel
	listeImg = [] # liste de fichiers d'image
	listeNonComp = [] # liste de fichiers non compressés
	listeDir = [] # liste de répertoires
	newDir = "newImg"
	comprimer = 'y'
	taille = 400 # taille maximale pour le largeur ou haute selon l'image

	def __init__(self, taille, newDir, comprimer):
		""" Méthode constructeur """
		self.taille = taille
		self.newDir = newDir
		self.comprimer = comprimer
		print ('Répertoire actuel: ' + self.pathImg + '\n')
		print ("taille: %s\n" %taille)
		print ("répertoire: %s\n" %newDir)
		print ("comprimer: %s\n" %comprimer)
		# charger les noms de fichier des images 
		nFiles = 0
		for nameFile in os.listdir(self.pathImg):
			# stocke les noms de répertoire dans la liste (listeDir)
			if os.path.isdir(nameFile):
				self.listeDir.append(nameFile)
			# stocke les noms de fichier d'images dans la liste (listeImg)
			if os.path.isfile(nameFile):
				for extImg in self.typeImg:
					if(fnmatch.fnmatch(nameFile, extImg )):
						self.listeImg.append(nameFile)
		
		nFiles = len(self.listeImg)
		print ("%s images à redimensionner -> " %nFiles)
		if(nFiles>0):
			self.creerNewDir()
			self.redimensionner()
			if(len(self.listeNonComp)>0):
				self.pasCompresse()

			if(self.comprimer=="y"):
				self.compresser();

	def creerNewDir(self):
		# crée un répertoire de nouvelles images (si cela ne existe pas)
		if(self.newDir in self.listeDir):
			pass
		else:
			os.mkdir(self.newDir)
		# permission d'écriture
		os.chmod(self.pathImg +'/'+ self.newDir, 0777)

	def redimensionner(self):
		start = timeit.default_timer()
		nFiles = len(self.listeImg)
		courant = 0
		print("en traitement!\n")
		# redimensionner les images	et les enregistre comme jpg
		for nameFile in self.listeImg:
			courant += 1
			percent = round((courant/nFiles)*100, 2)
			try :
				img = Image.open(nameFile)
			except IOError, e : # des fichiers non compressés
				self.listeNonComp.append(nameFile)
				continue	
			file, ext = os.path.splitext(nameFile)
			width = img.size[0]
			heigh = img.size[1]
			swRezise = 0
			print(nameFile+" -> "+str(percent)+"%") # Pour l'utilisateur ne désespère pas et voit le processus
			if (width > heigh): # photo horizontale
				if(width > self.taille):
					swRezise = 1
					wpercent = (self.taille / float(width))
					heigh = int((float(heigh) * float(wpercent)))
					width = self.taille
			else: # photo verticale
				if(heigh > self.taille):
					swRezise = 1
					hpercent = (self.taille / float(heigh))
					width = int((float(width) * float(hpercent)))
					heigh = self.taille
			
			# créer un nouveau fichier redimensionnée			
			if(os.path.exists(self.newDir+"/"+nameFile)):
				os.remove(self.newDir+"/"+nameFile)
			try :
				imgPetit = img.resize((width, heigh), Image.ANTIALIAS)
				imgPetit.save(self.newDir+"/" + file + ".jpg","JPEG")
			except IndexError, e : # des fichiers non compressés
				self.listeNonComp.append(nameFile)
				if(os.path.exists(self.newDir+"/"+ file + ".jpg")):
					os.remove(self.newDir+"/"+ file + ".jpg")
			except ValueError, e : # des fichiers non compressés
				self.listeNonComp.append(nameFile)
				if(os.path.exists(self.newDir+"/"+ file + ".jpg")):
					os.remove(self.newDir+"/"+ file + ".jpg")
			except IOError, e : # des fichiers non compressés
				self.listeNonComp.append(nameFile)
				if(os.path.exists(self.newDir+"/"+ file + ".jpg")):
					os.remove(self.newDir+"/"+ file + ".jpg")
			
			'''
			if(swRezise): # créer un nouveau fichier redimensionnée
				if(os.path.exists(self.newDir+"/"+nameFile)):
					os.remove(self.newDir+"/"+nameFile)
				imgPetit = img.resize((width, heigh), Image.ANTIALIAS)
				imgPetit.save(self.newDir+"/" + nameFile)
			else:  # copier le fichier actuel (n'a pas été redimensionnée)
				src = self.pathImg + "/" + nameFile
				dst = self.pathImg + "/" + self.newDir + "/" + nameFile
				shutil.copy2(src, dst)
			'''
		stop = timeit.default_timer()
		time = round(stop - start,2) 
		print("\nProcessus finalisé! -> (%s)\n" %time)				

	def pasCompresse(self):
		nFiles = len(self.listeImg)
		nImgNR = len(self.listeNonComp)
		swIC = "Non"
		logFile = "log_ResizeImg."+self.maintenant

		if (self.comprimer=="y"):
			swIC = "Oui"

		if(os.path.exists(self.pathImg+"/"+logFile)):
					os.remove(self.pathImg+"/"+logFile)
		fh = open(self.pathImg+"/"+logFile,'w')
		texteLog = "Redimension des images\n----------------------\n\n"
		texteLog += "Répertoire des images originales   : "+self.pathImg + '\n'
		texteLog += "Répertoire de nouvelles images     : "+self.pathImg+"/"+self.newDir+"\n"
		texteLog += "Taille choisie                     : "+str(self.taille)+"\n"
		texteLog += "Total d'images redimensionnées     : "+str(nFiles-nImgNR)+"\n"
		texteLog += "Total d'images pas redimensionnées : "+str(nImgNR)+"\n"
		texteLog += "Images compressées                 : "+swIC+"\n"
		texteLog += "\n\nImages pas redimensionnées\n---------------------------\n"
		
		nonComp = len(self.listeNonComp)
		print("\n%s -> Images pas compressés!!\n----------------------------\n" %nonComp)
		for nameFile in self.listeNonComp:
			print("Fichier: %s -> non compressé\n" %nameFile)
			self.listeImg.remove(nameFile)
			texteLog += nameFile+"\n"

		fh.write(texteLog)
		fh.close()		

	def compresser(self):
		# compresser répertoire
		tarFile = "imagesOlds"+self.maintenant+".tar.gz"
		tarImg = tarfile.open(tarFile, "w:gz")
		for nameFile in self.listeImg:
			tarImg.add(nameFile)
			os.remove(self.pathImg+"/"+nameFile)
		tarImg.close()
		os.chmod(tarFile, 0777)
		print "\nimages compressées!!\n"

if __name__ == '__main__':
	os.system('clear') 
	taille = 0
	newDir = "newImg"
	comprimer = 'n'
	oui = ['oui','yes','si','o','y','s']
	non = ['non','no','n']

	# accepte l'entrée de la taille souhaitée
	try :
		taille = int(raw_input("Entréz de la taille désirée (400): "))
	except ValueError, e :
		pass
	finally:
		if(taille==0):
			taille = 400

	# accepte l'entrée du nom du répertoire pour de nouvelles images
	try :
		newDir = raw_input("Entréz le nom du répertoire pour les nouvelles images (newImg): ")
	except ValueError, e :
		pass
	finally:
		if(newDir==''):
			newDir = "newImg"

	# accepte l'entrée de l'option de compresser les images originales
	while True:
		try :
			comprimer = raw_input("Voulez vous compresser les images originales? [oui/non]: ").lower()
		except ValueError, e :
			pass
		finally:
			if((comprimer in oui) or (comprimer in non)):
				if(comprimer in oui):
					comprimer = "y"
				else:
					comprimer = "n"
				break

	# instancier la classe
	oResizeImg = ResizeImg(taille, newDir, comprimer)
	sys.exit(1)