{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE OverloadedStrings #-}
-- | Types and records for Issuance module.
--
-- This module provides record types for functions with many parameters,
-- making the code more maintainable and easier to read.
module SDJWT.Internal.Issuance.Types
  ( ProcessConfig(..)
  , PathProcessConfig(..)
  , ObjectPathConfig(..)
  , ArrayPathConfig(..)
  , TopLevelClaimsConfig(..)
  , TopLevelClaimsResult(..)
  , CreateSDJWTConfig(..)
  , CreateSDJWTWithDecoysConfig(..)
  , BuildSDJWTPayloadConfig(..)
  , BuildSDJWTPayloadResult(..)
  ) where

import SDJWT.Internal.Types (HashAlgorithm, Digest(..), EncodedDisclosure(..))
import qualified Data.Aeson as Aeson
import qualified Data.Aeson.KeyMap as KeyMap
import qualified Data.Vector as V
import qualified Data.Text as T
import qualified Data.Set as Set

-- | Configuration for processing nested structures.
data ProcessConfig = ProcessConfig
  { ProcessConfig -> HashAlgorithm
processHashAlg :: HashAlgorithm
  , ProcessConfig -> [[Text]]
processPaths :: [[T.Text]]
  , ProcessConfig -> Object
processClaims :: Aeson.Object
  }
  deriving stock (ProcessConfig -> ProcessConfig -> Bool
(ProcessConfig -> ProcessConfig -> Bool)
-> (ProcessConfig -> ProcessConfig -> Bool) -> Eq ProcessConfig
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ProcessConfig -> ProcessConfig -> Bool
== :: ProcessConfig -> ProcessConfig -> Bool
$c/= :: ProcessConfig -> ProcessConfig -> Bool
/= :: ProcessConfig -> ProcessConfig -> Bool
Eq, Int -> ProcessConfig -> ShowS
[ProcessConfig] -> ShowS
ProcessConfig -> String
(Int -> ProcessConfig -> ShowS)
-> (ProcessConfig -> String)
-> ([ProcessConfig] -> ShowS)
-> Show ProcessConfig
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ProcessConfig -> ShowS
showsPrec :: Int -> ProcessConfig -> ShowS
$cshow :: ProcessConfig -> String
show :: ProcessConfig -> String
$cshowList :: [ProcessConfig] -> ShowS
showList :: [ProcessConfig] -> ShowS
Show)

-- | Configuration for processing paths recursively.
data PathProcessConfig = PathProcessConfig
  { PathProcessConfig -> HashAlgorithm
pathHashAlg :: HashAlgorithm
  , PathProcessConfig -> [[Text]]
pathSegments :: [[T.Text]]
  , PathProcessConfig -> Value
pathValue :: Aeson.Value
  }
  deriving stock (PathProcessConfig -> PathProcessConfig -> Bool
(PathProcessConfig -> PathProcessConfig -> Bool)
-> (PathProcessConfig -> PathProcessConfig -> Bool)
-> Eq PathProcessConfig
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: PathProcessConfig -> PathProcessConfig -> Bool
== :: PathProcessConfig -> PathProcessConfig -> Bool
$c/= :: PathProcessConfig -> PathProcessConfig -> Bool
/= :: PathProcessConfig -> PathProcessConfig -> Bool
Eq, Int -> PathProcessConfig -> ShowS
[PathProcessConfig] -> ShowS
PathProcessConfig -> String
(Int -> PathProcessConfig -> ShowS)
-> (PathProcessConfig -> String)
-> ([PathProcessConfig] -> ShowS)
-> Show PathProcessConfig
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> PathProcessConfig -> ShowS
showsPrec :: Int -> PathProcessConfig -> ShowS
$cshow :: PathProcessConfig -> String
show :: PathProcessConfig -> String
$cshowList :: [PathProcessConfig] -> ShowS
showList :: [PathProcessConfig] -> ShowS
Show)

-- | Configuration for processing object paths.
data ObjectPathConfig = ObjectPathConfig
  { ObjectPathConfig -> HashAlgorithm
objHashAlg :: HashAlgorithm
  , ObjectPathConfig -> [[Text]]
objPaths :: [[T.Text]]
  , ObjectPathConfig -> Object
objObject :: KeyMap.KeyMap Aeson.Value
  }
  deriving stock (ObjectPathConfig -> ObjectPathConfig -> Bool
(ObjectPathConfig -> ObjectPathConfig -> Bool)
-> (ObjectPathConfig -> ObjectPathConfig -> Bool)
-> Eq ObjectPathConfig
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ObjectPathConfig -> ObjectPathConfig -> Bool
== :: ObjectPathConfig -> ObjectPathConfig -> Bool
$c/= :: ObjectPathConfig -> ObjectPathConfig -> Bool
/= :: ObjectPathConfig -> ObjectPathConfig -> Bool
Eq, Int -> ObjectPathConfig -> ShowS
[ObjectPathConfig] -> ShowS
ObjectPathConfig -> String
(Int -> ObjectPathConfig -> ShowS)
-> (ObjectPathConfig -> String)
-> ([ObjectPathConfig] -> ShowS)
-> Show ObjectPathConfig
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ObjectPathConfig -> ShowS
showsPrec :: Int -> ObjectPathConfig -> ShowS
$cshow :: ObjectPathConfig -> String
show :: ObjectPathConfig -> String
$cshowList :: [ObjectPathConfig] -> ShowS
showList :: [ObjectPathConfig] -> ShowS
Show)

-- | Configuration for processing array paths.
data ArrayPathConfig = ArrayPathConfig
  { ArrayPathConfig -> HashAlgorithm
arrHashAlg :: HashAlgorithm
  , ArrayPathConfig -> [[Text]]
arrPaths :: [[T.Text]]
  , ArrayPathConfig -> Vector Value
arrArray :: V.Vector Aeson.Value
  }
  deriving stock (ArrayPathConfig -> ArrayPathConfig -> Bool
(ArrayPathConfig -> ArrayPathConfig -> Bool)
-> (ArrayPathConfig -> ArrayPathConfig -> Bool)
-> Eq ArrayPathConfig
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ArrayPathConfig -> ArrayPathConfig -> Bool
== :: ArrayPathConfig -> ArrayPathConfig -> Bool
$c/= :: ArrayPathConfig -> ArrayPathConfig -> Bool
/= :: ArrayPathConfig -> ArrayPathConfig -> Bool
Eq, Int -> ArrayPathConfig -> ShowS
[ArrayPathConfig] -> ShowS
ArrayPathConfig -> String
(Int -> ArrayPathConfig -> ShowS)
-> (ArrayPathConfig -> String)
-> ([ArrayPathConfig] -> ShowS)
-> Show ArrayPathConfig
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ArrayPathConfig -> ShowS
showsPrec :: Int -> ArrayPathConfig -> ShowS
$cshow :: ArrayPathConfig -> String
show :: ArrayPathConfig -> String
$cshowList :: [ArrayPathConfig] -> ShowS
showList :: [ArrayPathConfig] -> ShowS
Show)

-- | Configuration for processing top-level selective claims.
data TopLevelClaimsConfig = TopLevelClaimsConfig
  { TopLevelClaimsConfig -> HashAlgorithm
topLevelHashAlg :: HashAlgorithm
  , TopLevelClaimsConfig -> Set Text
topLevelRecursiveParents :: Set.Set T.Text
  , TopLevelClaimsConfig -> [Text]
topLevelClaimNames :: [T.Text]
  , TopLevelClaimsConfig -> Object
topLevelRemainingClaims :: Aeson.Object
  }
  deriving stock (TopLevelClaimsConfig -> TopLevelClaimsConfig -> Bool
(TopLevelClaimsConfig -> TopLevelClaimsConfig -> Bool)
-> (TopLevelClaimsConfig -> TopLevelClaimsConfig -> Bool)
-> Eq TopLevelClaimsConfig
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: TopLevelClaimsConfig -> TopLevelClaimsConfig -> Bool
== :: TopLevelClaimsConfig -> TopLevelClaimsConfig -> Bool
$c/= :: TopLevelClaimsConfig -> TopLevelClaimsConfig -> Bool
/= :: TopLevelClaimsConfig -> TopLevelClaimsConfig -> Bool
Eq, Int -> TopLevelClaimsConfig -> ShowS
[TopLevelClaimsConfig] -> ShowS
TopLevelClaimsConfig -> String
(Int -> TopLevelClaimsConfig -> ShowS)
-> (TopLevelClaimsConfig -> String)
-> ([TopLevelClaimsConfig] -> ShowS)
-> Show TopLevelClaimsConfig
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TopLevelClaimsConfig -> ShowS
showsPrec :: Int -> TopLevelClaimsConfig -> ShowS
$cshow :: TopLevelClaimsConfig -> String
show :: TopLevelClaimsConfig -> String
$cshowList :: [TopLevelClaimsConfig] -> ShowS
showList :: [TopLevelClaimsConfig] -> ShowS
Show)

-- | Result of processing top-level selective claims.
data TopLevelClaimsResult = TopLevelClaimsResult
  { TopLevelClaimsResult -> [Digest]
resultDigests :: [Digest]
  , TopLevelClaimsResult -> [EncodedDisclosure]
resultDisclosures :: [EncodedDisclosure]
  , TopLevelClaimsResult -> Object
resultRegularClaims :: Aeson.Object
  }
  deriving stock (TopLevelClaimsResult -> TopLevelClaimsResult -> Bool
(TopLevelClaimsResult -> TopLevelClaimsResult -> Bool)
-> (TopLevelClaimsResult -> TopLevelClaimsResult -> Bool)
-> Eq TopLevelClaimsResult
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: TopLevelClaimsResult -> TopLevelClaimsResult -> Bool
== :: TopLevelClaimsResult -> TopLevelClaimsResult -> Bool
$c/= :: TopLevelClaimsResult -> TopLevelClaimsResult -> Bool
/= :: TopLevelClaimsResult -> TopLevelClaimsResult -> Bool
Eq, Int -> TopLevelClaimsResult -> ShowS
[TopLevelClaimsResult] -> ShowS
TopLevelClaimsResult -> String
(Int -> TopLevelClaimsResult -> ShowS)
-> (TopLevelClaimsResult -> String)
-> ([TopLevelClaimsResult] -> ShowS)
-> Show TopLevelClaimsResult
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TopLevelClaimsResult -> ShowS
showsPrec :: Int -> TopLevelClaimsResult -> ShowS
$cshow :: TopLevelClaimsResult -> String
show :: TopLevelClaimsResult -> String
$cshowList :: [TopLevelClaimsResult] -> ShowS
showList :: [TopLevelClaimsResult] -> ShowS
Show)

-- | Configuration for creating an SD-JWT.
data CreateSDJWTConfig jwk = CreateSDJWTConfig
  { forall jwk. CreateSDJWTConfig jwk -> Maybe Text
createTyp :: Maybe T.Text  -- ^ Optional typ header value
  , forall jwk. CreateSDJWTConfig jwk -> Maybe Text
createKid :: Maybe T.Text  -- ^ Optional kid header value
  , forall jwk. CreateSDJWTConfig jwk -> HashAlgorithm
createHashAlg :: HashAlgorithm
  , forall jwk. CreateSDJWTConfig jwk -> jwk
createIssuerKey :: jwk  -- ^ Issuer private key
  , forall jwk. CreateSDJWTConfig jwk -> [Text]
createSelectiveClaimNames :: [T.Text]  -- ^ Claim names to mark as selectively disclosable
  , forall jwk. CreateSDJWTConfig jwk -> Object
createClaims :: Aeson.Object  -- ^ Original claims object
  }
  deriving stock (CreateSDJWTConfig jwk -> CreateSDJWTConfig jwk -> Bool
(CreateSDJWTConfig jwk -> CreateSDJWTConfig jwk -> Bool)
-> (CreateSDJWTConfig jwk -> CreateSDJWTConfig jwk -> Bool)
-> Eq (CreateSDJWTConfig jwk)
forall jwk.
Eq jwk =>
CreateSDJWTConfig jwk -> CreateSDJWTConfig jwk -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall jwk.
Eq jwk =>
CreateSDJWTConfig jwk -> CreateSDJWTConfig jwk -> Bool
== :: CreateSDJWTConfig jwk -> CreateSDJWTConfig jwk -> Bool
$c/= :: forall jwk.
Eq jwk =>
CreateSDJWTConfig jwk -> CreateSDJWTConfig jwk -> Bool
/= :: CreateSDJWTConfig jwk -> CreateSDJWTConfig jwk -> Bool
Eq, Int -> CreateSDJWTConfig jwk -> ShowS
[CreateSDJWTConfig jwk] -> ShowS
CreateSDJWTConfig jwk -> String
(Int -> CreateSDJWTConfig jwk -> ShowS)
-> (CreateSDJWTConfig jwk -> String)
-> ([CreateSDJWTConfig jwk] -> ShowS)
-> Show (CreateSDJWTConfig jwk)
forall jwk. Show jwk => Int -> CreateSDJWTConfig jwk -> ShowS
forall jwk. Show jwk => [CreateSDJWTConfig jwk] -> ShowS
forall jwk. Show jwk => CreateSDJWTConfig jwk -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall jwk. Show jwk => Int -> CreateSDJWTConfig jwk -> ShowS
showsPrec :: Int -> CreateSDJWTConfig jwk -> ShowS
$cshow :: forall jwk. Show jwk => CreateSDJWTConfig jwk -> String
show :: CreateSDJWTConfig jwk -> String
$cshowList :: forall jwk. Show jwk => [CreateSDJWTConfig jwk] -> ShowS
showList :: [CreateSDJWTConfig jwk] -> ShowS
Show)

-- | Configuration for creating an SD-JWT with decoys.
data CreateSDJWTWithDecoysConfig jwk = CreateSDJWTWithDecoysConfig
  { forall jwk. CreateSDJWTWithDecoysConfig jwk -> Maybe Text
createDecoysTyp :: Maybe T.Text
  , forall jwk. CreateSDJWTWithDecoysConfig jwk -> Maybe Text
createDecoysKid :: Maybe T.Text
  , forall jwk. CreateSDJWTWithDecoysConfig jwk -> HashAlgorithm
createDecoysHashAlg :: HashAlgorithm
  , forall jwk. CreateSDJWTWithDecoysConfig jwk -> jwk
createDecoysIssuerKey :: jwk
  , forall jwk. CreateSDJWTWithDecoysConfig jwk -> [Text]
createDecoysSelectiveClaimNames :: [T.Text]
  , forall jwk. CreateSDJWTWithDecoysConfig jwk -> Object
createDecoysClaims :: Aeson.Object
  , forall jwk. CreateSDJWTWithDecoysConfig jwk -> Int
createDecoysCount :: Int  -- ^ Number of decoy digests
  }
  deriving stock (CreateSDJWTWithDecoysConfig jwk
-> CreateSDJWTWithDecoysConfig jwk -> Bool
(CreateSDJWTWithDecoysConfig jwk
 -> CreateSDJWTWithDecoysConfig jwk -> Bool)
-> (CreateSDJWTWithDecoysConfig jwk
    -> CreateSDJWTWithDecoysConfig jwk -> Bool)
-> Eq (CreateSDJWTWithDecoysConfig jwk)
forall jwk.
Eq jwk =>
CreateSDJWTWithDecoysConfig jwk
-> CreateSDJWTWithDecoysConfig jwk -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall jwk.
Eq jwk =>
CreateSDJWTWithDecoysConfig jwk
-> CreateSDJWTWithDecoysConfig jwk -> Bool
== :: CreateSDJWTWithDecoysConfig jwk
-> CreateSDJWTWithDecoysConfig jwk -> Bool
$c/= :: forall jwk.
Eq jwk =>
CreateSDJWTWithDecoysConfig jwk
-> CreateSDJWTWithDecoysConfig jwk -> Bool
/= :: CreateSDJWTWithDecoysConfig jwk
-> CreateSDJWTWithDecoysConfig jwk -> Bool
Eq, Int -> CreateSDJWTWithDecoysConfig jwk -> ShowS
[CreateSDJWTWithDecoysConfig jwk] -> ShowS
CreateSDJWTWithDecoysConfig jwk -> String
(Int -> CreateSDJWTWithDecoysConfig jwk -> ShowS)
-> (CreateSDJWTWithDecoysConfig jwk -> String)
-> ([CreateSDJWTWithDecoysConfig jwk] -> ShowS)
-> Show (CreateSDJWTWithDecoysConfig jwk)
forall jwk.
Show jwk =>
Int -> CreateSDJWTWithDecoysConfig jwk -> ShowS
forall jwk. Show jwk => [CreateSDJWTWithDecoysConfig jwk] -> ShowS
forall jwk. Show jwk => CreateSDJWTWithDecoysConfig jwk -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall jwk.
Show jwk =>
Int -> CreateSDJWTWithDecoysConfig jwk -> ShowS
showsPrec :: Int -> CreateSDJWTWithDecoysConfig jwk -> ShowS
$cshow :: forall jwk. Show jwk => CreateSDJWTWithDecoysConfig jwk -> String
show :: CreateSDJWTWithDecoysConfig jwk -> String
$cshowList :: forall jwk. Show jwk => [CreateSDJWTWithDecoysConfig jwk] -> ShowS
showList :: [CreateSDJWTWithDecoysConfig jwk] -> ShowS
Show)

-- | Configuration for building SD-JWT payload.
data BuildSDJWTPayloadConfig = BuildSDJWTPayloadConfig
  { BuildSDJWTPayloadConfig -> HashAlgorithm
buildHashAlg :: HashAlgorithm
  , BuildSDJWTPayloadConfig -> [Text]
buildSelectiveClaimNames :: [T.Text]
  , BuildSDJWTPayloadConfig -> Object
buildClaims :: Aeson.Object
  }
  deriving stock (BuildSDJWTPayloadConfig -> BuildSDJWTPayloadConfig -> Bool
(BuildSDJWTPayloadConfig -> BuildSDJWTPayloadConfig -> Bool)
-> (BuildSDJWTPayloadConfig -> BuildSDJWTPayloadConfig -> Bool)
-> Eq BuildSDJWTPayloadConfig
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: BuildSDJWTPayloadConfig -> BuildSDJWTPayloadConfig -> Bool
== :: BuildSDJWTPayloadConfig -> BuildSDJWTPayloadConfig -> Bool
$c/= :: BuildSDJWTPayloadConfig -> BuildSDJWTPayloadConfig -> Bool
/= :: BuildSDJWTPayloadConfig -> BuildSDJWTPayloadConfig -> Bool
Eq, Int -> BuildSDJWTPayloadConfig -> ShowS
[BuildSDJWTPayloadConfig] -> ShowS
BuildSDJWTPayloadConfig -> String
(Int -> BuildSDJWTPayloadConfig -> ShowS)
-> (BuildSDJWTPayloadConfig -> String)
-> ([BuildSDJWTPayloadConfig] -> ShowS)
-> Show BuildSDJWTPayloadConfig
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> BuildSDJWTPayloadConfig -> ShowS
showsPrec :: Int -> BuildSDJWTPayloadConfig -> ShowS
$cshow :: BuildSDJWTPayloadConfig -> String
show :: BuildSDJWTPayloadConfig -> String
$cshowList :: [BuildSDJWTPayloadConfig] -> ShowS
showList :: [BuildSDJWTPayloadConfig] -> ShowS
Show)

-- | Result of building SD-JWT payload.
data BuildSDJWTPayloadResult = BuildSDJWTPayloadResult
  { BuildSDJWTPayloadResult -> Value
buildPayload :: Aeson.Value  -- ^ The payload value (Object)
  , BuildSDJWTPayloadResult -> [EncodedDisclosure]
buildDisclosures :: [EncodedDisclosure]
  }
  deriving stock (BuildSDJWTPayloadResult -> BuildSDJWTPayloadResult -> Bool
(BuildSDJWTPayloadResult -> BuildSDJWTPayloadResult -> Bool)
-> (BuildSDJWTPayloadResult -> BuildSDJWTPayloadResult -> Bool)
-> Eq BuildSDJWTPayloadResult
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: BuildSDJWTPayloadResult -> BuildSDJWTPayloadResult -> Bool
== :: BuildSDJWTPayloadResult -> BuildSDJWTPayloadResult -> Bool
$c/= :: BuildSDJWTPayloadResult -> BuildSDJWTPayloadResult -> Bool
/= :: BuildSDJWTPayloadResult -> BuildSDJWTPayloadResult -> Bool
Eq, Int -> BuildSDJWTPayloadResult -> ShowS
[BuildSDJWTPayloadResult] -> ShowS
BuildSDJWTPayloadResult -> String
(Int -> BuildSDJWTPayloadResult -> ShowS)
-> (BuildSDJWTPayloadResult -> String)
-> ([BuildSDJWTPayloadResult] -> ShowS)
-> Show BuildSDJWTPayloadResult
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> BuildSDJWTPayloadResult -> ShowS
showsPrec :: Int -> BuildSDJWTPayloadResult -> ShowS
$cshow :: BuildSDJWTPayloadResult -> String
show :: BuildSDJWTPayloadResult -> String
$cshowList :: [BuildSDJWTPayloadResult] -> ShowS
showList :: [BuildSDJWTPayloadResult] -> ShowS
Show)