from urllib.parse import urljoin

from django.conf import settings
from django.urls import NoReverseMatch, reverse


def _force_https_if_needed(url):
    if not url:
        return url
    if not getattr(settings, "DEBUG", False) and url.startswith("http://"):
        return "https://" + url[len("http://") :]
    return url


def get_public_base_url(request=None):
    if request is not None:
        try:
            return _force_https_if_needed(request.build_absolute_uri("/").rstrip("/"))
        except Exception:
            pass

    base = (
        str(getattr(settings, "PUBLIC_BASE_URL", "") or "").strip()
        or str(getattr(settings, "BASE_URL", "") or "").strip()
        or str(getattr(settings, "SITE_DOMAIN", "") or "").strip()
        or "https://bomabest.co.ke"
    )
    return _force_https_if_needed(base.rstrip("/"))


def build_public_url(path="", request=None):
    target = str(path or "").strip()
    if target.startswith(("http://", "https://")):
        return _force_https_if_needed(target)

    base = get_public_base_url(request=request)
    if not target:
        return base

    return urljoin(f"{base}/", target.lstrip("/"))


def build_route_url(route_name, *args, request=None, kwargs=None):
    try:
        path = reverse(route_name, args=args, kwargs=kwargs)
    except NoReverseMatch:
        return build_public_url("", request=request)

    if request is not None:
        try:
            return _force_https_if_needed(request.build_absolute_uri(path))
        except Exception:
            pass
    return build_public_url(path, request=request)


def build_login_url(user=None, request=None, market=False):
    del user, market
    return build_route_url("market:login", request=request)
