from __future__ import annotations
from typing import Protocol, runtime_checkable
from zempy.zosapi.editors.enums.solve_type import SolveType
from zempy.zosapi.editors.protocols.solve import *

@runtime_checkable
class ISolveData(Protocol):
    """ZOSAPI.Editors.ISolveData interface — base for all solve types."""
    @property
    def IsValid(self) -> bool: ...
    @property
    def Type(self) -> SolveType: ...

    # Typed view convenience properties
    @property
    def _S_None(self) -> ISolveNone: ...
    @property
    def _S_Fixed(self) -> ISolveFixed: ...
    @property
    def _S_Variable(self) -> ISolveVariable: ...
    @property
    def _S_SurfacePickup(self) -> ISolveSurfacePickup: ...
    @property
    def _S_ZPLMacro(self) -> ISolveZPLMacro: ...
    @property
    def _S_MarginalRayAngle(self) -> ISolveMarginalRayAngle: ...
    @property
    def _S_MarginalRayHeight(self) -> ISolveMarginalRayHeight: ...
    @property
    def _S_ChiefRayAngle(self) -> ISolveChiefRayAngle: ...
    @property
    def _S_MarginalRayNormal(self) -> ISolveMarginalRayNormal: ...
    @property
    def _S_ChiefRayNormal(self) -> ISolveChiefRayNormal: ...
    @property
    def _S_Aplanatic(self) -> ISolveAplanatic: ...
    @property
    def _S_ElementPower(self) -> ISolveElementPower: ...
    @property
    def _S_CocentricSurface(self) -> ISolveCocentricSurface: ...
    @property
    def _S_CocentricRadius(self) -> ISolveCocentricRadius: ...
    @property
    def _S_FNumber(self) -> ISolveFNumber: ...
    @property
    def _S_ChiefRayHeight(self) -> ISolveChiefRayHeight: ...
    @property
    def _S_EdgeThickness(self) -> ISolveEdgeThickness: ...
    @property
    def _S_OpticalPathDifference(self) -> ISolveOpticalPathDifference: ...
    @property
    def _S_Position(self) -> ISolvePosition: ...
    @property
    def _S_Compensator(self) -> ISolveCompensator: ...
    @property
    def _S_CenterOfCurvature(self) -> ISolveCenterOfCurvature: ...
    @property
    def _S_PupilPosition(self) -> ISolvePupilPosition: ...
    @property
    def _S_MaterialModel(self) -> ISolveMaterialModel: ...
    @property
    def _S_MaterialSubstitute(self) -> ISolveMaterialSubstitute: ...
    @property
    def _S_MaterialOffset(self) -> ISolveMaterialOffset: ...
    @property
    def _S_Automatic(self) -> ISolveAutomatic: ...
    @property
    def _S_Maximum(self) -> ISolveMaximum: ...
    @property
    def _S_PickupChiefRay(self) -> ISolvePickupChiefRay: ...
    @property
    def _S_ObjectPickup(self) -> ISolveObjectPickup: ...
    @property
    def _S_ConfigPickup(self) -> ISolveConfigPickup: ...
    @property
    def _S_ThermalPickup(self) -> ISolveThermalPickup: ...
    @property
    def _S_FieldPickup(self) -> ISolveFieldPickup: ...
    @property
    def _S_DuplicateSag(self) -> ISolveDuplicateSag: ...
    @property
    def _S_InvertSag(self) -> ISolveInvertSag: ...
