import json
import traceback

from proxy_manager import logger


class ParserLogger:
    def __init__(self, db_pool):
        self.db_pool = db_pool

    async def log(self, status: str, message: str, url: str = None, proxy: str = None, success: bool = None, **kwargs):
        valid_statuses = {'idle', 'parsing', 'proxy_change', 'queue_processing', 'waiting', 'queue'}
        if status not in valid_statuses:
            raise ValueError(f"Invalid status value: {status}")

        extra = kwargs if kwargs else None

        try:
            async with self.db_pool.acquire() as conn:
                async with conn.cursor() as cur:
                    await cur.execute(
                        """
                        INSERT INTO parser_logs 
                        (status, message, url, proxy, success, extra) 
                        VALUES (%s, %s, %s, %s, %s, %s)
                        """,
                        (status, message, url, proxy, success, json.dumps(extra, ensure_ascii=False) if extra else None)
                    )
                    await conn.commit()
            logger.info(f"Logged status: {status}, message: {message}")
        except Exception as e:
            logger.error(f"ParserLogger.log error: {e}\n{traceback.format_exc()}", exc_info=True)
