#!/usr/bin/env python3
"""Tiny stdlib-only server for the JTBD viewers.

Serves the current directory as static files and exposes GET /datasets.json,
which lists every JTBD project run found in this directory (one entry per
`{prefix}_jtbd_comments__archetype_summary.csv`). The viewers use that endpoint
to auto-populate their dataset picker, so a new pipeline run is discovered
automatically with no code edit.

Usage:
    python3 serve.py [port]

Then open one of:
    http://localhost:<port>/jtbd_opportunity_dashboard.html
    http://localhost:<port>/jtbd_journey_map.html

(If a viewer can't reach /datasets.json it falls back to a hardcoded list, so
a plain `python3 -m http.server` also still works.)
"""
import glob
import json
import os
import socketserver
import sys
import urllib.parse
from http.server import SimpleHTTPRequestHandler

_SUFFIX = "_jtbd_comments__archetype_summary.csv"


def discover_datasets():
    prefixes = set()
    for path in glob.glob("*" + _SUFFIX):
        name = os.path.basename(path)
        prefix = name[: -len(_SUFFIX)]
        if prefix:
            prefixes.add(prefix)
    return sorted(prefixes)


class Handler(SimpleHTTPRequestHandler):
    def do_GET(self):
        parsed = urllib.parse.urlparse(self.path)
        if parsed.path == "/datasets.json":
            body = json.dumps({"datasets": discover_datasets()}).encode("utf-8")
            self.send_response(200)
            self.send_header("Content-Type", "application/json")
            self.send_header("Content-Length", str(len(body)))
            self.send_header("Cache-Control", "no-store")
            self.end_headers()
            self.wfile.write(body)
            return
        super().do_GET()

    def end_headers(self):
        # Never let a browser serve a stale generated report/viewer after a
        # pipeline re-run: disable caching for HTML responses.
        if self.path.endswith(".html") or self.path.endswith("/"):
            self.send_header("Cache-Control", "no-store")
        super().end_headers()

    def log_message(self, fmt, *args):
        sys.stderr.write("[serve] " + (fmt % args) + "\n")


def main():
    port = int(sys.argv[1]) if len(sys.argv) > 1 else 8000
    datasets = discover_datasets()
    print("Serving . on http://localhost:%d/  (%d dataset(s) found)" % (port, len(datasets)))
    print("Datasets: %s" % (", ".join(datasets) if datasets else "(none)"))
    socketserver.TCPServer.allow_reuse_address = True
    with socketserver.TCPServer(("", port), Handler) as httpd:
        try:
            httpd.serve_forever()
        except KeyboardInterrupt:
            print("\nStopped.")


if __name__ == "__main__":
    main()
