#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os
import configparser
import datetime
import glob
from osgeo import gdal

import otbApplication as otb

from app import Archive

def str2bool(v):
  return v.lower() in ("true")

class Processing(object):

	def __init__(self):
		pass

	def i_download(self):
		"""
			Méthode pour télécharger les images sur le site Theia Land.
		"""

		if not self.annee_fin :
			self.annee_fin = datetime.datetime.now().year

		self.check_download = Archive.Archive(self.capteur, self.bandes, self.niveau, self.emprise, self.zone_etude,\
											  self.resultats, self.annee_debut, int(self.annee_fin), self.seuil_nuage)
		self.check_download.listing()
		self.check_download.download_auto(self.id, self.mdp, self.proxy, extraction=self.extraction, groupe=self.groupe)

		self.liste_dossier = dict()

		for annee in os.listdir(self.resultats):
			with open("{}/{}/dates.txt".format(self.resultats, annee), "w") as fichier :
				for image in sorted(glob.glob("{}/{}/Images/*".format(self.resultats, annee))) :
					fichier.write("{}\n".format(os.path.basename(image)[:-4]))

			self.liste_dossier[annee] = sorted([x for x in glob.glob("{}/{}/Images/*".format(self.resultats, annee)) if x.endswith(".tif")])

	def otbPhenologie(self):
		"""
			Appel le module OTB : 'SigmoFitting' sur l'image composée de l'empilement des NDVI
		"""

		otb_Phenologie = otb.Registry.CreateApplication("SigmoFitting")
		otb_Phenologie.SetParameterString("mode", "metrics")

		for annee in self.liste_dossier :
			otb_Phenologie.SetParameterString("in", "{}/{}/NDVI/stack_ndvi.tif".format(self.resultats, annee))
			otb_Phenologie.SetParameterString("dates", "{}/{}/dates.txt".format(self.resultats, annee))
			otb_Phenologie.SetParameterString("out", "{}/{}/metrics.tif".format(self.resultats, annee))

			otb_Phenologie.ExecuteAndWriteOutput()

	def calcul_ndvi(self):
		"""
			Méthode effectuant le calcul du NDVI via le module OTB : 'RadiometricIndices'
		"""

		options_vrt	= gdal.ParseCommandLine('-resolution highest -separate')

		otb_NDVI = otb.Registry.CreateApplication("RadiometricIndices")
		otb_NDVI.SetParameterInt("channels.blue", 1)
		otb_NDVI.SetParameterInt("channels.green", 2)
		otb_NDVI.SetParameterInt("channels.red", 3)
		otb_NDVI.SetParameterInt("channels.nir", 4)
		otb_NDVI.SetParameterStringList("list", ["Vegetation:NDVI"])

		sauvegarde = configparser.ConfigParser()

		for annee in self.liste_dossier :

			sauvegarde.read("{}/{}/sauvegarde.ini".format(self.resultats, annee))
			dossier_NDVI = "{}/{}/NDVI".format(self.resultats, annee)

			if not os.path.exists(dossier_NDVI) :
				os.makedirs(dossier_NDVI)

			for img in self.liste_dossier[annee] :

				chemin_ndvi = "{}/ndvi_{}".format(dossier_NDVI, os.path.basename(img))

				if not str2bool(sauvegarde[os.path.basename(img)[:-4]]["NDVI"]):
					otb_NDVI.SetParameterString("in", img)
					otb_NDVI.SetParameterString("out", chemin_ndvi)
					otb_NDVI.ExecuteAndWriteOutput()
					sauvegarde[os.path.basename(img)[:-4]]["NDVI"] = "True"

			liste_ndvi = sorted([x for x in glob.glob("{}/*".format(dossier_NDVI)) if x.endswith(".tif") and "stack" not in x])
			vrt = gdal.BuildVRT("", liste_ndvi, options=options_vrt)
			gdal.Translate("{}/{}/NDVI/stack_ndvi.tif".format(self.resultats, annee), vrt)

			with open("{}/{}/sauvegarde.ini".format(self.resultats, annee), 'w') as configfile:
				sauvegarde.write(configfile)

	def i_images_processing(self):
		"""
			Calul le ndvi, fusionnne en une seule image puis lance le module OTBPhenology
		"""
		self.calcul_ndvi()
		self.otbPhenologie()