module Update.LoggedIn.AddPayment
  ( updateAddPayment
  , addPaymentError
  ) where

import Maybe
import Json.Decode as Json exposing ((:=))

import Model.Action.AddPaymentAction exposing (..)
import Model.View.LoggedIn.AddPayment exposing (..)
import Model.Translations exposing (Translations, getMessage)
import Model.Payment exposing (PaymentFrequency(..))

updateAddPayment : AddPaymentAction -> AddPayment -> AddPayment
updateAddPayment action addPayment =
  case action of

    NoOp ->
      addPayment

    UpdateName name ->
      { addPayment | name = name }

    UpdateCost cost ->
      { addPayment | cost = cost }

    AddError nameError costError ->
      { addPayment
      | nameError = nameError
      , costError = costError
      , waitingServer = False
      }

    ToggleFrequency ->
      { addPayment
      | frequency = if addPayment.frequency == Punctual then Monthly else Punctual
      }

    WaitingServer ->
      { addPayment | waitingServer = True }

addPaymentError : Translations -> String -> Maybe AddPaymentAction
addPaymentError translations jsonErr =
  let decoder =
        Json.object2 (,)
          (Json.maybe <| "name" := Json.string)
          (Json.maybe <| "cost" := Json.string)
  in  case Json.decodeString decoder jsonErr of
        Err _ ->
          Nothing
        Ok (mbNameKey, mbCostKey) ->
          Just <| AddError
            (Maybe.map (flip getMessage translations) mbNameKey)
            (Maybe.map (flip getMessage translations) mbCostKey)