from __future__ import annotations

import os
from dataclasses import dataclass

from src.config.config_file import CONFIG_FILE_USED_ENV_VAR


@dataclass(frozen=True)
class ConfigKey:
    name: str
    aliases: tuple[str, ...]
    secret: bool


def build_human_config_report() -> str:
    used = os.environ.get(CONFIG_FILE_USED_ENV_VAR, "").strip()
    header = f"Config show\n- config_file: {used or 'none'}"
    lines = [header]
    for key in _keys():
        value, source = _lookup(key)
        lines.append(_format_line(key, value=value, source=source))
    return "\n".join(lines)


def _keys() -> list[ConfigKey]:
    return [
        ConfigKey(name="INBOX_PATH", aliases=("INBOX_PATH",), secret=False),
        ConfigKey(name="OUTPUT_ROOT", aliases=("OUTPUT_ROOT",), secret=False),
        ConfigKey(
            name="PIPEDRIVE_API_TOKEN",
            aliases=("PIPE_DRIVE_API_TOKEN", "PIPEDRIVE_API_TOKEN"),
            secret=True,
        ),
        ConfigKey(name="PIPEDRIVE_BASE_URL", aliases=("PIPEDRIVE_BASE_URL",), secret=False),
        ConfigKey(
            name="PIPEDRIVE_FIELD_MAPPING_PATH",
            aliases=("PIPEDRIVE_FIELD_MAPPING_PATH",),
            secret=False,
        ),
        ConfigKey(
            name="PIPEDRIVE_ALLOW_INSECURE_HTTP",
            aliases=("PIPEDRIVE_ALLOW_INSECURE_HTTP",),
            secret=False,
        ),
        ConfigKey(name="MATCH_DATE_WINDOW_DAYS", aliases=("MATCH_DATE_WINDOW_DAYS",), secret=False),
        ConfigKey(name="MATCH_MAX_DISTANCE_M", aliases=("MATCH_MAX_DISTANCE_M",), secret=False),
        ConfigKey(name="WEBSITE_WEBP_TARGET_KB", aliases=("WEBSITE_WEBP_TARGET_KB",), secret=False),
        ConfigKey(name="GBP_MIN_SIZE", aliases=("GBP_MIN_SIZE",), secret=False),
        ConfigKey(name="GBP_PUBLISH_DRY_RUN", aliases=("GBP_PUBLISH_DRY_RUN",), secret=False),
        ConfigKey(name="GBP_LOCATION_ID_MAP", aliases=("GBP_LOCATION_ID_MAP",), secret=True),
        ConfigKey(name="GBP_ACCOUNT_ID", aliases=("GBP_ACCOUNT_ID",), secret=False),
        ConfigKey(name="GBP_ACCESS_TOKEN", aliases=("GBP_ACCESS_TOKEN",), secret=True),
        ConfigKey(name="GBP_BASE_URL", aliases=("GBP_BASE_URL",), secret=False),
        ConfigKey(
            name="GBP_ALLOW_INSECURE_HTTP", aliases=("GBP_ALLOW_INSECURE_HTTP",), secret=False
        ),
    ]


def _lookup(key: ConfigKey) -> tuple[str | None, str | None]:
    for name in key.aliases:
        raw = os.environ.get(name)
        if raw is None:
            continue
        value = raw.strip()
        if value:
            return (value, name)
    return (None, None)


def _format_line(key: ConfigKey, *, value: str | None, source: str | None) -> str:
    src = f" (from {source})" if source and source != key.name else ""
    if not value:
        return f"- {key.name}: MISSING"
    if key.secret:
        return f"- {key.name}: SET{src}"
    return f"- {key.name}: {value}{src}"
