module Control.Flipper.Adapters.Postgres.Internal.Query
    ( selectFeatures
    , selectActorsByFeatureId
    , findFeature
    , insertActor
    , deleteActor
    , insertFeature
    , updateFeature
    , countActors
    , countFeatures
    ) where

import           Control.Flipper.Adapters.Postgres.Models as M
import qualified Control.Flipper.Types                    as T

{- |
Selects all feature records
-}
selectFeatures :: SqlPersistT IO [Entity Feature]
selectFeatures = selectList [] []

{- |
Selects all actors for a given feature records
-}
selectActorsByFeatureId :: FeatureId -> SqlPersistT IO [Entity Actor]
selectActorsByFeatureId fId = selectList [ActorFeatureId ==. fId] []

{- |
Selects a feature record by its unique name
-}
findFeature :: T.FeatureName -> SqlPersistT IO (Maybe (Entity Feature))
findFeature fName = getBy (UniqueFeatureName fName)

{- |
Inserts a new actor record.
-}
insertActor :: Actor -> SqlPersistT IO (Key Actor)
insertActor = insert

{- |
Deletes an actor record.
-}
deleteActor :: FeatureId -> T.ActorId -> SqlPersistT IO ()
deleteActor fId aId = deleteBy (UniqueActorIdFeatureId aId fId)

{- |
Inserts a new feature record.
-}
insertFeature :: Feature -> SqlPersistT IO (Key Feature)
insertFeature = insert

{- |
Updates an existing feature record.
-}
updateFeature :: M.FeatureId -> M.Feature -> SqlPersistT IO ()
updateFeature = replace

{- |
Returns a count of all feature records
-}
countFeatures :: SqlPersistT IO Int
countFeatures = count ([] :: [Filter Feature])

{- |
Returns a count of all feature records
-}
countActors :: SqlPersistT IO Int
countActors = count ([] :: [Filter Actor])