{-# LANGUAGE GADTs #-}
module Honeycomb.API.DerivedColumns where


import Data.Text (Text)
import Honeycomb.Types (DatasetName)
import Honeycomb.Client.Internal

newtype Expression = Expression Text

data DerivedColumn = DerivedColumn
  { DerivedColumn -> Text
alias :: Text
  , DerivedColumn -> Maybe Text
description :: Maybe Text
  , DerivedColumn -> Expression
expression :: Expression 
  }

newtype DerivedColumnId = DerivedColumnId Text

data ExistingDerivedColumn = ExistingDerivedColumn 
  { ExistingDerivedColumn -> DerivedColumnId
derivedColumnId :: DerivedColumnId
  , ExistingDerivedColumn -> DerivedColumn
derivedColumnDetails :: DerivedColumn
  }

{-
createDerivedColumn :: DatasetName -> DerivedColumn -> m ExistingDerivedColumn
createDerivedColumn = post $ error "TODO"

updateDerivedColumn :: DatasetName -> ExistingDerivedColumn -> m ExistingDerivedColumn
updateDerivedColumn = put $ error "TODO"

deleteDerivedColumn :: DatasetName -> DerivedColumnId -> m Bool
deleteDerivedColumn = delete $ error "TODO"

getOneDerivedColumn :: DatasetName -> DerivedColumnId -> m (Maybe ExistingDerivedColumn)
getOneDerivedColumn = get $ error "TODO"

getOneDerivedColumnByAlias :: DatasetName -> Text -> m (Maybe ExistingDerivedColumn)
getOneDerivedColumnByAlias = get $ error "TODO"

listAllDerivedColumns :: DatasetName -> m [ExistingDerivedColumn]
listAllDerivedColumns = get $ error "TODO"
-}

{-
data Expression a where
  ColumnName :: Text -> Expression ()
  Function :: Expression ()
  StringLit :: Text -> Expression Text
  NumLit :: Scientific -> Expression Scientific
  BoolLit :: Bool -> Expression Bool 
  NullLit :: Expression a


ifE :: Expression Bool -> Expression a -> Expression a
ifElseE :: Expression Bool -> Expression a -> Expression a -> Expression a
multiWayIfE :: Expression Bool -> NonEmpty (Expression a, Expression a) -> Expression a 

coalesce :: [Expression a] -> Expression a

lt :: Expression a -> Expression b -> Expression Bool
lte :: Expression a -> Expression b -> Expression Bool
gt :: Expression a -> Expression b -> Expression Bool
gte :: Expression a -> Expression b -> Expression Bool
equals :: Expression a -> Expression b -> Expression Bool
in_ :: Expression a -> [Expression b] -> Expression Bool
exists :: Expression a -> Expression Bool
not :: Expression Bool -> Expression Bool
and :: Expression Bool -> Expression Bool -> Expression Bool
or :: Expression
min
max
sum
sub
mul
log10
bucket

-- $ Cast operators
int
float
bool
string
concat
startsWith
contains
regMatch
regValue
regCount
unixTimestamp
eventTimestamp
ingestTimestamp
-}