module Haskmon.Client(
getPokedexById,
getNationalPokedex,
getPokemonById,
getPokemonByName,
getAbilityById,
getMoveById,
getTypeById,
getEggGroupById,
getDescriptionById,
getGameById,
getSpriteById
) where
import Haskmon.Types
import Haskmon.Resource(getResource)
import Data.Word
import Data.Aeson(FromJSON)
import Data.List(find)
import Data.Char(toLower)
import Control.Applicative((<$>))
import qualified Data.Traversable as T
type ID = Word
getResourceById :: FromJSON a => String -> ID -> IO a
getResourceById res dbId = getResource $ "api/v1/" ++ res ++ "/" ++ show dbId ++ "/"
getPokedexById :: ID -> IO Pokedex
getPokedexById = getResourceById "pokedex"
getNationalPokedex :: IO Pokedex
getNationalPokedex = getPokedexById 1
getPokemonById :: ID -> IO Pokemon
getPokemonById = getResourceById "pokemon"
getPokemonByName :: String
-> IO (Maybe Pokemon)
getPokemonByName name = do
metaPkms <- pokedexPokemons <$> getNationalPokedex
let lName = toLower <$> name
maybePk = find ( (==) lName . mPokemonName) metaPkms
T.sequence $ fmap getPokemon maybePk
getAbilityById :: ID -> IO Ability
getAbilityById = getResourceById "ability"
getMoveById :: ID -> IO Move
getMoveById = getResourceById "move"
getTypeById :: ID -> IO Type
getTypeById = getResourceById "type"
getEggGroupById :: ID -> IO EggGroup
getEggGroupById = getResourceById "egg"
getDescriptionById :: ID -> IO Description
getDescriptionById = getResourceById "description"
getGameById :: ID -> IO Description
getGameById = getResourceById "game"
getSpriteById :: ID -> IO Sprite
getSpriteById = getResourceById "sprite"