{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedStrings #-}
-- | Lastfm geo API
--
-- This module is intended to be imported qualified:
--
-- @
-- import qualified Network.Lastfm.Geo as Geo
-- @
module Network.Lastfm.Geo
  ( getEvents, getMetroArtistChart, getMetroHypeArtistChart
  , getMetroHypeTrackChart, getMetroTrackChart, getMetroUniqueArtistChart
  , getMetroUniqueTrackChart, getMetroWeeklyChartlist, getMetros
  , getTopArtists, getTopTracks
  ) where

import Network.Lastfm.Request


-- | Get all events in a specific location by country or city name.
--
-- Optional: 'longitude', 'latitude', 'location', 'distance', 'page', 'tag', 'festivalsonly', 'limit'
--
-- <http://www.last.fm/api/show/geo.getEvents>
getEvents :: Request f (APIKey -> Ready)
getEvents = api "geo.getEvents"
{-# INLINE getEvents #-}


-- | Get a chart of artists for a metro
--
-- Optional: 'start', 'end', 'page', 'limit'
--
-- <http://www.last.fm/api/show/geo.getMetroArtistChart>
getMetroArtistChart :: Request f (Metro -> Country -> APIKey -> Ready)
getMetroArtistChart = api "geo.getMetroArtistChart"
{-# INLINE getMetroArtistChart #-}


-- | Get a chart of hyped (up and coming) artists for a metro
--
-- Optional: 'start', 'end', 'page', 'limit'
--
-- <http://www.last.fm/api/show/geo.getMetroHypeArtistChart>
getMetroHypeArtistChart :: Request f (Metro -> Country -> APIKey -> Ready)
getMetroHypeArtistChart = api "geo.getMetroHypeArtistChart"
{-# INLINE getMetroHypeArtistChart #-}


-- | Get a chart of tracks for a metro
--
-- Optional: 'start', 'end', 'page', 'limit'
--
-- <http://www.last.fm/api/show/geo.getMetroHypeTrackChart>
getMetroHypeTrackChart :: Request f (Metro -> Country -> APIKey -> Ready)
getMetroHypeTrackChart = api "geo.getMetroHypeTrackChart"
{-# INLINE getMetroHypeTrackChart #-}


-- | Get a chart of tracks for a metro
--
-- Optional: 'start', 'end', 'page', 'limit'
--
-- <http://www.last.fm/api/show/geo.getMetroTrackChart>
getMetroTrackChart :: Request f (Metro -> Country -> APIKey -> Ready)
getMetroTrackChart = api "geo.getMetroTrackChart"
{-# INLINE getMetroTrackChart #-}


-- | Get a chart of the artists which make that metro unique
--
-- Optional: 'start', 'end', 'page', 'limit'
--
-- <http://www.last.fm/api/show/geo.getMetroUniqueArtistChart>
getMetroUniqueArtistChart :: Request f (Metro -> Country -> APIKey -> Ready)
getMetroUniqueArtistChart = api "geo.getMetroUniqueArtistChart"
{-# INLINE getMetroUniqueArtistChart #-}


-- | Get a chart of tracks for a metro
--
-- Optional: 'start', 'end', 'page', 'limit'
--
-- <http://www.last.fm/api/show/geo.getMetroUniqueTrackChart>
getMetroUniqueTrackChart :: Request f (Metro -> Country -> APIKey -> Ready)
getMetroUniqueTrackChart = api "geo.getMetroUniqueTrackChart"
{-# INLINE getMetroUniqueTrackChart #-}


-- | Get a list of available chart periods for this metro,
-- expressed as date ranges which can be sent to the chart services.
--
-- <http://www.last.fm/api/show/geo.getMetroWeeklyChartlist>
getMetroWeeklyChartlist :: Request f (Metro -> APIKey -> Ready)
getMetroWeeklyChartlist = api "geo.getMetroWeeklyChartlist"
{-# INLINE getMetroWeeklyChartlist #-}


-- | Get a list of valid countries and metros for use in the other webservices
--
-- Optional: 'country'
--
-- <http://www.last.fm/api/show/geo.getMetros>
getMetros :: Request f (APIKey -> Ready)
getMetros = api "geo.getMetros"
{-# INLINE getMetros #-}


-- | Get the most popular artists on Last.fm by country
--
-- Optional: 'limit', 'page'
--
-- <http://www.last.fm/api/show/geo.getTopArtists>
getTopArtists :: Request f (Country -> APIKey -> Ready)
getTopArtists = api "geo.getTopArtists"
{-# INLINE getTopArtists #-}


-- | Get the most popular tracks on Last.fm last week by country
--
-- Optional: 'limit', 'page'
--
-- <http://www.last.fm/api/show/geo.getTopTracks>
getTopTracks :: Request f (Country -> APIKey -> Ready)
getTopTracks = api "geo.getTopTracks"
{-# INLINE getTopTracks #-}