{-# LANGUAGE DeriveGeneric #-}

module ChatWork.Types.My
    ( MyStatus(..)
    , MyTasks
    , MyTask(..)
    , GetMyTasksParams(..)
    ) where

import           ChatWork.Types.Base (Account, AccountId, Room, TaskStatus)
import           ChatWork.Utils      (strLength)
import           Data.Aeson          (FromJSON (..), ToJSON (..),
                                      genericParseJSON, genericToJSON)
import           Data.Aeson.Casing   (aesonDrop, snakeCase)
import           Data.Text           (Text)
import           GHC.Generics        (Generic)

data MyStatus = MyStatus
              { myStatusToUnreadRoomNum  :: Int
              , myStatusToMentionRoomNum :: Int
              , myStatusToMytaskRoomNum  :: Int
              , myStatusToUnreadNum      :: Int
              , myStatusToMentionNum     :: Int
              , myStatusToMytaskNum      :: Int
              } deriving (Eq, Show, Generic)

instance ToJSON MyStatus where
  toJSON = genericToJSON $ aesonDrop (strLength "myStatusTo") snakeCase
instance FromJSON MyStatus where
  parseJSON = genericParseJSON $ aesonDrop (strLength "myStatusTo") snakeCase

type MyTasks = [MyTask]

data MyTask = MyTask
          { myTaskToTaskId            :: Int
          , myTaskToRoom              :: Room
          , myTaskToAssignedByAccount :: Account
          , myTaskToMessageId         :: Text
          , myTaskToBody              :: Text
          , myTaskToLimitTime         :: Int
          , myTaskToStatus            :: Text
          } deriving (Eq, Show, Generic)

instance ToJSON MyTask where
  toJSON = genericToJSON $ aesonDrop (strLength "myTaskTo") snakeCase
instance FromJSON MyTask where
  parseJSON = genericParseJSON $ aesonDrop (strLength "myTaskTo") snakeCase

-- |
-- see: <http://developer.chatwork.com/ja/endpoint_my.html#GET-my-tasks>
data GetMyTasksParams = GetMyTasksParams
                   { getMyTasksAssignedByAccountId :: Maybe AccountId
                   , getMyTasksStatus              :: Maybe TaskStatus
                   } deriving (Show)