from __future__ import annotations

import os
from urllib.parse import quote

from shared.config import config


def _get_app_url(app_name: str) -> str:
    env_key = f"APP_URL_{app_name.upper()}"
    env_val = os.getenv(env_key)
    if env_val:
        return env_val.rstrip("/")
    return config()["app_urls"][app_name].rstrip("/")


def app_url(app_name: str, path: str = "/") -> str:
    base = _get_app_url(app_name)
    if not path.startswith("/"):
        path = "/" + path
    return base + path


def blog_url(path: str = "/") -> str:
    return app_url("blog", path)


def market_url(path: str = "/") -> str:
    return app_url("market", path)


def cart_url(path: str = "/") -> str:
    return app_url("cart", path)


def events_url(path: str = "/") -> str:
    return app_url("events", path)


def federation_url(path: str = "/") -> str:
    return app_url("federation", path)


def orders_url(path: str = "/") -> str:
    return app_url("orders", path)


def account_url(path: str = "/") -> str:
    return app_url("account", path)


def artdag_url(path: str = "/") -> str:
    return app_url("artdag", path)


def page_cart_url(page_slug: str, path: str = "/") -> str:
    if not path.startswith("/"):
        path = "/" + path
    return cart_url(f"/{page_slug}{path}")


def market_product_url(product_slug: str, suffix: str = "", market_place=None) -> str:
    """Build a market product URL with the correct page/market prefix.

    Resolves the prefix from:
      - market app context: g.post_slug + g.market_slug
      - cart app context:   g.page_slug + market_place.slug
    """
    from quart import g

    page_slug = getattr(g, "post_slug", None) or getattr(g, "page_slug", None)
    ms = getattr(g, "market_slug", None) or (
        getattr(market_place, "slug", None) if market_place else None
    )
    prefix = f"/{page_slug}/{ms}" if page_slug and ms else ""
    tail = f"/{suffix}" if suffix else "/"
    return market_url(f"{prefix}/product/{product_slug}{tail}")


def login_url(next_url: str = "") -> str:
    from quart import current_app

    # Account handles login directly (magic link flow — it's the OAuth server)
    if current_app.name == "account":
        base = "/auth/login/"
        params: list[str] = []
        if next_url:
            params.append(f"next={quote(next_url, safe='')}")
        from quart import session as qsession
        cart_sid = qsession.get("cart_sid")
        if cart_sid:
            params.append(f"cart_sid={quote(cart_sid, safe='')}")
        if params:
            return f"{base}?{'&'.join(params)}"
        return base

    # Client apps: local /auth/login triggers OAuth redirect to account
    base = "/auth/login/"
    if next_url:
        return f"{base}?next={quote(next_url, safe='')}"
    return base
