import random
from datetime import datetime, timedelta
import math
from datetime import datetime, timedelta
import ast
import os
import time

liste_fichiers = []


"""
qui genere un tableau de 30 nombre random (-1,1) appeler generatePoids

"""
def generatePoids(nbCouche):
	poids = [random.uniform(-1, 1) for _ in range(nbCouche*30)]
	return poids

"""
un tableau de nb*30 nombre random de (0, nbinf) appel genereateCouche 
"""
def generateCouche(nbCouche, nbinf):
	couche = [random.randint(0, nbinf-1) for _ in range(nbCouche*30)]
	return couche

def sigmoid(valeurs, poids):
	# Vérification si les listes ont la même longueur
	if len(valeurs) != len(poids):
		raise ValueError("Les listes de valeurs et de poids doivent avoir la même longueur")
		# Calcul de la somme pondérée
	somme_ponderee = sum([valeur * poids for valeur, poids in zip(valeurs, poids)])
	# Calcul de la sigmoid
	resultat = 1 / (1 + math.exp(-somme_ponderee))
	return resultat
	
def pondere(liste):
	valeurs_ponderees = []
	min_value = min(liste)
	max_value = max(liste)
	for valeur in liste:
		if min_value == max_value:
			valeur_ponderee = 0.0
		else:
			valeur_ponderee = -1 + 2 * (valeur - min_value) / (max_value - min_value)
		valeurs_ponderees.append(valeur_ponderee)
	return valeurs_ponderees
	
def lire_valeurs_precedentes(nom_fichier, date):
	valeurs_precedentes = []
	with open(nom_fichier, 'r') as f:
		
		lignes = f.readlines()
		
		index_date = -1
		for i in range(len(lignes)):
			ligne_date, valeurs = lignes[i].strip().split(':')
			if ligne_date == date:
				index_date = i+1
				break
		if index_date != -1:
			debut = max(index_date - 30, 0)
			for j in range(debut, index_date):
				valeurs = [float(v) for v in lignes[j].strip().split(':')[1].split(',')]
				valeurs_precedentes.extend(valeurs)
	
	return valeurs_precedentes

def lirefichier(date):
	valeurs_ponderees = []
	valeurs_date = []
	with open("valeur.txt", 'r') as fichier:
		lignes = fichier.readlines()
		
		for ligne in lignes:
			FichierVal,index=ligne.split(':')
			val = lire_valeurs_precedentes("../Donnee/" + FichierVal + ".txt",date)
			valeurs_ponderees+=pondere(val)
			valeurs_date.append(val[29])
	return valeurs_ponderees,valeurs_date
   

def processingCouche(nbcouche,coucheinf,poids,couche):
	res = []
	for i in range(0,nbcouche) :
		r = 0
		listevaleur= []
		listepoids = []
		for y in range(0,30):
			listevaleur.append(coucheinf[couche[i*30+y]])
			listepoids.append(poids[i*30+y])
		r=sigmoid(listevaleur,listepoids)
		res.append(r)
	return pondere(res)
	
def processing(val,weight1,weight2,weight3,weight4,couche1,couche2,couche3,couche4,nbCouche1,nbCouche2,nbCouche3,nbCouche4):
	R1=processingCouche(nbCouche1,val,weight1,couche1)
	R2=processingCouche(nbCouche2,R1,weight2,couche2)
	R3=processingCouche(nbCouche3,R2,weight3,couche3)
	return processingCouche(nbCouche4,R3,weight4,couche4)
	
	
"""
fonction Evaluation en parametre un nombre (res), un nombre (valeur), un nombre (action), un nombre (portefeuille)
	si res >0.90 & portefeuille > 2003.9 => retourn action += 2000/valeur et Portefeuille -2003.9
	si res <0.90 et > 0.75 & portefeuille > 1003.9 => retourn action += 1000/valeur et Portefeuille -1003.9
	si res >0.5 et < 0.75  & portefeuille > 503.9 => retourn action += 500/valeur et Portefeuille -503.9
	Inferieur a -0.5 retourn portefeuille += action*valeur -3.9 et action = 0 
"""
def evaluation(res, valeur, action, portefeu,resAchat1,resAchat2,resAchat3,resVente,Achat1,Achat2,Achat3,Frais):
	if res > resAchat1 and portefeu > (Achat1 + Frais):
		action += Achat1 / valeur
		portefeu -= (Achat1 + Frais)
	elif res < resAchat1 and res > resAchat2 and portefeu > (Achat2 + Frais):
		action += Achat2 / valeur
		portefeu -= (Achat2 + Frais)
	elif res > resAchat2 and res < resAchat3 and portefeu > (Achat3 + Frais):
		action += Achat3 / valeur
		portefeu -= (Achat3 + Frais)
	elif res < resVente:
		portefeu += (action * valeur) - Frais
		action = 0
	return action, portefeu
   
   

def verification(valeurs_date, Action, portefeuille,PortefeuilleInit):
	for i in range(len(Action)):
		portefeuille += Action[i] * valeurs_date[i]
	 
	pourc = portefeuille/PortefeuilleInit
	"""
	if(verb):
		print("Total : ",portefeuille)
		print(" soit" ,pourc)
	"""
	return pourc

"""
Fonction enregistre qui enregistre dans un fichier dont le nom est composé de la varible nbtour - la variable pourcent:
les tableau (nouvelle ligne a chaque tableau) weight1,weight2,weight3,weight4,couche1,couche2,couche3,couche4
"""
def enregistre(nbtour,parametre,Global, pourcent,weight1,weight2,weight3,weight4,couche1,couche2,couche3,couche4):
	nom_fichier = str(pourcent)
	nom_dossier = "res_" + str(parametre)
	
	if not os.path.exists(nom_dossier):
		os.makedirs(nom_dossier)

	with open(nom_dossier+"/"+nom_fichier, 'w') as fichier:
		fichier.write("NB1: " + str(Global[0]) + "\n")
		fichier.write("NB2: " + str(Global[1]) + "\n")
		fichier.write("NB3: " + str(Global[2]) + "\n")
		fichier.write("resAchat1: " + str(Global[3]) + "\n")
		fichier.write("resAchat2: " + str(Global[4]) + "\n")
		fichier.write("resAchat3: " + str(Global[5]) + "\n")
		fichier.write("resVente: " + str(Global[6]) + "\n")
		
		fichier.write("weight1: " + str(weight1) + "\n")
		fichier.write("weight2: " + str(weight2) + "\n")
		fichier.write("weight3: " + str(weight3) + "\n")
		fichier.write("weight4: " + str(weight4) + "\n")
		fichier.write("couche1: " + str(couche1) + "\n")
		fichier.write("couche2: " + str(couche2) + "\n")
		fichier.write("couche3: " + str(couche3) + "\n")
		fichier.write("couche4: " + str(couche4) + "\n")
			
def arret(pourcentage, date_depart, date_actuelle):
	date_depart = datetime.strptime(date_depart, "%d-%m-%Y")
	date_actuelle = datetime.strptime(date_actuelle, "%d-%m-%Y")

	if date_actuelle >= date_depart + timedelta(days=30) and pourcentage < 1.05:
		return 1
	elif date_actuelle >= date_depart + timedelta(days=30) and pourcentage < 1.10:
		return 1
	elif date_actuelle >= date_depart + timedelta(days=60) and pourcentage < 1.20:
		return 1
	else:
		return 0
