module Data.GPS.Coordinate.Coordinate(
  Coordinate
, coordinate
, coordinate'
, coordinateLat
, coordinateLon
, coordinateLatlon
) where

import Prelude(Eq, Show, (.))
import Control.Lens(Iso', iso, mapping, swapped, withIso)
import Data.GPS.Coordinate.Latitude
import Data.GPS.Coordinate.Longitude
import Data.GPS.Coordinate.DegreesLatitude
import Data.GPS.Coordinate.DegreesLongitude
import Data.GPS.Coordinate.Minutes
import Data.GPS.Coordinate.Seconds

data Coordinate =
  Coordinate
    Latitude
    Longitude
  deriving (Eq, Show)

coordinate ::
  Iso' (Latitude, Longitude) Coordinate
coordinate =
  iso (\(lat, lon) -> Coordinate lat lon) (\(Coordinate lat lon) -> (lat, lon))

coordinate' ::
  Iso' (Longitude, Latitude) Coordinate
coordinate' =
  swapped . coordinate

coordinateLat ::
  Iso' ((DegreesLatitude, Minutes, Seconds), Longitude) Coordinate
coordinateLat =
  swapped . mapping latitude . coordinate'

coordinateLon ::
  Iso' (Latitude, (DegreesLongitude, Minutes, Seconds)) Coordinate
coordinateLon =
  mapping longitude . coordinate

coordinateLatlon ::
  Iso' ((DegreesLatitude, Minutes, Seconds), (DegreesLongitude, Minutes, Seconds)) Coordinate
coordinateLatlon =
  iso (\((td, tm, ts), (nd, nm, ns)) -> Coordinate (withIso latitude (\k _ -> k (td, tm, ts))) (withIso longitude (\k _ -> k (nd, nm, ns))))
      (\(Coordinate lat lon) -> (withIso latitude (\_ k -> k lat), withIso longitude (\_ k -> k lon)))