{-# LANGUAGE TemplateHaskell #-}

module Taskell.IO.HTTP.Trello.ChecklistItem
    ( ChecklistItem
    , checklistItemToSubTask
    , checkItems
    ) where

import ClassyPrelude

import           Control.Lens          (makeLenses, (^.))
import qualified Taskell.Data.Subtask  as ST (Subtask, new)
import           Taskell.IO.HTTP.Aeson (deriveFromJSON)

data ChecklistItem = ChecklistItem
    { ChecklistItem -> Text
_name  :: Text
    , ChecklistItem -> Text
_state :: Text
    } deriving (ChecklistItem -> ChecklistItem -> Bool
(ChecklistItem -> ChecklistItem -> Bool)
-> (ChecklistItem -> ChecklistItem -> Bool) -> Eq ChecklistItem
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ChecklistItem -> ChecklistItem -> Bool
$c/= :: ChecklistItem -> ChecklistItem -> Bool
== :: ChecklistItem -> ChecklistItem -> Bool
$c== :: ChecklistItem -> ChecklistItem -> Bool
Eq, Int -> ChecklistItem -> ShowS
[ChecklistItem] -> ShowS
ChecklistItem -> String
(Int -> ChecklistItem -> ShowS)
-> (ChecklistItem -> String)
-> ([ChecklistItem] -> ShowS)
-> Show ChecklistItem
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ChecklistItem] -> ShowS
$cshowList :: [ChecklistItem] -> ShowS
show :: ChecklistItem -> String
$cshow :: ChecklistItem -> String
showsPrec :: Int -> ChecklistItem -> ShowS
$cshowsPrec :: Int -> ChecklistItem -> ShowS
Show)

-- create Aeson code
$(deriveFromJSON ''ChecklistItem)

-- create lenses
$(makeLenses ''ChecklistItem)

-- operations
checklistItemToSubTask :: ChecklistItem -> ST.Subtask
checklistItemToSubTask :: ChecklistItem -> Subtask
checklistItemToSubTask ChecklistItem
cl = Text -> Bool -> Subtask
ST.new (ChecklistItem
cl ChecklistItem -> Getting Text ChecklistItem Text -> Text
forall s a. s -> Getting a s a -> a
^. Getting Text ChecklistItem Text
Lens' ChecklistItem Text
name) ((ChecklistItem
cl ChecklistItem -> Getting Text ChecklistItem Text -> Text
forall s a. s -> Getting a s a -> a
^. Getting Text ChecklistItem Text
Lens' ChecklistItem Text
state) Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
== Text
"complete")

-- check list wrapper
newtype ChecklistWrapper = ChecklistWrapper
    { ChecklistWrapper -> [ChecklistItem]
_checkItems :: [ChecklistItem]
    } deriving (ChecklistWrapper -> ChecklistWrapper -> Bool
(ChecklistWrapper -> ChecklistWrapper -> Bool)
-> (ChecklistWrapper -> ChecklistWrapper -> Bool)
-> Eq ChecklistWrapper
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ChecklistWrapper -> ChecklistWrapper -> Bool
$c/= :: ChecklistWrapper -> ChecklistWrapper -> Bool
== :: ChecklistWrapper -> ChecklistWrapper -> Bool
$c== :: ChecklistWrapper -> ChecklistWrapper -> Bool
Eq, Int -> ChecklistWrapper -> ShowS
[ChecklistWrapper] -> ShowS
ChecklistWrapper -> String
(Int -> ChecklistWrapper -> ShowS)
-> (ChecklistWrapper -> String)
-> ([ChecklistWrapper] -> ShowS)
-> Show ChecklistWrapper
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ChecklistWrapper] -> ShowS
$cshowList :: [ChecklistWrapper] -> ShowS
show :: ChecklistWrapper -> String
$cshow :: ChecklistWrapper -> String
showsPrec :: Int -> ChecklistWrapper -> ShowS
$cshowsPrec :: Int -> ChecklistWrapper -> ShowS
Show)

-- create Aeson code
$(deriveFromJSON ''ChecklistWrapper)

-- create lenses
$(makeLenses ''ChecklistWrapper)