#!/usr/bin/env python3
"""
Helper wrapper to integrate monitoring with downloaders
"""

from functools import wraps
from modules.downloader_monitor import get_monitor


def monitor_download(downloader_name):
    """
    Decorator to monitor download attempts

    Usage:
        @monitor_download('fastdl')
        def download_function(username, ...):
            ...
            return count
    """
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            # Extract username from args or kwargs
            username = kwargs.get('username') or (args[0] if args else 'unknown')

            try:
                # Call the actual download function
                result = func(*args, **kwargs)

                # Determine success based on result
                if isinstance(result, int):
                    count = result
                    success = count > 0
                elif isinstance(result, dict):
                    count = result.get('count', 0)
                    success = result.get('success', count > 0)
                else:
                    count = 0
                    success = False

                # Log to monitor
                monitor = get_monitor()
                monitor.log_download_attempt(
                    downloader=downloader_name,
                    username=username,
                    success=success,
                    file_count=count,
                    error_message=None
                )

                return result

            except Exception as e:
                # Log failure
                monitor = get_monitor()
                monitor.log_download_attempt(
                    downloader=downloader_name,
                    username=username,
                    success=False,
                    file_count=0,
                    error_message=str(e)
                )
                raise

        return wrapper
    return decorator


def log_download_result(downloader: str, username: str, count: int, error: str = None):
    """
    Simple function to log download result to monitor

    Args:
        downloader: Downloader name (fastdl, imginn, etc.)
        username: Username
        count: Number of files downloaded
        error: Error message if failed
    """
    monitor = get_monitor()
    monitor.log_download_attempt(
        downloader=downloader,
        username=username,
        success=(error is None),
        file_count=count,
        error_message=error
    )
