import yfinance as yf
from datetime import datetime, timedelta
import os


def get_closing_price_at_date(stock_symbol, date):
	# Convertir la date en format Y-m-d
	formatted_date = datetime.strptime(date, "%d-%m-%Y")

	start_date = formatted_date
	end_date = formatted_date + timedelta(days=1)
	
	start_date = start_date.strftime("%Y-%m-%d")
	end_date = end_date.strftime("%Y-%m-%d")
	
	# Récupérer les données historiques de l'action
	stock = yf.Ticker(stock_symbol)
	historical_data = stock.history(start=start_date, end=end_date)
	
	# Vérifier si des données sont disponibles pour la date spécifiée
	if historical_data.empty:
		print("Pas de données disponibles pour " + date + " - " + stock_symbol)
		# Retourner la dernière valeur correcte disponible
		previous_date = formatted_date - timedelta(days=1)
		previous_date = previous_date.strftime("%Y-%m-%d")
		previous_data = stock.history(start=previous_date, end=start_date)
		if previous_data.empty:
			print("Aucune valeur précédente disponible pour " + previous_date + " - " + stock_symbol)
			return None
		else:
			closing_price = previous_data['Close'].iloc[-1]
			return closing_price
	
	# Extraire le prix de clôture à la date donnée
	closing_price = historical_data['Close'].iloc[0]

	return closing_price
	
	
"""
fonction qui pour chaque date d'un fichier date, et pour chaque couple(nom:indice) d'un fichier valeur
ecrire dans un nouveau fichier qui sappel {nom} un couple date:le reurn de la fonction get_closing_price_at_date(indice,date)
"""
def recupCloture(nom_fichier_dates, nom_fichier_valeurs):
	with open(nom_fichier_dates, 'r') as fichier_dates:
		dates = fichier_dates.readlines()  # Lire toutes les dates dans une liste
	with open(nom_fichier_valeurs, 'r') as fichier_valeurs:
		lignes_valeurs = fichier_valeurs.readlines()  # Lire toutes les lignes de valeurs
		for ligne_valeurs in lignes_valeurs:
			nom, indice = ligne_valeurs.strip().split(":")
			for date in dates:
				date = date.strip()
				valeur = get_closing_price_at_date(indice, date)
				nom_fichier_resultats = nom + ".txt"
				with open("../Donnee/"+ nom_fichier_resultats, 'a') as fichier_resultats:
					fichier_resultats.write(date + ":" + str(valeur) + "\n")

"""
fonction python qui utilise la librairie yfinance et qui vient ecrire dans un fichier les dates d'ouverture de la bourse
"""

def write_market_open_dates(filename):
	# Obtention de la date d'aujourd'hui
	today = datetime.now().date()
	thirty_days_ago = 0
	with open(filename, 'r') as fichier:
		lignes = fichier.readlines()
		derniere_ligne = lignes[-1].strip()
		print(derniere_ligne)
		thirty_days_ago = datetime.strptime(derniere_ligne, '%d-%m-%Y').date()
		fichier.close()

	# Récupération des données boursières pour l'indice de référence (par exemple, le CAC40)
	index_ticker = '^FCHI'  # Symbole boursier de l'indice CAC40
	index_data = yf.download(index_ticker, start=thirty_days_ago, end=today)

	# Filtrage des jours de bourse ouverts
	market_open_dates = index_data.index.date

	# Ecriture des dates dans le fichier
	with open(filename, 'a') as file:
		for dates in market_open_dates:
			formatted_date = dates.strftime("%#d-%#m-%Y")
			file.write(formatted_date + '\n')
	with open("datetmp.txt", 'w') as file:
		for dates in market_open_dates:
			formatted_date = dates.strftime("%#d-%#m-%Y")
			file.write(formatted_date + '\n')


