from __future__ import annotations

"""Unified Drawing Takeoff Service for DSCons ERP."""

import logging

from app.core.postgres.erp_client import ErpDatabaseClient
from app.core.settings import get_settings
from app.modules.takeoff.application.cad_converter_service import (
    CadConverterService,
    get_cad_converter_service,
)
from app.modules.agents.application.llm_client import LLMClient
from app.modules.takeoff.application.cad_converter import CadBlueprintConverter
from app.modules.takeoff.application.learning_memory import TakeoffLearningMemoryEngine
from app.modules.takeoff.application.vision_reasoning import TakeoffVisionReasoningEngine
from app.modules.takeoff.application.vietnamese_cad_font_transcoder import (
    VietnameseCadFontTranscoder,
    get_vietnamese_cad_font_transcoder,
)

from .cad_renderer import DrawingCadRendererMixin
from .inverse_bim_mixin import DrawingInverseBimMixin
from .pdf_structure import DrawingPdfStructureMixin
from .pipeline import DrawingPipelineMixin
from .pricing_state import DrawingPricingStateMixin
from .vision_analyzer import DrawingVisionAnalyzerMixin

logger = logging.getLogger(__name__)


class DrawingTakeoffService(
    DrawingCadRendererMixin,
    DrawingInverseBimMixin,
    DrawingPdfStructureMixin,
    DrawingPricingStateMixin,
    DrawingVisionAnalyzerMixin,
    DrawingPipelineMixin,
):
    """Unified CAD Drawing Takeoff & 2026 Cost Estimation Service."""

    def __init__(
        self,
        erp_client: ErpDatabaseClient | None = None,
        llm_client: LLMClient | None = None,
        cad_converter: CadConverterService | None = None,
        font_transcoder: VietnameseCadFontTranscoder | None = None,
    ):
        self._erp_client = erp_client or ErpDatabaseClient()
        self._settings = get_settings()
        self._llm_client = llm_client or LLMClient(self._settings)
        self._cad_converter = cad_converter or get_cad_converter_service()
        self._font_transcoder = font_transcoder or get_vietnamese_cad_font_transcoder()

        # Modular engines
        self._cad_pkg = CadBlueprintConverter()
        self._vision_pkg = TakeoffVisionReasoningEngine(
            self._erp_client, self._llm_client
        )
        self._learning_pkg = TakeoffLearningMemoryEngine(
            self._erp_client, self._llm_client
        )


_instance: DrawingTakeoffService | None = None


def get_drawing_takeoff_service() -> DrawingTakeoffService:
    global _instance
    if _instance is None:
        _instance = DrawingTakeoffService()
    return _instance
