module Network.IPFS.Remote.Class
  ( MonadRemoteIPFS
  , runRemote
  , ipfsAdd
  , ipfsCat
  , ipfsPin
  , ipfsUnpin
  ) where

import Network.IPFS.Prelude

import           Servant.Client
import qualified RIO.ByteString.Lazy as Lazy

import           Network.IPFS.Types as IPFS

import qualified Network.IPFS.Client as IPFS.Client
import qualified Network.IPFS.Client.Pin as Pin
import qualified Network.IPFS.File.Types      as File

class MonadIO m => MonadRemoteIPFS m where
  runRemote :: ClientM a       -> m (Either ClientError a)
  ipfsAdd   :: Lazy.ByteString -> m (Either ClientError CID)
  ipfsCat   :: CID             -> m (Either ClientError File.Serialized)
  ipfsPin   :: CID             -> m (Either ClientError Pin.Response)
  ipfsUnpin :: CID -> Bool     -> m (Either ClientError Pin.Response)

  -- defaults
  ipfsAdd raw                   = runRemote <| IPFS.Client.add raw
  ipfsCat   (CID cid)           = runRemote <| IPFS.Client.cat cid
  ipfsPin   (CID cid)           = runRemote <| IPFS.Client.pin cid
  ipfsUnpin (CID cid) recursive = runRemote <| IPFS.Client.unpin cid recursive