import http.server
import socketserver
import os
import socket
import threading
import time
import sys

PORT = 5657
DIR  = r"D:\Evolução categorias\.worktrees\comissao"

def get_local_ip():
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.connect(("8.8.8.8", 80))
        ip = s.getsockname()[0]
        s.close()
        return ip
    except:
        return "127.0.0.1"

os.chdir(DIR)

class Handler(http.server.SimpleHTTPRequestHandler):
    def log_message(self, format, *args):
        print(f"  [{self.address_string()}] {format % args}", flush=True)
    def end_headers(self):
        self.send_header("Cache-Control", "no-cache")
        self.send_header("Access-Control-Allow-Origin", "*")
        super().end_headers()

class ReusableTCPServer(socketserver.TCPServer):
    allow_reuse_address = True
    timeout = 300

def watchdog(httpd):
    """Reinicia o servidor se ele travar — verifica a cada 30s."""
    while True:
        time.sleep(30)
        try:
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.settimeout(5)
            s.connect(("127.0.0.1", PORT))
            s.close()
        except Exception as e:
            print(f"  [WATCHDOG] Porta {PORT} sem resposta ({e}). Reiniciando...", flush=True)
            os.execv(sys.executable, [sys.executable] + sys.argv)

httpd = ReusableTCPServer(("", PORT), Handler)
ip = get_local_ip()
print("=" * 55)
print("  DASHBOARD DEVSYS - SERVIDOR ATIVO")
print("=" * 55)
print(f"  Local:   http://localhost:{PORT}/dashboard_estoque.html")
print(f"  Rede:    http://{ip}:{PORT}/dashboard_estoque.html")
print("=" * 55)
print("  Pressione Ctrl+C para encerrar")
print()

t = threading.Thread(target=watchdog, args=(httpd,), daemon=True)
t.start()

try:
    httpd.serve_forever()
except KeyboardInterrupt:
    print("\n  Servidor encerrado.")
    httpd.server_close()
