"""
sys_settings.py
---------------
Safe accessor for admin-managed SystemSetting key/value pairs.

Usage
-----
    from contract.utils.sys_settings import get_system_setting

    base_url = get_system_setting('MARKETPLACE_PUBLIC_BASE_URL')

The lookup order for any setting is:

    1.  The active SystemSetting row with the matching key (admin-controlled).
    2.  The matching attribute on Django's ``settings`` module (environment /
        settings.py fallback).
    3.  The caller-supplied ``default`` value.

This means the admin dashboard always wins, while the existing .env / settings.py
config continues to work as a fallback so existing deployments are unaffected.
"""

import logging

from django.conf import settings as django_settings

logger = logging.getLogger(__name__)


DEFAULT_SUPPORT_EMAIL = "bomabestservices@gmail.com"
DEFAULT_SUPPORT_PHONE = "+254 758 928 254"


def get_system_setting(key: str, default: str = "") -> str:
    """
    Return the value of the named system setting.

    Tries the database first (``SystemSetting`` model), then falls back to
    ``django.conf.settings``, then to ``default``.

    Args:
        key:     Setting key, e.g. ``'MARKETPLACE_PUBLIC_BASE_URL'``.
        default: Value to return when the key cannot be resolved anywhere.

    Returns:
        The resolved string value, stripped of leading/trailing whitespace.
    """
    # --- 1. Database (admin-controlled) ---
    try:
        from contract.models import SystemSetting  # local import avoids circular deps

        row = SystemSetting.objects.filter(key=key, is_active=True).only("value").first()
        if row is not None:
            return str(row.value or "").strip()
    except Exception:
        # Table might not exist yet during first migration run.
        logger.debug("SystemSetting lookup failed for key %r (table may not exist yet).", key)

    # --- 2. Django settings / .env ---
    env_value = str(getattr(django_settings, key, "") or "").strip()
    if env_value:
        return env_value

    # --- 3. Caller default ---
    return str(default or "").strip()


def get_marketplace_public_base_url() -> str:
    """
    Shortcut: return the marketplace public base URL, stripped of trailing slashes.

    This is the canonical URL that every public-facing link builder should use.
    It reads from admin SystemSetting first, then MARKET_PUBLIC_BASE_URL in settings,
    then falls back to any other site-base-URL setting.

    Example return value: ``'https://market.bomabest.co.ke'``
    """
    # Try MARKETPLACE_PUBLIC_BASE_URL (the new canonical admin key) first.
    value = get_system_setting("MARKETPLACE_PUBLIC_BASE_URL", default="")
    if value:
        return value.rstrip("/")

    # Try the existing settings.py chain so nothing breaks without a DB row.
    for attr in (
        "MARKET_PUBLIC_BASE_URL",
        "FRONTEND_PUBLIC_BASE_URL",
        "SITE_BASE_URL",
        "CONTRACT_PUBLIC_BASE_URL",
        "BASE_URL",
    ):
        val = str(getattr(django_settings, attr, "") or "").strip().rstrip("/")
        if val:
            return val

    return ""


def get_support_email(default: str = DEFAULT_SUPPORT_EMAIL) -> str:
    """
    Resolve the support email from admin-managed settings first.

    Accepted keys:
    - ``MARKETPLACE_SUPPORT_EMAIL``
    - ``SUPPORT_EMAIL``
    """
    for key in ("MARKETPLACE_SUPPORT_EMAIL", "SUPPORT_EMAIL"):
        value = get_system_setting(key, default="")
        if value:
            return value

    return str(default or DEFAULT_SUPPORT_EMAIL).strip()


def get_support_phone(default: str = DEFAULT_SUPPORT_PHONE) -> str:
    """
    Resolve the support phone from admin-managed settings first.

    Accepted keys:
    - ``MARKETPLACE_SUPPORT_PHONE``
    - ``SUPPORT_PHONE``
    """
    for key in ("MARKETPLACE_SUPPORT_PHONE", "SUPPORT_PHONE"):
        value = get_system_setting(key, default="")
        if value:
            return value

    return str(default or DEFAULT_SUPPORT_PHONE).strip()


def get_support_contacts() -> dict:
    """
    Return the active support contacts used across marketplace and payment flows.
    """
    return {
        "email": get_support_email(),
        "phone": get_support_phone(),
    }
