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 syntax x where
  defaultMigratableDbSettings' :: Proxy syntax -> x ()

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

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

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

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

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