"""
fonction python qui utilise la librairie yfinance, qui s'appelle recup, prend en parametre un fichier valeur.
Qui pour chaque valeurs (nom:symbole) recupere la valeurs de cloture des 1000 dernier jour et l'ecrit dans un fichier qui s'appelle nom.txt, dans le dossier Donnee, sous la formme date d-m-yyy:valeurscloture
"""
def recup(fichier_valeur):
	# Vérification de l'existence du dossier "Donnee"
	if not os.path.exists('../Donnee'):
		os.makedirs('../Donnee')
	
	with open(fichier_valeur, 'r') as fichier:
		for ligne in fichier:
			nom, symbole = ligne.strip().split(':')
			
			# Récupération des données avec yfinance
			data = yf.download(symbole, period='5000d')['Close']
			
			# Création du chemin et nom du fichier de sortie
			fichier_sortie = os.path.join('../Donnee', f'{nom}.txt')
			
			# Écriture des données dans le fichier de sortie
			with open(fichier_sortie, 'w') as sortie:
				for index, value in data.items():
					date = index.strftime('%-d-%-m-%Y')
					ligne_sortie = f"{date}: {value}\n"
					sortie.write(ligne_sortie)


def lire_dates(fichier_dates):
	with open(fichier_dates, 'r') as file:
		dates = [line.strip() for line in file]
	return dates

"""
fonction qui vient verifiier que toute les dates sont presentes
"""
def verifier_dates(dates, repertoire):
	fichiers = [f for f in os.listdir(repertoire) if os.path.isfile(os.path.join(repertoire, f))]

	for fichier in fichiers:
		if fichier != 'date.txt' and fichier != 'test.py':  # Ignorer le fichier de dates lui-même
			with open(os.path.join(repertoire, fichier), 'r') as file:
				donnees = [line.split(':')[0].strip() for line in file]

			for date in dates:
				if date not in donnees:
					print(f"La date {date} n'est pas présente dans le fichier {fichier}.")

"""
fonction qui vient rajouter dans les fichiers les dates qui ne sont pas presente dans le fichier
"""
def ajouter_dates_manquantes(dates, repertoire):
	fichiers = [f for f in os.listdir(repertoire) if os.path.isfile(os.path.join(repertoire, f)) and f != 'test.py']

	for fichier in fichiers:
		chemin_fichier = os.path.join(repertoire, fichier)

		with open(chemin_fichier, 'r') as file:
			lignes = file.readlines()

		donnees = [line.split(':')[0].strip() for line in lignes]
		dernier_index = -1

		for i, date in enumerate(dates):
			if date not in donnees:
				if dernier_index != -1 and dernier_index < len(donnees):
					# Vérification supplémentaire avant d'accéder à l'indice
					if dernier_index < len(lignes) and lignes[dernier_index].count(':') > 0:
						valeur = lignes[dernier_index].split(':')[1].strip()
					else:
						valeur = 'valeur_par_defaut'

					nouvelle_ligne = f"{date}:{valeur}\n"
				else:
					nouvelle_ligne = f"{date}:valeur_par_defaut\n"

				lignes.append(nouvelle_ligne)

			# Mettez à jour dernier_index uniquement si la date est trouvée dans donnees
			dernier_index = donnees.index(date) if date in donnees else dernier_index

		with open(chemin_fichier, 'w') as file:
			file.writelines(lignes)


reponse = input("Voulez-vous ajouter les donnees jusqu'a aujourd'hui ? (Oui/Non) ").lower()
if reponse == 'oui':
	write_market_open_dates("date.txt")
	recupCloture("datetmp.txt","valeur.txt")


dates = lire_dates("date.txt")
verifier_dates(dates,"../Donnee")


reponse = input("Voulez-vous corriger le problème des dates ? (Oui/Non) ").lower()
if reponse == 'oui':
	ajouter_dates_manquantes(dates,"../Donnee")
else :
	print("Le problème des dates ne sera pas corrigé.")

"""
TODO : verifier ue les données sont non nul (None quand on les rentres dans les valeurs
"""