module Server.Api.V0.Serializers
( serializeCourse
, serializeDeck
) where

import Core
import Server.Core
import Language.Lojban.Core
import Server.Logic.Decks (computeCardProficiencyScore)
import qualified Server.Api.V0.Contract as Contract
import qualified Data.Map as M

serializeCourse :: Course -> Contract.Course
serializeCourse :: Course -> Course
serializeCourse Course
course = Text -> Text -> CourseStyle -> Course
Contract.Course Text
title Text
dictionaryId CourseStyle
style where
    title :: Text
title = Course -> Text
courseTitle Course
course
    dictionaryId :: Text
dictionaryId = Dictionary -> Text
dictIdentifier (Course -> Dictionary
courseDictionary Course
course)
    style :: CourseStyle
style = CourseStyle -> CourseStyle
serializeCourseStyle (Course -> CourseStyle
courseStyle Course
course)

serializeCourseStyle :: CourseStyle -> Contract.CourseStyle
serializeCourseStyle :: CourseStyle -> CourseStyle
serializeCourseStyle CourseStyle
courseStyle = Maybe String -> Maybe String -> CourseStyle
Contract.CourseStyle Maybe String
color1 Maybe String
iconUrl where
    color1 :: Maybe String
color1 = CourseStyle -> Maybe String
courseStyleColor1 CourseStyle
courseStyle
    iconUrl :: Maybe String
iconUrl = CourseStyle -> Maybe String
courseStyleIconUrl CourseStyle
courseStyle

serializeDeck :: Deck -> Maybe DeckPreferences -> Maybe DeckProficiency -> Contract.Deck
serializeDeck :: Deck -> Maybe DeckPreferences -> Maybe DeckProficiency -> Deck
serializeDeck Deck
deck Maybe DeckPreferences
deckPreferences Maybe DeckProficiency
deckProficiency = Text
-> Text
-> [Card]
-> Maybe DeckPreferences
-> Maybe DeckProficiency
-> Deck
Contract.Deck Text
title Text
dictionaryId [Card]
cards Maybe DeckPreferences
serializedDeckPreferences Maybe DeckProficiency
serializedDeckProficiency where
    title :: Text
title = Deck -> Text
deckTitle Deck
deck
    dictionaryId :: Text
dictionaryId = Dictionary -> Text
dictIdentifier (Deck -> Dictionary
deckDictionary Deck
deck)
    cards :: [Card]
cards = (Card -> Card) -> [Card] -> [Card]
forall a b. (a -> b) -> [a] -> [b]
map Card -> Card
serializeCard (Deck -> [Card]
deckCards Deck
deck)
    serializedDeckPreferences :: Maybe DeckPreferences
serializedDeckPreferences = DeckPreferences -> DeckPreferences
serializeDeckPreferences (DeckPreferences -> DeckPreferences)
-> Maybe DeckPreferences -> Maybe DeckPreferences
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe DeckPreferences
deckPreferences
    serializedDeckProficiency :: Maybe DeckProficiency
serializedDeckProficiency = DeckProficiency -> DeckProficiency
serializeDeckProficiency (DeckProficiency -> DeckProficiency)
-> Maybe DeckProficiency -> Maybe DeckProficiency
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe DeckProficiency
deckProficiency

serializeCard :: Card -> Contract.Card
serializeCard :: Card -> Card
serializeCard Card
card = Text -> Text -> Card
Contract.Card Text
title Text
shortDescription where
    title :: Text
title = Card -> Text
cardTitle Card
card
    shortDescription :: Text
shortDescription = Card -> Text
cardShortDescription Card
card

serializeDeckPreferences :: DeckPreferences -> Contract.DeckPreferences
serializeDeckPreferences :: DeckPreferences -> DeckPreferences
serializeDeckPreferences DeckPreferences
deckPreferences = Map Text CardPreferences -> DeckPreferences
Contract.DeckPreferences Map Text CardPreferences
serializedCardPreferences where
    serializedCardPreferences :: Map Text CardPreferences
serializedCardPreferences = (CardPreferences -> CardPreferences)
-> Map Text CardPreferences -> Map Text CardPreferences
forall a b k. (a -> b) -> Map k a -> Map k b
M.map CardPreferences -> CardPreferences
serializeCardPreferences (Map Text CardPreferences -> Map Text CardPreferences)
-> Map Text CardPreferences -> Map Text CardPreferences
forall a b. (a -> b) -> a -> b
$ DeckPreferences -> Map Text CardPreferences
cardPreferences DeckPreferences
deckPreferences

serializeCardPreferences :: CardPreferences -> Contract.CardPreferences
serializeCardPreferences :: CardPreferences -> CardPreferences
serializeCardPreferences CardPreferences
cardPreferences = CardStatus -> CardPreferences
Contract.CardPreferences CardStatus
convertedStatus where
    convertedStatus :: CardStatus
convertedStatus = case CardPreferences -> CardStatus
cardStatus CardPreferences
cardPreferences of
        CardStatus
CardAlreadyMastered -> CardStatus
Contract.AlreadyMastered
        CardStatus
CardCurrentlyLearning -> CardStatus
Contract.CurrentlyLearning
        CardStatus
CardNotStarted -> CardStatus
Contract.NotStarted

serializeDeckProficiency :: DeckProficiency -> Contract.DeckProficiency
serializeDeckProficiency :: DeckProficiency -> DeckProficiency
serializeDeckProficiency DeckProficiency
deckProficiency = Map Text CardProficiency -> DeckProficiency
Contract.DeckProficiency Map Text CardProficiency
serializedCardProficiency where
    serializedCardProficiency :: Map Text CardProficiency
serializedCardProficiency = (CardProficiency -> CardProficiency)
-> Map Text CardProficiency -> Map Text CardProficiency
forall a b k. (a -> b) -> Map k a -> Map k b
M.map CardProficiency -> CardProficiency
serializeCardProficiency (Map Text CardProficiency -> Map Text CardProficiency)
-> Map Text CardProficiency -> Map Text CardProficiency
forall a b. (a -> b) -> a -> b
$ DeckProficiency -> Map Text CardProficiency
cardProficiencies DeckProficiency
deckProficiency

serializeCardProficiency :: CardProficiency -> Contract.CardProficiency
serializeCardProficiency :: CardProficiency -> CardProficiency
serializeCardProficiency CardProficiency
cardProficiency = Double -> CardProficiency
Contract.CardProficiency Double
score where
    score :: Double
score = CardProficiency -> Double
computeCardProficiencyScore CardProficiency
cardProficiency