import numpy as np
import pandas as pd
import datetime,time
import random

#-----------------------
#Settings
#-----------------------
start_date=datetime.datetime(2024,4,1,0,0,0)
end_date=datetime.datetime(2024,9,30,23,0,0)

delta=datetime.timedelta(hours=1)

rows=[]

def seasonal_temp(day,hour):
	season=0
	#April
	if 91<= day <=120:
		season=12.4*np.cos(np.pi/200*day-np.pi)+10.6
	#May
	elif 121<= day <=151:
		season=14.4*np.cos(np.pi/200*day-np.pi)+13.6
	#June
	elif 152<= day <=181:
		season=17.4*np.cos(np.pi/200*day-np.pi)+18.6
	#July
	elif 182<= day <=212:
		season=18.4*np.cos(np.pi/200*day-np.pi)+19.6
	#August
	elif 213<= day <=243:
		season=18.4*np.cos(np.pi/200*day-np.pi)+18.6
	#September
	elif 244<= day <=274:
		season=15.4*np.cos(np.pi/200*day-np.pi)+17.6
	else:
		season=0
	if season==0:
		daily=0
	else:
		daily=6*np.sin((hour-15)/24*2*np.pi)
	return season+daily

def seasonal_humidity(temp):
	base=80-(temp-20)*1.5
	noise=np.random.uniform(-5,5)
	value=base+noise
	return np.clip(value,20,100)

def leaf_wetness(humidity,hour):
	if(hour<7 or hour>20):
		night_factor=1.0
	else:
		night_factor=0.4
	wet=(humidity/100)*night_factor+np.random.normal(0,0.02)
	return np.clip(wet,0.0,1.0)

def wind_speed(hour):
	base=2.0+1.5*np.sin(hour-14/24*2*np.pi)
	gust=np.random.normal(0,0.5)
	return max(0,base+gust)
#----------------------------------------------------------------
#GEN DATA
#----------------------------------------------------------------
date=start_date
print("Generating hourly samples")
#(time.mktime(date.timetuple()))
while date<=end_date:
	ts=int(time.mktime(date.timetuple()))
	hour=date.hour
	day_of_year=date.timetuple().tm_yday
	#print(day_of_year)
	temp=seasonal_temp(day_of_year,hour)
	#while
	hum=seasonal_humidity(temp)
	leaf=leaf_wetness(hum,hour)
	wind=wind_speed(hour)
	print(f"{ts},{temp},{hum},{leaf},{wind}")
	rows.append([ts,round(temp,2),round(hum,2),round(leaf,3),round(wind,2)])
	date+=delta

df=pd.DataFrame(rows,columns=["timestamp","temp","hum","leaf","wind"])
df.to_csv("training_data.csv",index=False,header=True)
