module Data.Astro.Effects
(
  refract
  , Precession.AstronomyEpoch(..)
  , Precession.precession1
  , Precession.precession2
  , Nutation.nutationLongitude
  , Nutation.nutationObliquity
  , Aberration.includeAberration
  , Parallax.parallax
)
where
import Data.Astro.Types (DecimalDegrees(..), toRadians)
import qualified Data.Astro.Effects.Precession as Precession
import qualified Data.Astro.Effects.Nutation as Nutation
import qualified Data.Astro.Effects.Aberration as Aberration
import qualified Data.Astro.Effects.Parallax as Parallax
refract :: DecimalDegrees -> Double -> Double -> DecimalDegrees
refract altitude temperature pressure =
  let f = if altitude > (DD 15) then refractBigAlpha else refractSmallAlpha
  in f altitude temperature pressure
refractBigAlpha :: DecimalDegrees -> Double -> Double -> DecimalDegrees
refractBigAlpha altitude temperature pressure =
  let z = toRadians $ 90 - altitude  
  in DD $ 0.00452*pressure*(tan z) /(273+temperature) 
refractSmallAlpha :: DecimalDegrees -> Double -> Double -> DecimalDegrees
refractSmallAlpha altitude temperature pressure =
  let a = toRadians altitude
  in DD $ pressure*(0.1594+0.0196*a+0.00002*a*a)/((273+temperature)*(1+0.505*a+0.0845*a*a))