-- |

-- Module:      Data.Geo.Jord.EcefPosition

-- Copyright:   (c) 2018 Cedric Liegeois

-- License:     BSD3

-- Maintainer:  Cedric Liegeois <ofmooseandmen@yahoo.fr>

-- Stability:   experimental

-- Portability: portable

--

-- Earth Centred, Earth Fixed (ECEF) position.

--

-- See <http://clynchg3c.com/Technote/geodesy/coorddef.pdf Earth Coordinates>

--

module Data.Geo.Jord.EcefPosition
    ( EcefPosition
    , ecef
    , ecefMetres
    , ex
    , ey
    , ez
    ) where

import Data.Geo.Jord.Length
import Data.Geo.Jord.Vector3d

-- | An earth position expressed in the Earth Centred, Earth Fixed (ECEF) coordinates system.

--

-- @ex-ey@ plane is the equatorial plane, @ey@ is on the prime meridian, and @ez@ on the polar axis.

--

-- Note: on a spherical model earth, an n-vector is equivalent to a normalised version of an (ECEF) cartesian coordinate.

newtype EcefPosition =
    EcefPosition Vector3d
    deriving (Eq, Show)

instance IsVector3d EcefPosition where
    vec (EcefPosition v) = v

-- | 'EcefPosition' from given x, y and z length.

--

-- @ex-ey@ plane is the equatorial plane, @ey@ is on the prime meridian, and @ez@ on the polar axis.

ecef :: Length -> Length -> Length -> EcefPosition
ecef x y z = EcefPosition (Vector3d (toMetres x) (toMetres y) (toMetres z))

-- | 'EcefPosition' from given x, y and z length in _metres_.

--

-- @ex-ey@ plane is the equatorial plane, @ey@ is on the prime meridian, and @ez@ on the polar axis.

ecefMetres :: Double -> Double -> Double -> EcefPosition
ecefMetres x y z = ecef (metres x) (metres y) (metres z)

-- | x coordinate of the given '$tc'EcefPosition'.

ex :: EcefPosition -> Length
ex (EcefPosition v) = metres (vx v)

-- | y coordinate of the given '$tc'EcefPosition'.

ey :: EcefPosition -> Length
ey (EcefPosition v) = metres (vy v)

-- | z coordinate of the given '$tc'EcefPosition'.

ez :: EcefPosition -> Length
ez (EcefPosition v) = metres (vz v)