{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedLabels #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE NoFieldSelectors #-}
{-# OPTIONS_GHC -fno-warn-ambiguous-fields #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}

module WikiMusic.Beam.Database where

import Database.Beam
import Optics
import WikiMusic.Beam.Artist
import WikiMusic.Beam.Genre
import WikiMusic.Beam.Relations
import WikiMusic.Beam.Song
import WikiMusic.Beam.User
import WikiMusic.Protolude

data WikiMusicDatabase f = WikiMusicDatabase
  { forall (f :: * -> *). WikiMusicDatabase f -> f (TableEntity SongT)
songs :: f (TableEntity SongT),
    forall (f :: * -> *).
WikiMusicDatabase f -> f (TableEntity SongCommentT)
songComments :: f (TableEntity SongCommentT),
    forall (f :: * -> *).
WikiMusicDatabase f -> f (TableEntity SongArtworkT)
songArtworks :: f (TableEntity SongArtworkT),
    forall (f :: * -> *).
WikiMusicDatabase f -> f (TableEntity SongOpinionT)
songOpinions :: f (TableEntity SongOpinionT),
    forall (f :: * -> *).
WikiMusicDatabase f -> f (TableEntity SongExternalSourcesT)
songExternalSources :: f (TableEntity SongExternalSourcesT),
    forall (f :: * -> *).
WikiMusicDatabase f -> f (TableEntity SongContentsT)
songContents :: f (TableEntity SongContentsT),
    forall (f :: * -> *). WikiMusicDatabase f -> f (TableEntity GenreT)
genres :: f (TableEntity GenreT),
    forall (f :: * -> *).
WikiMusicDatabase f -> f (TableEntity GenreCommentT)
genreComments :: f (TableEntity GenreCommentT),
    forall (f :: * -> *).
WikiMusicDatabase f -> f (TableEntity GenreArtworkT)
genreArtworks :: f (TableEntity GenreArtworkT),
    forall (f :: * -> *).
WikiMusicDatabase f -> f (TableEntity GenreOpinionT)
genreOpinions :: f (TableEntity GenreOpinionT),
    forall (f :: * -> *).
WikiMusicDatabase f -> f (TableEntity GenreExternalSourcesT)
genreExternalSources :: f (TableEntity GenreExternalSourcesT),
    forall (f :: * -> *).
WikiMusicDatabase f -> f (TableEntity ArtistT)
artists :: f (TableEntity ArtistT),
    forall (f :: * -> *).
WikiMusicDatabase f -> f (TableEntity ArtistCommentT)
artistComments :: f (TableEntity ArtistCommentT),
    forall (f :: * -> *).
WikiMusicDatabase f -> f (TableEntity ArtistArtworkT)
artistArtworks :: f (TableEntity ArtistArtworkT),
    forall (f :: * -> *).
WikiMusicDatabase f -> f (TableEntity ArtistOpinionT)
artistOpinions :: f (TableEntity ArtistOpinionT),
    forall (f :: * -> *).
WikiMusicDatabase f -> f (TableEntity ArtistExternalSourcesT)
artistExternalSources :: f (TableEntity ArtistExternalSourcesT),
    forall (f :: * -> *). WikiMusicDatabase f -> f (TableEntity UserT)
users :: f (TableEntity UserT),
    forall (f :: * -> *).
WikiMusicDatabase f -> f (TableEntity UserRoleT)
userRoles :: f (TableEntity UserRoleT),
    forall (f :: * -> *).
WikiMusicDatabase f -> f (TableEntity SongArtistT)
songArtists :: f (TableEntity SongArtistT),
    forall (f :: * -> *).
WikiMusicDatabase f -> f (TableEntity SongGenreT)
songGenres :: f (TableEntity SongGenreT),
    forall (f :: * -> *).
WikiMusicDatabase f -> f (TableEntity ArtistGenreT)
artistGenres :: f (TableEntity ArtistGenreT)
  }
  deriving ((forall x. WikiMusicDatabase f -> Rep (WikiMusicDatabase f) x)
-> (forall x. Rep (WikiMusicDatabase f) x -> WikiMusicDatabase f)
-> Generic (WikiMusicDatabase f)
forall x. Rep (WikiMusicDatabase f) x -> WikiMusicDatabase f
forall x. WikiMusicDatabase f -> Rep (WikiMusicDatabase f) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall (f :: * -> *) x.
Rep (WikiMusicDatabase f) x -> WikiMusicDatabase f
forall (f :: * -> *) x.
WikiMusicDatabase f -> Rep (WikiMusicDatabase f) x
$cfrom :: forall (f :: * -> *) x.
WikiMusicDatabase f -> Rep (WikiMusicDatabase f) x
from :: forall x. WikiMusicDatabase f -> Rep (WikiMusicDatabase f) x
$cto :: forall (f :: * -> *) x.
Rep (WikiMusicDatabase f) x -> WikiMusicDatabase f
to :: forall x. Rep (WikiMusicDatabase f) x -> WikiMusicDatabase f
Generic, Database be)

makeFieldLabelsNoPrefix ''WikiMusicDatabase

wikiMusicDatabase :: DatabaseSettings be WikiMusicDatabase
wikiMusicDatabase :: forall be. DatabaseSettings be WikiMusicDatabase
wikiMusicDatabase =
  DatabaseSettings be WikiMusicDatabase
forall be (db :: (* -> *) -> *).
(Generic (DatabaseSettings be db),
 GAutoDbSettings (Rep (DatabaseSettings be db) ())) =>
DatabaseSettings be db
defaultDbSettings
    DatabaseSettings be WikiMusicDatabase
-> DatabaseModification
     (DatabaseEntity be WikiMusicDatabase) be WikiMusicDatabase
-> DatabaseSettings be WikiMusicDatabase
forall (db :: (* -> *) -> *) be
       (entity :: * -> ((* -> *) -> *) -> * -> *).
Database be db =>
db (entity be db)
-> DatabaseModification (entity be db) be db -> db (entity be db)
`withDbModification` DatabaseModification Any Any WikiMusicDatabase
forall (f :: * -> *) be (db :: (* -> *) -> *).
Database be db =>
DatabaseModification f be db
dbModification
      { songs =
          setEntityName "songs"
            <> modifyTableFields
              songTModification,
        songComments =
          setEntityName "song_comments"
            <> modifyTableFields
              songCommentTModification,
        songArtworks =
          setEntityName "song_artworks"
            <> modifyTableFields
              songArtworkTModification,
        songOpinions =
          setEntityName "song_opinions"
            <> modifyTableFields
              songOpinionTModification,
        songExternalSources =
          setEntityName "song_external_sources"
            <> modifyTableFields
              songExternalSourcesTModification,
        songContents =
          setEntityName "song_contents"
            <> modifyTableFields songContentsTModification,
        genres =
          setEntityName "genres"
            <> modifyTableFields
              genreTModification,
        genreComments =
          setEntityName "genre_comments"
            <> modifyTableFields
              genreCommentTModification,
        genreArtworks =
          setEntityName "genre_artworks"
            <> modifyTableFields
              genreArtworkTModification,
        genreOpinions =
          setEntityName "genre_opinions"
            <> modifyTableFields
              genreOpinionTModification,
        genreExternalSources =
          setEntityName "genre_external_sources"
            <> modifyTableFields
              genreExternalSourcesTModification,
        artists =
          setEntityName "artists"
            <> modifyTableFields
              artistTModification,
        artistComments =
          setEntityName "artist_comments"
            <> modifyTableFields
              artistCommentTModification,
        artistArtworks =
          setEntityName "artist_artworks"
            <> modifyTableFields
              artistArtworkTModification,
        artistOpinions =
          setEntityName "artist_opinions"
            <> modifyTableFields
              artistOpinionTModification,
        artistExternalSources =
          setEntityName "artist_external_sources"
            <> modifyTableFields
              artistExternalSourcesTModification,
        users =
          setEntityName "users"
            <> modifyTableFields
              userTModification,
        userRoles =
          setEntityName "user_roles"
            <> modifyTableFields
              userRoleTModification,
        songArtists =
          setEntityName "song_artists"
            <> modifyTableFields songArtistTModification,
        songGenres =
          setEntityName "song_genres"
            <> modifyTableFields songGenreTModification,
        artistGenres =
          setEntityName "artist_genres"
            <> modifyTableFields artistGenreTModification
      }