#Version IronPython 3.4)
#EXE tournant en boucle : interroge la Temperature Camera toutes les X secondes (5 par défaut) et envoie requête Allumage/Extinction Frigo si Température trop éloignée de la température cible
#V2 : ajout fenetre fixe pour suivre fonctionnement appli et fermeture si besoin
#V3 : ajout fichier de config json


#Bibliothèques Python
import time
import clr
import System
import json
import os


#Biblios Boites
 
clr.AddReference("System.Windows.Forms")
clr.AddReference("System.Drawing")

from System.Windows.Forms import Application, Form, Label, TextBox, Button, DialogResult, Timer
from System.Drawing import Size, Point, Font, FontStyle
from urllib.request import urlopen




# Fonction pour lire le fichier de configuration
def read_config(file_path):
	with open(file_path, 'r') as file:
		config = json.load(file)
	return config



# Boite de saisie

class InputForm(Form):
	def __init__(self):
		self.InitializeComponent()

	def InitializeComponent(self):
		self.label1 = Label()
		self.label2 = Label()
		self.textBox1 = TextBox()
		self.textBox2 = TextBox()
		self.okButton = Button()

		# Set form properties
		self.Text = "Température cible"
		self.Size = System.Drawing.Size(300, 200)

		self.label1.Text = "Température:"
		self.label1.Location = System.Drawing.Point(20, 20)
		self.label1.AutoSize = True

		self.textBox1.Location = System.Drawing.Point(120, 20)
		self.textBox1.Size = System.Drawing.Size(100, 20)

		self.label2.Text = "Ecart:"
		self.label2.Location = System.Drawing.Point(20, 50)
		self.label2.AutoSize = True

		self.textBox2.Location = System.Drawing.Point(120, 50)
		self.textBox2.Size = System.Drawing.Size(100, 20)
		
		self.okButton.Text = "OK"
		self.okButton.Location = System.Drawing.Point(120, 80)
		self.okButton.Click += self.OkButton_Click

		self.Controls.Add(self.label1)
		self.Controls.Add(self.textBox1)
		self.Controls.Add(self.label2)
		self.Controls.Add(self.textBox2)
		self.Controls.Add(self.okButton)
		
	def OkButton_Click(self, sender, e):
		# Get the values entered by the user
		Cible = self.textBox1.Text
		Cible = float(Cible)
		Delta = self.textBox2.Text
		Delta = float(Delta)

		# Close the form
		self.DialogResult = System.Windows.Forms.DialogResult.OK
		self.Close()

		# Return the values
		return Cible, Delta



# Boite d'affichage

class MyForm(Form):
	def __init__(self):
		self.Text = "Régulation Temp. caméra"
		self.Width = 300
		self.Height = 240

		self.label1 = Label()
		self.label1.Text = "Temp. caméra :"
		self.label1.Location = Point(20, 80)
		self.label1.AutoSize = True
		bold_font = Font(self.label1.Font, FontStyle.Bold)
		self.label1.Font = bold_font

		self.label2 = Label()
		self.label2.Text = "Action :"
		self.label2.Location = Point(20, 110)
		self.label2.AutoSize = True
		bold_font = Font(self.label2.Font, FontStyle.Bold)
		self.label2.Font = bold_font

		self.label3 = Label()
		self.label3.Text = "Cible :"
		self.label3.Location = Point(20, 20)
		self.label3.AutoSize = True

		self.label4 = Label()
		self.label4.Text = "Delta :"
		self.label4.Location = Point(150, 20)
		self.label4.AutoSize = True
		
		self.closeButton = Button()
		self.closeButton.Text = "Close"
		self.closeButton.Location = System.Drawing.Point(180, 150)
		self.closeButton.Click += self.closeButton_Click

		self.Controls.Add(self.label1)
		self.Controls.Add(self.label2)
		self.Controls.Add(self.label3)
		self.Controls.Add(self.label4)
		self.Controls.Add(self.closeButton)
		
		self.timer = Timer()
		self.timer.Interval = delay  # en ms
		self.timer.Tick += self.on_timer_tick
		self.timer.Start()

	def calcul(self, sender=None, event=None): # Interroge Temp camera et lance requete HTTP pour allumer/éteindre peltier

		# Init Temp0 si pas déjà définie (1er calcul)
		try: # Essayer d'accéder à la variable pour voir si elle existe
			_ = Temp0
		except NameError: # Si une NameError est levée, la variable n'existe pas encore, donc on la définit
			Temp0 = 20

		# Stocke la Temperature de la camera dans la variable Temp
		with urlopen(urlNina) as response:
			body = response.read()
		body2 = json.loads(body.decode('utf-8'))
		Temp = body2["Response"]["Temperature"]

		# Si Temp > Cible + Delta : Requete Allumage Wemos 
		if Temp > Cible+Delta:
			urlopen(urlcmdON)
			Action = "Allumage"
    
		# Si Cible <= Temp < Cible + Delta/2
		elif (Temp >= Cible) and (Temp <= Cible+Delta/2):
			# Si Temp monte : Requete Allumage préventif Wemos 
			if Temp > Temp0:
				Action = "Allumage préventif"
				urlopen(urlcmdON)
		
			# Si Temp descend : Requete Extinction préventive Wemos 
			else:
				Action = "Extinction préventive"
				urlopen(urlcmdOFF)
	
		# Sinon requete Extinction
		else:
			urlopen(urlcmdOFF)
			Action = "Extinction"
	
		# Mise en mémoire Température N
		Temp0 = Temp
		
		return Temp, Action



	def on_timer_tick(self, sender, event):
		Temp, Action = self.calcul()
		Temparrondi = format(Temp, ".1f")
		Ciblearrondi = format(Cible, ".1f")
		self.label1.Text = f"Temp. caméra : {Temparrondi}"
		self.label2.Text = f"Action : {Action}"
		self.label3.Text = f"Cible : {Ciblearrondi}"
		self.label4.Text = f"Delta : {Delta}"



	def closeButton_Click(self, sender, event):
		urlopen(urlcmdOFF)
		self.Close()



# Lancement programmee

if __name__ == "__main__":
	# Chemin vers le fichier de configuration
	script_dir = os.path.dirname(os.path.abspath(__file__))
	config_file = os.path.join(script_dir, 'config.json')

	# Lire le fichier de configuration
	config = read_config(config_file)
	
	delay = config['param']['delay']
	urlNina = config['param']['urlNina']
	urlcmdON = config['param']['urlcmdON']
	urlcmdOFF = config['param']['urlcmdOFF']


	# ouvre les boites de dialogue
	input_form = InputForm()
	result = input_form.ShowDialog()

	if result == DialogResult.OK:
		Cible, Delta = input_form.OkButton_Click(None, None)  # Get the values
		form = MyForm()
		Application.Run(form)
