"""
Structured logging for QA Copilot (Roadmap 6.4).

JSON log format when QA_LOG_FORMAT=json. Plain text otherwise.
Drop-in replacement for print() in key locations.
"""
from __future__ import annotations

import json
import os
import sys
import time
from datetime import datetime, timezone

_LOG_FORMAT = os.environ.get("QA_LOG_FORMAT", "plain")  # "json" or "plain"
_LOG_LEVEL = os.environ.get("QA_LOG_LEVEL", "INFO").upper()
_LEVELS = {"DEBUG": 0, "INFO": 1, "WARN": 2, "ERROR": 3, "CRITICAL": 4}


def get_logger(name: str) -> "Logger":
    """Get a logger with the given name."""
    return Logger(name)


class Logger:
    def __init__(self, name: str):
        self.name = name

    def debug(self, msg: str, **extra):
        self._log("DEBUG", msg, **extra)

    def info(self, msg: str, **extra):
        self._log("INFO", msg, **extra)

    def warn(self, msg: str, **extra):
        self._log("WARN", msg, **extra)

    def error(self, msg: str, **extra):
        self._log("ERROR", msg, **extra)

    def critical(self, msg: str, **extra):
        self._log("CRITICAL", msg, **extra)

    def _log(self, level: str, msg: str, **extra):
        if _LEVELS.get(level, 0) < _LEVELS.get(_LOG_LEVEL, 0):
            return
        if _LOG_FORMAT == "json":
            entry = {
                "timestamp": datetime.now(timezone.utc).isoformat(),
                "level": level,
                "source": self.name,
                "message": msg,
                **extra,
            }
            print(json.dumps(entry, ensure_ascii=False), file=sys.stderr, flush=True)
        else:
            prefix = f"  [{self.name}]" if self.name else " "
            extra_str = f" {extra}" if extra else ""
            print(f"{prefix} {msg}{extra_str}", flush=True)
