import RPi.GPIO as GPIO
import time, sys
import http.server
from http.server import BaseHTTPRequestHandler, HTTPServer
import socketserver
import _thread
import threading
import socket
from socketserver import ThreadingMixIn


etusivu = """
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.0/jquery.min.js"></script>
<script type="text/javascript">
var auto_refresh = setInterval(
function ()
{
   $('#load_latest_scores').load('teholukemat');
}, 1000); // refresh every 10000 milliseconds
</script>
<body>
<div id="load_latest_scores"> </div>
</body>
"""

class handler(BaseHTTPRequestHandler):
    def do_OPTIONS(self):
        self.send_response(200)
        self.send_header("Access-Control-Allow-Origin", "*")
        self.send_header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS')
        self.send_header("Access-Control-Allow-Headers", "X-Requested-With, Content-Type")  
        self.end_headers()
    def do_GET(self):
        if self.path.endswith('/teholukemat'):
            global tuloste
            
            self.send_response(200)
           # self.send_header("Reffresh", 1)
            self.send_header("Access-Control-Allow-Origin", "*")
            #self.send_header("Connection", "keep-alive")
            self.end_headers()
            #self.wfile.write(b'My contasdadent')
            self.wfile.write(str.encode(tuloste))
            #f = open('lukemat', 'rb')
            #teksti = b""
            #teksti = f.read()
            #self.wfile.write(teksti)
            #f.close()
        else:
            self.send_response(200)
            self.end_headers()
            self.wfile.write(str.encode(etusivu))

class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
    """Handle requests in a separate thread."""

def create_server():
    port = 8006
    global tuloste
    httpd = ThreadedHTTPServer(("0.0.0.0", port), handler)
    print("serving at port:" + str(port))

    httpd.serve_forever()

def laskuri():
    print("Syncing threads 10 sec ...")
    global pulssien_otanta
    pulssien_maara = pulssien_otanta
    kumulatiivinen_kulutus = 0
    time.sleep(10)
    aloitus_aika = time.time()

    global aika
    global tuloste
    
    while True:
        lock.acquire()
        
        teho = (((1000/(pulssia_per_kwh/pulssien_otanta))*3600)/aika)/1000
        hinta = teho*0.13
        kumulatiivinen_kulutus = pulssien_maara * 0.0001
        kumulatiivinen_hinta = kumulatiivinen_kulutus * 0.13
        kello = "{:.3f}".format(time.time() - aloitus_aika)
        
        tuloste = "<h1>TEHO: ", "{:.2f}".format(teho), " kWh</h1> ", "{:.2f}".format(hinta), " euroa tunnissa ", "Kumulatiivinen: kulutus: ", "{:.3f} kWh ".format(kumulatiivinen_kulutus), " hinta: " "{:.3f} e".format(kumulatiivinen_hinta), " Pulsseja: ", str(pulssien_maara), " aika (s):", kello
        tuloste = ''.join(tuloste)
        #print(tuloste)
        #print(type(tuloste))
        pulssien_maara += pulssien_otanta
        time.sleep(1/1000)

pulssia_per_kwh = 10000
pulssien_otanta = 10
tuloste = ""


lock = threading.Lock()

GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_UP)


_thread.start_new_thread(laskuri, tuple()) 
_thread.start_new_thread(create_server, tuple())



try:
   while True:
        i = 0
        lock.acquire(blocking=False)
        start = time.time()
        while i < pulssien_otanta:
            GPIO.wait_for_edge(17, GPIO.FALLING)
            #time.sleep(0.1)
            time.sleep(1/1000000)
            i += 1
        aika = time.time() - start
        lock.release()
        time.sleep(1/1000000)
except KeyboardInterrupt:
   print("\nTidying up")
