module Asana.Api.Task.Search
  ( SearchWorkspace(..)
  , TaskTypeFilter(..)
  , searchWorkspace
  ) where

import Asana.Api.Prelude

import Asana.Api.Gid
import Asana.Api.Named
import Asana.Api.Request
import Asana.Api.Task
import Data.HashMap.Strict (HashMap)
import qualified Data.HashMap.Strict as HashMap
import Data.List (intercalate)
import qualified Data.Text as T

data TaskTypeFilter = TasksOnly | SubtasksOnly | AllTaskTypes

data SearchWorkspace = SearchWorkspace
  { SearchWorkspace -> Gid
swWorkspaceId :: Gid
  , SearchWorkspace -> [Gid]
swProjectIds :: [Gid]
  , SearchWorkspace -> TaskStatusFilter
swTaskStatusFilter :: TaskStatusFilter
  , SearchWorkspace -> HashMap Gid Text
swCustomFields :: HashMap Gid Text
  , SearchWorkspace -> TaskTypeFilter
swTaskTypeFilter :: TaskTypeFilter
  }

-- | Search for tasks within a workspace
searchWorkspace
  :: (MonadUnliftIO m, MonadLogger m, MonadReader env m, HasAsanaAccessKey env)
  => SearchWorkspace
  -> m [Named]
searchWorkspace :: forall (m :: * -> *) env.
(MonadUnliftIO m, MonadLogger m, MonadReader env m,
 HasAsanaAccessKey env) =>
SearchWorkspace -> m [Named]
searchWorkspace SearchWorkspace {[Gid]
HashMap Gid Text
Gid
TaskStatusFilter
TaskTypeFilter
swTaskTypeFilter :: TaskTypeFilter
swCustomFields :: HashMap Gid Text
swTaskStatusFilter :: TaskStatusFilter
swProjectIds :: [Gid]
swWorkspaceId :: Gid
swTaskTypeFilter :: SearchWorkspace -> TaskTypeFilter
swCustomFields :: SearchWorkspace -> HashMap Gid Text
swTaskStatusFilter :: SearchWorkspace -> TaskStatusFilter
swProjectIds :: SearchWorkspace -> [Gid]
swWorkspaceId :: SearchWorkspace -> Gid
..} =
  forall (m :: * -> *) env a.
(MonadUnliftIO m, MonadLogger m, MonadReader env m,
 HasAsanaAccessKey env, FromJSON a) =>
String -> [(String, String)] -> m [a]
getAllParams
      (Text -> String
T.unpack forall a b. (a -> b) -> a -> b
$ Text
"/workspaces/" forall a. Semigroup a => a -> a -> a
<> Gid -> Text
gidToText Gid
swWorkspaceId forall a. Semigroup a => a -> a -> a
<> Text
"/tasks/search")
    forall a b. (a -> b) -> a -> b
$ ( String
"projects.all"
      , forall a. [a] -> [[a]] -> [a]
intercalate String
"," forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map (Text -> String
T.unpack forall b c a. (b -> c) -> (a -> b) -> a -> c
. Gid -> Text
gidToText) [Gid]
swProjectIds
      )
    forall a. a -> [a] -> [a]
: [(String, String)]
customFieldParams
    forall a. Semigroup a => a -> a -> a
<> [(String, String)]
completed
    forall a. Semigroup a => a -> a -> a
<> [(String, String)]
isSubtask
 where
  customFieldParams :: [(String, String)]
customFieldParams =
    forall a b. (a -> b) -> [a] -> [b]
map
        (\(Gid
a, Text
b) ->
          (String
"custom_fields." forall a. Semigroup a => a -> a -> a
<> Text -> String
T.unpack (Gid -> Text
gidToText Gid
a) forall a. Semigroup a => a -> a -> a
<> String
".value", Text -> String
T.unpack Text
b)
        )
      forall a b. (a -> b) -> a -> b
$ forall k v. HashMap k v -> [(k, v)]
HashMap.toList HashMap Gid Text
swCustomFields

  completed :: [(String, String)]
completed = case TaskStatusFilter
swTaskStatusFilter of
    TaskStatusFilter
AllTasks -> []
    TaskStatusFilter
IncompletedTasks -> [(String
"completed", String
"false")]

  isSubtask :: [(String, String)]
isSubtask = case TaskTypeFilter
swTaskTypeFilter of
    TaskTypeFilter
AllTaskTypes -> []
    TaskTypeFilter
TasksOnly -> [(String
"is_subtask", String
"false")]
    TaskTypeFilter
SubtasksOnly -> [(String
"is_subtask", String
"true")]