from dataclasses import dataclass, field
import os
from typing import (
    Dict,
    List,
    Literal,
    Optional,
    Tuple,
    Union,
    Any,
    Callable,
    Mapping,
    Sequence,
)
from enum import Enum
from composition_configs import core_config, type_defs, io_types
from file_manager import work_file_manager
[docs]
@dataclass(frozen=True)
class SymbologyLayerSpec:
    unique_name: str
    input_feature: io_types.GdbIOArg
    input_lyrx: str
    grouped_lyrx: bool
    target_layer_name: Optional[str] = None 
[docs]
@dataclass(frozen=True)
class BarrierRule:
    name: str
    gap_meters: int
    use_turn_orientation: bool = False 
[docs]
@dataclass(frozen=True, slots=True)
class BarrierDefault:
    gap_meters: int
    use_turn_orientation: bool = False 
[docs]
@dataclass(frozen=True, slots=True)
class BarrierOverride:
    gap_meters: Optional[int] = None
    use_turn_orientation: Optional[bool] = None 
[docs]
@dataclass(frozen=True)
class RbcPolygonInitKwargs:
    input_data_structure: list[SymbologyLayerSpec]
    output_building_polygons: io_types.GdbIOArg
    output_collapsed_polygon_points: io_types.GdbIOArg
    work_file_manager_config: core_config.WorkFileConfig
    building_unique_name: str
    barrier_default: BarrierDefault
    barrier_overrides: Optional[List[BarrierRule]] = None 
[docs]
@dataclass(frozen=True)
class RbcPointsInitKwargs:
    input_data_structure: List[SymbologyLayerSpec]
    building_points_unique_name: str
    building_polygons_unique_name: str
    building_gap_distance_m: int
    output_points_after_rbc: io_types.GdbIOArg
    output_polygons_after_rbc: io_types.GdbIOArg
    work_file_manager_config: core_config.WorkFileConfig
    building_symbol_dimension: dict[int, tuple]
    barrier_default: BarrierDefault
    barrier_overrides: Optional[List[BarrierRule]] = None
    map_scale: str = "100000" 
[docs]
@dataclass(frozen=True)
class BegrensningskurveLandWaterKwargs:
    input_begrensningskurve: io_types.GdbIOArg
    input_land_cover_features: io_types.GdbIOArg
    output_begrensningskurve: io_types.GdbIOArg
    water_feature_buffer_width: int
    water_barrier_buffer_width: int
    work_file_manager_config: core_config.WorkFileConfig 
[docs]
@dataclass(frozen=True)
class LineToBufferSymbologyKwargs:
    input_line: io_types.GdbIOArg
    output_line: io_types.GdbIOArg
    sql_selection_query: dict
    work_file_manager_config: core_config.WorkFileConfig
    buffer_distance_factor: Union[int, float] = 1
    buffer_distance_addition: Union[int, float] = 0 
[docs]
@dataclass(frozen=True)
class BufferDisplacementKwargs:
    input_road_line: io_types.GdbIOArg
    input_building_points: io_types.GdbIOArg
    input_line_barriers: Dict[str, Any]
    output_building_points: io_types.GdbIOArg
    sql_selection_query: dict
    building_symbol_dimension: Dict[int, Tuple[int, int]]
    displacement_distance_m: int
    work_file_manager_config: core_config.WorkFileConfig 
[docs]
@dataclass(frozen=True)
class ThinRoadNetworkKwargs:
    input_road_line: io_types.GdbIOArg
    output_road_line: io_types.GdbIOArg
    work_file_manager_config: core_config.WorkFileConfig
    minimum_length: int
    invisibility_field_name: str
    hierarchy_field_name: str
    special_selection_sql: str | None = None 
[docs]
@dataclass(frozen=True)
class CollapseRoadDetailsKwargs:
    input_road_line: io_types.GdbIOArg
    output_road_line: io_types.GdbIOArg
    merge_distnace_m: int
    collapse_field_name: Optional[str] = None 
[docs]
@dataclass(frozen=True)
class RrcInitKwargs:
    input_data_structure: List[SymbologyLayerSpec]
    work_file_manager_config: core_config.WorkFileConfig
    primary_road_unique_name: str
    output_road_feature: io_types.GdbIOArg
    output_displacement_feature: io_types.GdbIOArg
    map_scale: str = "100000"
    hierarchy_field: str = "hierarchy" 
[docs]
@dataclass(frozen=True)
class DissolveInitKwargs:
    """
    Configuration for DissolveWithIntersections.
    input_line_feature: path or InjectIO to the input line feature
    output_processed_feature: path or InjectIO for the final merged intersections (or single)
    work_file_manager_config: WorkFileManager behavior (root_file, in-memory, keep_files)
    dissolve_fields: optional list of fields to dissolve on; if None -> dissolve all (single-part)
    sql_expressions: optional list of SQL where-clauses to split/segment, each produces its own FTL result
    """
    input_line_feature: io_types.GdbIOArg
    output_processed_feature: io_types.GdbIOArg
    work_file_manager_config: core_config.WorkFileConfig
    dissolve_fields: Optional[List[str]] = None
    sql_expressions: Optional[List[str]] = None