"""Deterministic astronomical and terrain-solar state definitions."""

from __future__ import annotations

import math
from enum import Enum


class AstronomicalState(str, Enum):
    """Geometric solar-elevation band, independent of terrain."""

    DAY = "DAY"
    CIVIL_TWILIGHT = "CIVIL_TWILIGHT"
    NAUTICAL_TWILIGHT = "NAUTICAL_TWILIGHT"
    ASTRONOMICAL_TWILIGHT = "ASTRONOMICAL_TWILIGHT"
    NIGHT = "NIGHT"


class TerrainSolarVisibility(str, Enum):
    """Terrain visibility applicable to the astronomical state."""

    DIRECT = "DIRECT"
    SHADOW = "SHADOW"
    NOT_APPLICABLE = "NOT_APPLICABLE"
    UNKNOWN = "UNKNOWN"


def classify_astronomical_state(solar_elevation_deg: float) -> AstronomicalState:
    """Classify geometric solar elevation without refraction correction."""
    if not math.isfinite(solar_elevation_deg):
        raise ValueError("solar elevation must be finite")
    if solar_elevation_deg >= 0:
        return AstronomicalState.DAY
    if solar_elevation_deg >= -6:
        return AstronomicalState.CIVIL_TWILIGHT
    if solar_elevation_deg >= -12:
        return AstronomicalState.NAUTICAL_TWILIGHT
    if solar_elevation_deg >= -18:
        return AstronomicalState.ASTRONOMICAL_TWILIGHT
    return AstronomicalState.NIGHT
