content: module IHP.IDE.ToolServer.Types where
  
  import IHP.Prelude
  import qualified IHP.IDE.Types as DevServer
  import Control.Concurrent.MVar
  import qualified Data.ByteString.Builder as ByteString
  import Network.Socket (PortNumber)
  
  data ToolServerApplication = ToolServerApplication
          { postgresStandardOutput :: !(IORef ByteString.Builder)
          , postgresErrorOutput :: !(IORef ByteString.Builder)
          , appStandardOutput :: !(IORef [ByteString])
          , appErrorOutput :: !(IORef [ByteString])
          , appPort :: !PortNumber
          , databaseNeedsMigration :: !(IORef Bool)
          }
  
  data SchemaController
      = PushToDbAction
      | DumpDbAction
      | UpdateDbAction
      | ShowCodeAction
      | SaveCodeAction
      | ShowGeneratedCodeAction { statementName :: Text }
      deriving (Eq, Show, Data)
  
  data TablesController
      = TablesAction
      | ShowTableAction { tableName :: Text }
      | NewTableAction
      | CreateTableAction
      | EditTableAction { tableName :: Text, tableId :: Int }
      | UpdateTableAction
      | DeleteTableAction { tableId :: Int, tableName :: Text }
      deriving (Eq, Show, Data)
  
  data ColumnsController
      = NewColumnAction { tableName :: Text }
      | CreateColumnAction
      | EditColumnAction { tableName :: Text, columnId :: Int }
      | UpdateColumnAction
      | DeleteColumnAction { tableName :: Text, columnId :: Int, columnName :: Text }
      | ToggleColumnUniqueAction { tableName :: Text, columnId :: Int }
      | NewForeignKeyAction { tableName :: Text, columnName :: Text }
      | CreateForeignKeyAction
      | EditForeignKeyAction { tableName :: Text, columnName :: Text, constraintName :: Text, referenceTable :: Text }
      | UpdateForeignKeyAction
      | DeleteForeignKeyAction { constraintName :: Text, tableName :: Text }
      deriving (Eq, Show, Data)
  
  data PoliciesController
      = NewPolicyAction { tableName :: Text }
      | CreatePolicyAction
      | EditPolicyAction { tableName :: Text, policyName :: Text }
      | UpdatePolicyAction
      | DeletePolicyAction { tableName :: Text, policyName :: Text }
      deriving (Eq, Show, Data)
  
  data EnumsController
      = ShowEnumAction { enumName :: Text }
      | NewEnumAction
      | CreateEnumAction
      | EditEnumAction { enumName :: Text, enumId :: Int }
      | UpdateEnumAction
      | DeleteEnumAction { tableId :: Int }
      deriving (Eq, Show, Data)
  
  data EnumValuesController
      = NewEnumValueAction { enumName :: Text }
      | CreateEnumValueAction
      | EditEnumValueAction { enumName :: Text, valueId :: Int }
      | UpdateEnumValueAction
      | DeleteEnumValueAction { enumName :: Text, valueId :: Int }
      deriving (Eq, Show, Data)
  
  data DataController
      = ShowDatabaseAction
      | ShowTableRowsAction { tableName :: Text }
      | DeleteTableRowsAction { tableName :: Text }
      | NewQueryAction
      | QueryAction
      | DeleteEntryAction { primaryKey :: Text, tableName :: Text }
      | CreateRowAction
      | NewRowAction { tableName :: Text }
      | EditRowAction { tableName :: Text, targetPrimaryKey :: Text }
      | UpdateRowAction
      | EditRowValueAction { tableName :: Text, targetName :: Text, id :: Text }
      | ToggleBooleanFieldAction { tableName :: Text, targetName :: Text, targetPrimaryKey :: Text }
      | UpdateValueAction
      | ShowForeignKeyHoverCardAction { tableName :: Text, id :: Text, columnName :: Text }
      | AutocompleteForeignKeyColumnAction { tableName :: !Text, columnName :: !Text, term :: !(Maybe Text) }
      deriving (Eq, Show, Data)
  
  data LogsController
      = AppLogsAction
      | PostgresLogsAction
      | OpenEditorAction
      deriving (Eq, Show, Data)
  
  data CodeGenController
      = GeneratorsAction
      | NewControllerAction
      | NewScriptAction
      | NewViewAction
      | NewMailAction
      | NewActionAction
      | NewApplicationAction
      | NewJobAction
      | CreateControllerAction
      | CreateScriptAction
      | CreateViewAction
      | CreateMailAction
      | CreateActionAction
      | CreateApplicationAction
      | CreateJobAction
      | OpenControllerAction
      deriving (Eq, Show, Data)
  
  data MigrationsController
      = MigrationsAction
      | NewMigrationAction
      | CreateMigrationAction
      | EditMigrationAction { migrationId :: !Int }
      | UpdateMigrationAction { migrationId :: !Int }
      | DeleteMigrationAction { migrationId :: !Int }
      | RunMigrationAction { migrationId :: !Int }
      deriving (Eq, Show, Data)
  
  data IndexesController
      = EditIndexAction { tableName :: !Text, indexName :: !Text }
      | UpdateIndexAction { tableName :: !Text, indexName :: !Text }
      | DeleteIndexAction { tableName :: !Text, indexName :: !Text }
      | CreateIndexAction { tableName :: !Text, columnName :: !Text }
      deriving (Eq, Show, Data)
  
  data DynamicField = DynamicField
      { fieldValue :: Maybe ByteString
      , fieldName :: ByteString
      } deriving (Show)
  
  data ColumnDefinition = ColumnDefinition
      { columnName :: Text
      , columnType :: Text
      , columnDefault :: Maybe Text
      , isNullable :: Bool
      } deriving (Show)
  
  
  -- | Keeps track of all all available apps in the projects. Used to display
  -- the apps inside the sidebar navigation
  --
  -- Usually this list is like: @["Web"]@ or @["Web", "Admin"]@
  newtype AvailableApps = AvailableApps [Text]
  
  -- | Wrapper to pass the app url to the layout.
  -- Usually "http://localhost:8000"
  newtype AppUrl = AppUrl Text
  
  -- | List of all controllers. Used inside e.g. the Schema Designer to decide whether to display
  -- the 'Generate Controller' option
  newtype WebControllers = WebControllers [Text]
  
  newtype DatabaseNeedsMigration = DatabaseNeedsMigration Bool
  
  data SqlConsoleResult
      = SelectQueryResult ![[DynamicField]]
      | InsertOrUpdateResult !Int64