{-# LANGUAGE DeriveGeneric #-}
{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}

{-# HLINT ignore "Use infix" #-}

module UserManagement.DocumentPermission
    ( Permission (..)
    , permissionToText
    , textToPermission
    , UsersPermission (..)
    , DocumentWithPermission (..)
    ) where

import Data.Aeson (FromJSON, ToJSON)
import Data.OpenApi (ToSchema)
import Data.Text (Text, pack, unpack)
import Docs.Document as Document
import GHC.Generics (Generic)
import Text.Read (readMaybe)
import UserManagement.User as User (UserID)

data Permission = Read | Comment | Edit
    deriving ((forall x. Permission -> Rep Permission x)
-> (forall x. Rep Permission x -> Permission) -> Generic Permission
forall x. Rep Permission x -> Permission
forall x. Permission -> Rep Permission x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Permission -> Rep Permission x
from :: forall x. Permission -> Rep Permission x
$cto :: forall x. Rep Permission x -> Permission
to :: forall x. Rep Permission x -> Permission
Generic, Permission -> Permission -> Bool
(Permission -> Permission -> Bool)
-> (Permission -> Permission -> Bool) -> Eq Permission
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Permission -> Permission -> Bool
== :: Permission -> Permission -> Bool
$c/= :: Permission -> Permission -> Bool
/= :: Permission -> Permission -> Bool
Eq, Int -> Permission
Permission -> Int
Permission -> [Permission]
Permission -> Permission
Permission -> Permission -> [Permission]
Permission -> Permission -> Permission -> [Permission]
(Permission -> Permission)
-> (Permission -> Permission)
-> (Int -> Permission)
-> (Permission -> Int)
-> (Permission -> [Permission])
-> (Permission -> Permission -> [Permission])
-> (Permission -> Permission -> [Permission])
-> (Permission -> Permission -> Permission -> [Permission])
-> Enum Permission
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: Permission -> Permission
succ :: Permission -> Permission
$cpred :: Permission -> Permission
pred :: Permission -> Permission
$ctoEnum :: Int -> Permission
toEnum :: Int -> Permission
$cfromEnum :: Permission -> Int
fromEnum :: Permission -> Int
$cenumFrom :: Permission -> [Permission]
enumFrom :: Permission -> [Permission]
$cenumFromThen :: Permission -> Permission -> [Permission]
enumFromThen :: Permission -> Permission -> [Permission]
$cenumFromTo :: Permission -> Permission -> [Permission]
enumFromTo :: Permission -> Permission -> [Permission]
$cenumFromThenTo :: Permission -> Permission -> Permission -> [Permission]
enumFromThenTo :: Permission -> Permission -> Permission -> [Permission]
Enum, Eq Permission
Eq Permission =>
(Permission -> Permission -> Ordering)
-> (Permission -> Permission -> Bool)
-> (Permission -> Permission -> Bool)
-> (Permission -> Permission -> Bool)
-> (Permission -> Permission -> Bool)
-> (Permission -> Permission -> Permission)
-> (Permission -> Permission -> Permission)
-> Ord Permission
Permission -> Permission -> Bool
Permission -> Permission -> Ordering
Permission -> Permission -> Permission
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Permission -> Permission -> Ordering
compare :: Permission -> Permission -> Ordering
$c< :: Permission -> Permission -> Bool
< :: Permission -> Permission -> Bool
$c<= :: Permission -> Permission -> Bool
<= :: Permission -> Permission -> Bool
$c> :: Permission -> Permission -> Bool
> :: Permission -> Permission -> Bool
$c>= :: Permission -> Permission -> Bool
>= :: Permission -> Permission -> Bool
$cmax :: Permission -> Permission -> Permission
max :: Permission -> Permission -> Permission
$cmin :: Permission -> Permission -> Permission
min :: Permission -> Permission -> Permission
Ord, Permission
Permission -> Permission -> Bounded Permission
forall a. a -> a -> Bounded a
$cminBound :: Permission
minBound :: Permission
$cmaxBound :: Permission
maxBound :: Permission
Bounded)

instance Show Permission where
    show :: Permission -> String
show Permission
s = case Permission
s of
        Permission
Read -> String
"read"
        Permission
Comment -> String
"comment"
        Permission
Edit -> String
"edit"

instance Read Permission where
    readsPrec :: Int -> ReadS Permission
readsPrec Int
_ String
s = case ReadS String
lex String
s of
        [(String
"read", String
rs)] -> [(Permission
Read, String
rs)]
        [(String
"comment", String
rs)] -> [(Permission
Comment, String
rs)]
        [(String
"edit", String
rs)] -> [(Permission
Edit, String
rs)]
        [(String, String)]
_ -> []

instance ToJSON Permission
instance FromJSON Permission
instance ToSchema Permission

-- Convert to/from Text
permissionToText :: Permission -> Text
permissionToText :: Permission -> Text
permissionToText = String -> Text
pack (String -> Text) -> (Permission -> String) -> Permission -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Permission -> String
forall a. Show a => a -> String
show

textToPermission :: Text -> Maybe Permission
textToPermission :: Text -> Maybe Permission
textToPermission = String -> Maybe Permission
forall a. Read a => String -> Maybe a
readMaybe (String -> Maybe Permission)
-> (Text -> String) -> Text -> Maybe Permission
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
unpack

data UsersPermission = UsersPermission
    { UsersPermission -> UserID
userID :: User.UserID
    , UsersPermission -> Permission
permission :: Permission
    }
    deriving ((forall x. UsersPermission -> Rep UsersPermission x)
-> (forall x. Rep UsersPermission x -> UsersPermission)
-> Generic UsersPermission
forall x. Rep UsersPermission x -> UsersPermission
forall x. UsersPermission -> Rep UsersPermission x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. UsersPermission -> Rep UsersPermission x
from :: forall x. UsersPermission -> Rep UsersPermission x
$cto :: forall x. Rep UsersPermission x -> UsersPermission
to :: forall x. Rep UsersPermission x -> UsersPermission
Generic)

instance ToJSON UsersPermission
instance FromJSON UsersPermission
instance ToSchema UsersPermission

data DocumentWithPermission = DocumentWithPermission
    { DocumentWithPermission -> Permission
documentPermission :: Permission
    , DocumentWithPermission -> Document
document :: Document.Document
    }
    deriving ((forall x. DocumentWithPermission -> Rep DocumentWithPermission x)
-> (forall x.
    Rep DocumentWithPermission x -> DocumentWithPermission)
-> Generic DocumentWithPermission
forall x. Rep DocumentWithPermission x -> DocumentWithPermission
forall x. DocumentWithPermission -> Rep DocumentWithPermission x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. DocumentWithPermission -> Rep DocumentWithPermission x
from :: forall x. DocumentWithPermission -> Rep DocumentWithPermission x
$cto :: forall x. Rep DocumentWithPermission x -> DocumentWithPermission
to :: forall x. Rep DocumentWithPermission x -> DocumentWithPermission
Generic)

instance ToJSON DocumentWithPermission
instance ToSchema DocumentWithPermission