import logging
from logging.handlers import TimedRotatingFileHandler
import os
from opentelemetry._logs import set_logger_provider
from opentelemetry.exporter.otlp.proto.http._log_exporter import OTLPLogExporter
from opentelemetry.sdk._logs import LoggerProvider, LoggingHandler
from opentelemetry.sdk._logs.export import BatchLogRecordProcessor
from opentelemetry.sdk.resources import Resource
from config.endpoints import OTEL_ENDPOINTS


class APILogger:
    def __init__(self, log_file, environment):
        self.logger = logging.getLogger("cqa")
        self._add_file_handler(log_file)
        self._add_otlp_handler(environment)

    def _add_file_handler(self, log_file):
        file_handler = TimedRotatingFileHandler(
            log_file, when="midnight", interval=30, backupCount=1
        )
        file_handler.setFormatter(
            logging.Formatter("[%(asctime)s] [%(levelname)s] %(name)s: %(message)s")
        )
        self.logger.addHandler(file_handler)

    def _add_otlp_handler(self, environment):
        endpoint = OTEL_ENDPOINTS.get(environment)
        token = os.getenv("FLAVA_LOGSTORE_TOKEN", "")
        resource = Resource.create(
            {
                "service.name": "cqa-test-app",
                "environment": environment,
                "flava_logstore_token": token,
            }
        )
        logger_provider = LoggerProvider(resource=resource)
        set_logger_provider(logger_provider)
        exporter = OTLPLogExporter(endpoint=endpoint)
        logger_provider.add_log_record_processor(BatchLogRecordProcessor(exporter))
        otlp_handler = LoggingHandler(
            level=logging.NOTSET, logger_provider=logger_provider
        )
        self.logger.addHandler(otlp_handler)
