import sys 
sys.path.append("/home/jovyan/")

import argparse
import logging

from urllib.parse import urlparse, urljoin

from dash import Dash

from jupyter_server.serverapp import list_running_servers

from layout import layout
from callbacks import register_callbacks

logging.basicConfig(level=logging.INFO)

# weird trick to find base_url for the jupyterlab
def find_jupyterlab_base_url():
    servers = list_running_servers()
    for server in servers:
        if server["port"] == 8888:
            return server['url']
    return None


# get the correct port from proxy
parser = argparse.ArgumentParser()
parser.add_argument("--port", type=int)
args = parser.parse_args()
port: int = args.port

if not port:
    raise ValueError(f"Port of proxy server for Dash not found in {args}.")
else: 
    logging.debug(f"Dash app running on port {port}.")


base_url = find_jupyterlab_base_url()
if base_url is None:
    raise ValueError("Base URL of Jupyterlab could not be detected.")
logging.debug(f"Base URL: {base_url}")

proxy_base_path = urlparse(urljoin(base_url + "/", f"proxy/{port}/")).path
logging.debug(f"Proxy base path: {proxy_base_path}")

# define Dash app
app = Dash(
    name=__name__, 
    requests_pathname_prefix=proxy_base_path
)

# define layout
app.layout = layout

# register all callback functions
register_callbacks(app=app)

# Run Dash app in the notebook
app.run(
    jupyter_mode="jupyterlab", 
    port=port, 
    host="0.0.0.0",
    debug=True
)