-- Copyright (c) 2016-present, SoundCloud Ltd.
-- All rights reserved.
--
-- This source code is distributed under the terms of a MIT license,
-- found in the LICENSE file.

{-# LANGUAGE DeriveGeneric              #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE TemplateHaskell            #-}

module Kubernetes.Model.V1.Service
    ( Service (..)
    , kind
    , apiVersion
    , metadata
    , spec
    , status
    , mkService
    ) where

import           Control.Lens.TH                   (makeLenses)
import           Data.Aeson.TH                     (defaultOptions, deriveJSON,
                                                    fieldLabelModifier)
import           Data.Text                         (Text)
import           GHC.Generics                      (Generic)
import           Kubernetes.Model.V1.ObjectMeta    (ObjectMeta)
import           Kubernetes.Model.V1.ServiceSpec   (ServiceSpec)
import           Kubernetes.Model.V1.ServiceStatus (ServiceStatus)
import           Prelude                           hiding (drop, error, max,
                                                    min)
import qualified Prelude                           as P
import           Test.QuickCheck                   (Arbitrary, arbitrary)
import           Test.QuickCheck.Instances         ()

-- | Service is a named abstraction of software service (for example, mysql) consisting of local port (for example 3306) that the proxy listens on, and the selector that determines which pods will answer requests sent through the proxy.
data Service = Service
    { _kind       :: !(Maybe Text)
    , _apiVersion :: !(Maybe Text)
    , _metadata   :: !(Maybe ObjectMeta)
    , _spec       :: !(Maybe ServiceSpec)
    , _status     :: !(Maybe ServiceStatus)
    } deriving (Show, Eq, Generic)

makeLenses ''Service

$(deriveJSON defaultOptions{fieldLabelModifier = (\n -> if n == "_type_" then "type" else P.drop 1 n)} ''Service)

instance Arbitrary Service where
    arbitrary = Service <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary

-- | Use this method to build a Service
mkService :: Service
mkService = Service Nothing Nothing Nothing Nothing Nothing