# pyright: ignore
"""
Utility functions for the Docling converter.
"""

import logging
import sys
from pathlib import Path
from typing import Tuple

from loguru import logger


def setup_logging(verbose: bool = False):
    """
    Configure logging with loguru.

    Args:
        verbose: Enable debug logging if True
    """
    # Remove default handler
    logger.remove()

    # Add custom handler
    level = "DEBUG" if verbose else "INFO"
    logger.add(
        sys.stderr, format="<green>{time:HH:mm:ss}</green> | <level>{level}</level> | {message}", level=level
    )


def suppress_library_logging():
    """Suppress verbose logging from libraries."""
    logging.getLogger("docling").setLevel(logging.WARNING)
    logging.getLogger("torch").setLevel(logging.WARNING)
    logging.getLogger("transformers").setLevel(logging.WARNING)
    logging.getLogger("accelerate").setLevel(logging.WARNING)


def analyze_gpu_metrics(metrics_file: Path) -> Tuple[float, float, float]:
    """
    Analyze GPU metrics from monitoring log.

    Args:
        metrics_file: Path to GPU metrics log file

    Returns:
        Tuple of (avg_gpu_usage, peak_gpu_usage, avg_memory_usage)
    """
    if not metrics_file.exists():
        return 0.0, 0.0, 0.0

    gpu_usages = []
    memory_usages = []

    with open(metrics_file, "r") as f:
        lines = f.readlines()[1:]  # Skip header

    for line in lines:
        parts = line.strip().split(", ")
        if len(parts) >= 5:
            try:
                gpu_usage = float(parts[3])
                memory_usage = float(parts[4])
                gpu_usages.append(gpu_usage)
                memory_usages.append(memory_usage)
            except (ValueError, IndexError):
                continue

    if not gpu_usages:
        return 0.0, 0.0, 0.0

    avg_gpu = sum(gpu_usages) / len(gpu_usages)
    peak_gpu = max(gpu_usages)
    avg_memory = sum(memory_usages) / len(memory_usages) if memory_usages else 0.0

    return avg_gpu, peak_gpu, avg_memory


def format_time(seconds: float) -> str:
    """
    Format seconds into human-readable time.

    Args:
        seconds: Time in seconds

    Returns:
        Formatted time string
    """
    if seconds < 60:
        return f"{seconds:.1f}s"
    minutes = int(seconds // 60)
    secs = seconds % 60
    return f"{minutes}m {secs:.1f}s"
