"""Core extractor library for Atomizer.

Available extractors:
- Displacement: extract_displacement
- Stress: extract_solid_stress (von Mises), extract_principal_stress
- Frequency: extract_frequency
- Mass (BDF): extract_mass_from_bdf
- Mass (Expression): extract_mass_from_expression
- Mass (Part): extract_part_mass_material, extract_part_mass, PartMassExtractor
- Strain Energy: extract_strain_energy, extract_total_strain_energy
- SPC Forces: extract_spc_forces, extract_total_reaction_force
- Zernike: extract_zernike_from_op2, ZernikeExtractor (telescope mirrors)
- Part Introspection: introspect_part (comprehensive NX .prt analysis)

Phase 2 Extractors (2025-12-06):
- Principal stress extraction (sigma1, sigma2, sigma3)
- Strain energy extraction (element strain energy)
- SPC forces extraction (reaction forces at boundary conditions)

Phase 3 Extractors (2025-12-06):
- Temperature extraction (thermal analysis: SOL 153/159)
- Thermal gradient extraction
- Heat flux extraction
- Modal mass extraction (modal effective mass from F06)

Phase 4 Extractors (2025-12-19):
- Part Introspection (E12): Comprehensive .prt analysis (expressions, mass, materials, attributes, groups, features)
"""

# Zernike extractor for telescope mirror optimization (standard Z-only method)
from optimization_engine.extractors.extract_zernike import (
    ZernikeExtractor,
    extract_zernike_from_op2,
    extract_zernike_filtered_rms,
    extract_zernike_relative_rms,
)

# Analytic (parabola-based) Zernike extractor (accounts for lateral X/Y displacement)
# Uses parabola formula - requires knowing focal length
from optimization_engine.extractors.extract_zernike_opd import (
    ZernikeAnalyticExtractor,
    extract_zernike_analytic,
    extract_zernike_analytic_filtered_rms,
    compare_zernike_methods,
    # Backwards compatibility (deprecated)
    ZernikeOPDExtractor as _ZernikeOPDExtractor_deprecated,
)

# OPD-based Zernike extractor (uses actual mesh geometry, no shape assumption)
# MOST RIGOROUS method - RECOMMENDED for telescope mirror optimization
from optimization_engine.extractors.extract_zernike_figure import (
    ZernikeOPDExtractor,
    extract_zernike_opd,
    extract_zernike_opd_filtered_rms,
    # Backwards compatibility (deprecated)
    ZernikeFigureExtractor,
    extract_zernike_figure,
    extract_zernike_figure_rms,
)

# Part mass and material extractor (from NX .prt files)
from optimization_engine.extractors.extract_part_mass_material import (
    extract_part_mass_material,
    extract_part_mass,
    extract_part_material,
    PartMassExtractor,
)

# Von Mises stress extraction
from optimization_engine.extractors.extract_von_mises_stress import (
    extract_solid_stress,
)

# Principal stress extraction (Phase 2)
from optimization_engine.extractors.extract_principal_stress import (
    extract_principal_stress,
    extract_max_principal_stress,
    extract_min_principal_stress,
)

# Strain energy extraction (Phase 2)
from optimization_engine.extractors.extract_strain_energy import (
    extract_strain_energy,
    extract_total_strain_energy,
    extract_strain_energy_density,
)

# SPC forces / reaction forces extraction (Phase 2)
from optimization_engine.extractors.extract_spc_forces import (
    extract_spc_forces,
    extract_total_reaction_force,
    extract_reaction_component,
    check_force_equilibrium,
)

# Temperature extraction (Phase 3)
from optimization_engine.extractors.extract_temperature import (
    extract_temperature,
    extract_temperature_gradient,
    extract_heat_flux,
    get_max_temperature,
)

# Modal mass extraction (Phase 3)
from optimization_engine.extractors.extract_modal_mass import (
    extract_modal_mass,
    extract_frequencies,
    get_first_frequency,
    get_modal_mass_ratio,
)

# Part introspection (Phase 4) - comprehensive .prt analysis
from optimization_engine.extractors.introspect_part import (
    introspect_part,
    get_expressions_dict,
    get_expression_value,
    print_introspection_summary,
)

__all__ = [
    # Part mass & material (from .prt)
    'extract_part_mass_material',
    'extract_part_mass',
    'extract_part_material',
    'PartMassExtractor',
    # Stress extractors
    'extract_solid_stress',
    'extract_principal_stress',
    'extract_max_principal_stress',
    'extract_min_principal_stress',
    # Strain energy
    'extract_strain_energy',
    'extract_total_strain_energy',
    'extract_strain_energy_density',
    # SPC forces / reactions
    'extract_spc_forces',
    'extract_total_reaction_force',
    'extract_reaction_component',
    'check_force_equilibrium',
    # Zernike (telescope mirrors) - Standard Z-only method
    'ZernikeExtractor',
    'extract_zernike_from_op2',
    'extract_zernike_filtered_rms',
    'extract_zernike_relative_rms',
    # Zernike OPD (RECOMMENDED - uses actual geometry, no shape assumption)
    'ZernikeOPDExtractor',
    'extract_zernike_opd',
    'extract_zernike_opd_filtered_rms',
    # Zernike Analytic (parabola-based with lateral displacement correction)
    'ZernikeAnalyticExtractor',
    'extract_zernike_analytic',
    'extract_zernike_analytic_filtered_rms',
    'compare_zernike_methods',
    # Backwards compatibility (deprecated)
    'ZernikeFigureExtractor',
    'extract_zernike_figure',
    'extract_zernike_figure_rms',
    # Temperature (Phase 3 - thermal)
    'extract_temperature',
    'extract_temperature_gradient',
    'extract_heat_flux',
    'get_max_temperature',
    # Modal mass (Phase 3 - dynamics)
    'extract_modal_mass',
    'extract_frequencies',
    'get_first_frequency',
    'get_modal_mass_ratio',
    # Part introspection (Phase 4)
    'introspect_part',
    'get_expressions_dict',
    'get_expression_value',
    'print_introspection_summary',
]
