content: -- | Delete queries.
  module Guide.Database.Queries.Delete
  (
    deleteCategory,
    deleteItem,
    deleteTrait,
  )
  where
  
  import Imports
  
  import Hasql.Statement (Statement (..))
  import Hasql.Transaction (Transaction)
  import Data.Profunctor (lmap)
  
  import qualified Hasql.Transaction as HT
  
  import Guide.Database.Queries.Select
  import Guide.Database.Queries.Update
  import Guide.Database.Types
  import Guide.Database.Utils
  import Guide.Types.Core
  import Guide.Uid
  
  -- | Delete a category completly.
  deleteCategory :: Uid Category -> ExceptT DatabaseError Transaction ()
  deleteCategory catId = do
    let statement :: Statement (Uid Category) ()
        statement = lmap SingleParam $
          [execute|
            DELETE FROM categories
            WHERE uid = $1
          |]
    lift $ HT.statement catId statement
    -- Items belonging to the category will be deleted automatically because
    -- of "ON DELETE CASCADE" in the table schema.
  
  -- | Delete an item completly.
  deleteItem :: Uid Item -> ExceptT DatabaseError Transaction ()
  deleteItem itemId = do
    catId <- selectCategoryIdByItem itemId
    let statement :: Statement (Uid Item) ()
        statement = lmap SingleParam $
          [execute|
            DELETE FROM items
            WHERE uid = $1
          |]
    lift $ HT.statement itemId statement
    updateCategoryRow catId $
      _categoryRowItemsOrder %~ delete itemId
    -- Traits belonging to the item will be deleted automatically because of
    -- "ON DELETE CASCADE" in the table schema.
  
  -- | Delete a trait completly.
  deleteTrait :: Uid Trait -> ExceptT DatabaseError Transaction ()
  deleteTrait traitId = do
    itemId <- selectItemIdByTrait traitId
    traitType <- traitRowType <$> selectTraitRow traitId
    let statement :: Statement (Uid Trait) ()
        statement = lmap SingleParam $
          [execute|
            DELETE FROM traits
            WHERE uid = $1
          |]
    lift $ HT.statement traitId statement
    case traitType of
      TraitTypePro ->
        updateItemRow itemId $
          _itemRowProsOrder %~ delete traitId
      TraitTypeCon ->
        updateItemRow itemId $
          _itemRowConsOrder %~ delete traitId
  