from flask import Flask
from http.server import HTTPServer, BaseHTTPRequestHandler
from consts import SSL_CERT_PATH, SSL_KEY_PATH, HOST, PORT
from map.get_markers import get_all_markers
from map.input_new_data import input_new_Lidar_data
#from map.get_relation import get_relation
from APIs.get_weather import get_weather
import ssl
import keyboard
import sqlite3

app = Flask(__name__)
terminate_server = 0

class IceHTTPServer(HTTPServer):
    def __init__(self, server_address, handler_class, cursor):
        super().__init__(server_address, handler_class)
        self.cursor = cursor

    def get_request(self):
        request, client_address = super().get_request()
        return request, client_address


# Custom HTTP class
class IceHTTP(BaseHTTPRequestHandler):
    def __init__(self, request, client_address, server):
        self.cursor = server.cursor
        super().__init__(request, client_address, server)

    def do_GET(self):
        # Root path
        if self.path == '/':  # NB: temporary root path behavior
            self.send_response(200)
            self.send_header("Content-type", "text/plain")
            self.end_headers()

            self.wfile.write(b"Root path hit!")

        elif self.path == '/update_map':  # NB: should be POST?
            get_all_markers(self, self.cursor, False, 'Mjosa')  # Get all markers
            # NB: temporary hardcoded waterBodyName
        elif self.path == '/get_valid_markers':  # NB: should be POST?
            get_all_markers(self, self.cursor, True, 'Mjosa')  # Get only valid markers
            # NB: temporary hardcoded waterBodyName
        #elif self.path == '/get_relation':
        #    get_relation(self, 'Mjosa')  # NB temp hardcoded value

    def do_POST(self):
        if self.path == '/get_weather_data':
            get_weather(self)

        elif self.path == '/new_lidar_data':
            input_new_Lidar_data(self,self.cursor, 1, 'Mjosa')  # hardcoded body of water must change later

# Terminate server on key press q
def on_key_press(server, event, cursor, conn):
    if event.name == 'q':
        print('Terminating server...')
        server.server_close()
        cursor.close()
        conn.close()
        keyboard.unhook_all()
        quit()


# Start a server on port 8443 using self defined HTTP class
if __name__ == "__main__":
    try:
        # Initialize database connection
        conn = sqlite3.connect('server/sql_db/icedb')
        cursor = conn.cursor()

        # Load SSL certificate and private key
        ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
        ssl_context.load_cert_chain(SSL_CERT_PATH, SSL_KEY_PATH)

        # Create HTTP server with SSL support
        server = IceHTTPServer((HOST, PORT), IceHTTP, cursor)
        server.socket = ssl_context.wrap_socket(server.socket, server_side=True)

        print("Server running on port ", PORT)

        # Register key press event handler
        keyboard.on_press(lambda event: on_key_press(server, event, cursor, conn))

        print("Server running on port ", PORT)

        # Run server indefinitely
        server.serve_forever()

    except Exception as e:
        print(f"Server terminated: {PORT}: {e}")