import http.server
import socketserver
import threading
import webbrowser
import os
import sys
import sqlite3
import hashlib
from pathlib import Path
PORT = 8080
HOST = "127.0.0.1"
if getattr(sys, 'frozen', False):
BASE_DIR = Path(sys._MEIPASS)
else:
BASE_DIR = Path(__file__).parent
STATIC_DIR = BASE_DIR / "static"
DATA_DIR = BASE_DIR / "data"
class HADHandler(http.server.SimpleHTTPRequestHandler):
def __init__(self, *args, **kwargs):
super().__init__(*args, directory=str(STATIC_DIR), **kwargs)
def do_GET(self):
if self.path == '/' or self.path == '/index.html':
self.path = '/HAD_Digital_Mobile.html'
return super().do_GET()
def log_message(self, format, *args):
pass
def open_browser():
import time
time.sleep(1.5)
webbrowser.open(f"http://{HOST}:{PORT}")
def main():
DATA_DIR.mkdir(parents=True, exist_ok=True)
db_path = DATA_DIR / "had.db"
if not db_path.exists():
conn = sqlite3.connect(str(db_path))
conn.row_factory = sqlite3.Row
conn.execute("PRAGMA journal_mode=WAL")
conn.executescript('''CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT UNIQUE NOT NULL, password_hash TEXT NOT NULL, salt TEXT NOT NULL, role TEXT NOT NULL, display_name TEXT NOT NULL);
CREATE TABLE IF NOT EXISTS patients (id INTEGER PRIMARY KEY AUTOINCREMENT, display_name TEXT NOT NULL, age INTEGER, cancer_type TEXT, had_start TEXT, status TEXT DEFAULT 'active');
CREATE TABLE IF NOT EXISTS alerts (id INTEGER PRIMARY KEY AUTOINCREMENT, patient_id INTEGER, severity TEXT, message TEXT, status TEXT DEFAULT 'active', created_at TEXT DEFAULT CURRENT_TIMESTAMP);
CREATE TABLE IF NOT EXISTS messages (id INTEGER PRIMARY KEY AUTOINCREMENT, patient_id INTEGER, sender_id INTEGER, content TEXT, created_at TEXT DEFAULT CURRENT_TIMESTAMP);''')
for u,p,r,d in [("admin","admin123","admin","Marie Dupont"),("dr.martin","demo123","oncologist","Dr. Martin"),("inf.moret","demo123","had_nurse","Inf. Moret"),("patient.durand","demo123","patient","Jean Durand")]:
salt = os.urandom(16).hex()
h = hashlib.scrypt(p.encode(),salt=salt.encode(),n=2**14,r=8,p=1,dklen=64).hex()
conn.execute("INSERT INTO users (username,password_hash,salt,role,display_name) VALUES (?,?,?,?,?)",(u,h,salt,r,d))
for n,a,c,s in [("Jean Durand",62,"Lung","2026-08-15"),("Marie Laurent",55,"Breast","2026-08-20"),("Pierre Moreau",70,"Colorectal","2026-08-25")]:
conn.execute("INSERT INTO patients (display_name,age,cancer_type,had_start) VALUES (?,?,?,?)",(n,a,c,s))
conn.commit()
conn.close()
print("Database created")
with socketserver.TCPServer((HOST, PORT), HADHandler) as httpd:
print(f"HAD Digital running at http://{HOST}:{PORT}")
print("Press Ctrl+C to stop")
threading.Thread(target=open_browser, daemon=True).start()
try: httpd.serve_forever()
except KeyboardInterrupt: httpd.shutdown()
if __name__ == '__main__': main()