import os
import traceback
from loguru import logger
from src.config.settings import settings

try:
    from core_utilities.cloudwatch_service import CloudWatchService
except ImportError:
    CloudWatchService = None

logger.remove()

logger.add("logs/error.log", rotation="10 MB", level="ERROR", format="{time} | {level} | {message}", filter=lambda record: record["level"].name == "ERROR")
logger.add("logs/debug.log", rotation="10 MB", level="DEBUG", format="{time} | {level} | {message}", filter=lambda record: record["level"].name == "DEBUG")
logger.add("logs/events.log", rotation="10 MB", level="INFO", format="{time} | {level} | EVENT: {message}", filter=lambda record: record["level"].name == "INFO")

def get_logger():
    return logger

# --- CloudWatch Logging ---
def get_cloudwatch_logger(stream_name: str = None):
    if not CloudWatchService:
        return None
        
    log_group = os.environ.get('CLOUDWATCH_GROUP')
    log_stream = stream_name or os.environ.get('CLOUDWATCH_STREAM')
    aws_access_key = os.environ.get('CLOUDWATCH_ACCESS_KEY')
    aws_secret_key = os.environ.get('CLOUDWATCH_SECRET_KEY')
    
    return CloudWatchService(
        log_group_name=log_group, 
        log_stream_name=log_stream,
        aws_access_key_id=aws_access_key,
        aws_secret_access_key=aws_secret_key
    )

def log_exception(cw_logger, message="Exception occurred"):
    error_stack_trace = traceback.format_exc()
    log_message = f"EXCEPTION: {message}\n{error_stack_trace}"
    if cw_logger:
        cw_logger.send_log_event(log_message)

def log_progress(cw_logger, user_email, script_name, status, duration=None):
    if not cw_logger:
        return
    msg = f"PROGRESS | User: {user_email or 'Unknown'} | Task: {script_name} | Status: {status}"
    if duration is not None:
        msg += f" | Duration: {duration:.2f}s"
    cw_logger.send_log_event(msg)

def with_cloudwatch_logging(stream_name="merchant-risk"):
    import functools
    def decorator(func):
        @functools.wraps(func)
        def wrapper(self, *args, **kwargs):
            try:
                return func(self, *args, **kwargs)
            except Exception as e:
                cw_logger = get_cloudwatch_logger(stream_name=stream_name)
                log_exception(cw_logger, f"Exception in {self.__class__.__name__}.{func.__name__}")
                raise e
        return wrapper
    return decorator
