"""
Inverse-BIM Constraint Solver Port Interface (Domain Core).
Protocol contract for extracting parametric constraints from CAD vector entities
and computing deterministic solid volumes.
"""

from __future__ import annotations

from pathlib import Path
from typing import Any, Protocol, runtime_checkable
from app.modules.takeoff.domain.inverse_bim_models import (
    InverseBimParametricModel,
    SolidTakeoffQuantities,
)


@runtime_checkable
class InverseBimSolverPort(Protocol):
    """Domain Port for Inverse-BIM Constraint Solver."""

    def extract_parametric_constraints(
        self,
        cad_source: str | Path,
        **kwargs: Any,
    ) -> InverseBimParametricModel:
        """Extract grid axes, cross-section dimensions, and segment models from CAD geometry."""
        ...

    def compute_deterministic_solids(
        self,
        model: InverseBimParametricModel,
    ) -> SolidTakeoffQuantities:
        """Compute exact solid volumes (concrete m3, formwork m2, foundation, earthwork) from constraints."""
        ...
