{-# LANGUAGE UndecidableInstances #-}
module Database.Beam.Migrate.Generics.Types where

import           Database.Beam.Migrate.Types

import           Data.Proxy
import qualified Data.Text as T

import           GHC.Generics

class GAutoMigratableDb be x where
  defaultMigratableDbSettings' :: Proxy be -> x ()

instance GAutoMigratableDb be x => GAutoMigratableDb be (D1 f x) where
  defaultMigratableDbSettings' be = M1 $ defaultMigratableDbSettings' be

instance GAutoMigratableDb be x => GAutoMigratableDb be (C1 f x) where
  defaultMigratableDbSettings' be = M1 $ defaultMigratableDbSettings' be

instance (GAutoMigratableDb be x, GAutoMigratableDb be y) =>
  GAutoMigratableDb be (x :*: y) where
  defaultMigratableDbSettings' be = defaultMigratableDbSettings' be :*: defaultMigratableDbSettings' be

instance ( Selector f, IsCheckedDatabaseEntity be x
         , CheckedDatabaseEntityDefaultRequirements be x ) =>
  GAutoMigratableDb be (S1 f (Rec0 (CheckedDatabaseEntity be db x))) where

  defaultMigratableDbSettings' _ = M1 (K1 (CheckedDatabaseEntity (checkedDbEntityAuto name) []))
    where name = T.pack (selName (undefined :: S1 f (Rec0 (CheckedDatabaseEntity be db x)) ()))