"""bincio serve — CLI entry point for the multi-user VPS server."""

from __future__ import annotations

from pathlib import Path
from typing import Optional

import click
from rich.console import Console

console = Console()


@click.command("serve")
@click.option("--data-dir", required=True, type=click.Path(), help="BAS data directory (contains instance.db)")
@click.option("--site-dir", default=None, type=click.Path(), help="Astro site dir for post-write rebuilds")
@click.option("--host", default="127.0.0.1", help="Bind host (default: 127.0.0.1 — proxy via nginx)")
@click.option("--port", default=4041, help="Bind port (default: 4041)")
@click.option("--strava-client-id", default=None, envvar="STRAVA_CLIENT_ID", help="Strava OAuth client ID (enables per-user Strava sync)")
@click.option("--strava-client-secret", default=None, envvar="STRAVA_CLIENT_SECRET", help="Strava OAuth client secret")
def serve(data_dir: str, site_dir: Optional[str], host: str, port: int,
          strava_client_id: Optional[str], strava_client_secret: Optional[str]) -> None:
    """Start the bincio multi-user application server.

    Handles auth, user management, and write operations.
    Intended to run behind nginx which serves static files.

    Requires a data directory initialised with `bincio init`.
    """
    import uvicorn
    import bincio.serve.server as srv

    dd = Path(data_dir).expanduser().resolve()
    if not (dd / "instance.db").exists():
        raise click.UsageError(
            f"No instance.db found in {dd}. Run `bincio init --data-dir {dd}` first."
        )

    srv.data_dir = dd
    if site_dir:
        srv.site_dir = Path(site_dir).expanduser().resolve()
    if strava_client_id:
        srv.strava_client_id = strava_client_id
    if strava_client_secret:
        srv.strava_client_secret = strava_client_secret

    console.print(f"[bold]bincio serve[/bold]")
    console.print(f"  Data:  [cyan]{dd}[/cyan]")
    if srv.site_dir:
        console.print(f"  Site:  [cyan]{srv.site_dir}[/cyan]")
    console.print(f"  URL:   [cyan]http://{host}:{port}[/cyan]")
    console.print()

    uvicorn.run(srv.app, host=host, port=port, log_level="info")
