{-# LANGUAGE OverloadedStrings, FlexibleInstances #-}

module Stack.Types.Urls where

import Control.Applicative
import Data.Aeson.Extended
import Data.Text (Text)
import Data.Monoid
import Prelude

data Urls = Urls
    { urlsLatestSnapshot :: !Text
    , urlsLtsBuildPlans :: !Text
    , urlsNightlyBuildPlans :: !Text
    }
    deriving Show

-- TODO: Really need this instance?
instance FromJSON (WithJSONWarnings Urls) where
    parseJSON = withObjectWarnings "Urls" $ \o -> do
        Urls
            <$> o ..: "latest-snapshot"
            <*> o ..: "lts-build-plans"
            <*> o ..: "nightly-build-plans"

data UrlsMonoid = UrlsMonoid
    { urlsMonoidLatestSnapshot :: !(Maybe Text)
    , urlsMonoidLtsBuildPlans :: !(Maybe Text)
    , urlsMonoidNightlyBuildPlans :: !(Maybe Text)
    }
    deriving Show

instance FromJSON (WithJSONWarnings UrlsMonoid) where
    parseJSON = withObjectWarnings "UrlsMonoid" $ \o -> do
        UrlsMonoid
            <$> o ..: "latest-snapshot"
            <*> o ..: "lts-build-plans"
            <*> o ..: "nightly-build-plans"

instance Monoid UrlsMonoid where
    mempty = UrlsMonoid Nothing Nothing Nothing
    mappend l r = UrlsMonoid
      { urlsMonoidLatestSnapshot = urlsMonoidLatestSnapshot l <|> urlsMonoidLatestSnapshot r
      , urlsMonoidLtsBuildPlans = urlsMonoidLtsBuildPlans l <|> urlsMonoidLtsBuildPlans r
      , urlsMonoidNightlyBuildPlans = urlsMonoidNightlyBuildPlans l <|> urlsMonoidNightlyBuildPlans r
      }