{-# LANGUAGE TemplateHaskell #-}

module Taskell.IO.HTTP.Trello.List
    ( List
    , cards
    , setCards
    , listToList
    ) where

import ClassyPrelude

import Control.Lens (makeLenses, (&), (.~), (^.))

import Taskell.IO.HTTP.Aeson       (deriveFromJSON)
import Taskell.IO.HTTP.Trello.Card (Card, cardToTask)

import qualified Taskell.Data.List as L (List, create)

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

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

-- create lenses
$(makeLenses ''List)

-- operations
setCards :: List -> [Card] -> List
setCards :: List -> [Card] -> List
setCards List
list [Card]
cs = List
list List -> (List -> List) -> List
forall a b. a -> (a -> b) -> b
& ([Card] -> Identity [Card]) -> List -> Identity List
Lens' List [Card]
cards (([Card] -> Identity [Card]) -> List -> Identity List)
-> [Card] -> List -> List
forall s t a b. ASetter s t a b -> b -> s -> t
.~ [Card]
cs

listToList :: List -> L.List
listToList :: List -> List
listToList List
ls = Text -> Seq Task -> List
L.create (List
ls List -> Getting Text List Text -> Text
forall s a. s -> Getting a s a -> a
^. Getting Text List Text
Lens' List Text
name) ([Element (Seq Task)] -> Seq Task
forall seq. IsSequence seq => [Element seq] -> seq
fromList ([Element (Seq Task)] -> Seq Task)
-> [Element (Seq Task)] -> Seq Task
forall a b. (a -> b) -> a -> b
$ Card -> Task
cardToTask (Card -> Task) -> [Card] -> [Task]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (List
ls List -> Getting [Card] List [Card] -> [Card]
forall s a. s -> Getting a s a -> a
^. Getting [Card] List [Card]
Lens' List [Card]
cards))