{-# LANGUAGE OverloadedStrings #-}
module Network.Lastfm.Error
  ( LastfmError(..)
  , disambiguate
  ) where

import Network.Curl (CurlCode)

data LastfmError
  = DoesntExist
  | InvalidService
  | InvalidMethod
  | AuthenticationFailed
  | InvalidFormat
  | InvalidParameters
  | InvalidResource
  | OperationFailed
  | InvalidSessionKey
  | InvalidAPIKey
  | ServiceOffline
  | SubscribersOnly
  | InvalidMethodSignature
  | TokenHasNotAuthorized
  | NotForStreaming
  | TemporaryUnavailable
  | LoginRequired
  | TrialExpired
  | DoesntExistAgain
  | NotEnoughContent
  | NotEnoughMembers
  | NotEnoughFans
  | NotEnoughNeighbours
  | NoPeakRadio
  | RadioNotFound
  | SuspendedAPIKey
  | Deprecated
  | RateLimitExceeded
  | UnknownError Int
  | CurlError CurlCode

instance Show LastfmError where
  show e = unwords $ case e of
    DoesntExist             ["DoesntExist:",            "This error does not exist"]
    InvalidService          ["InvalidService:",         "This service does not exist"]
    InvalidMethod           ["InvalidMethod:",          "No method with that name in this package"]
    AuthenticationFailed    ["AuthenticationFailed:",   "You do not have permissions to access the service"]
    InvalidFormat           ["InvalidFormat:",          "This service doesn't exist in that format"]
    InvalidParameters       ["InvalidParameters:",      "Your request is missing a required parameter"]
    InvalidResource         ["InvalidResource:",        "Invalid resource specified"]
    OperationFailed         ["OperationFailed:",        "Something else went wrong"]
    InvalidSessionKey       ["InvalidSessionKey:",      "Please re-authenticate"]
    InvalidAPIKey           ["InvalidAPIKey:",          "You must be granted a valid key by last.fm"]
    ServiceOffline          ["ServiceOffline:",         "This service is temporarily offline. Try again later."]
    SubscribersOnly         ["SubscribersOnly:",        "This station is only available to paid last.fm subscribers"]
    InvalidMethodSignature  ["InvalidMethodSignature:", "Invalid method signature supplied"]
    TokenHasNotAuthorized   ["TokenHasNotAuthorized:",  "This token has not been authorized"]
    NotForStreaming         ["NotForStreaming:",        "This item is not available for streaming."]
    TemporaryUnavailable    ["TemporaryUnavailable:",   "The service is temporarily unavailable, please try again."]
    LoginRequired           ["LoginRequired:",          "Login: User requires to be logged in"]
    TrialExpired            ["TrialExpired:",           "This user has no free radio plays left. Subscription required."]
    DoesntExistAgain        ["DoesntExistAgain:",       "This error does not exist"]
    NotEnoughContent        ["NotEnoughContent:",       "There is not enough content to play this station"]
    NotEnoughMembers        ["NotEnoughMembers:",       "This group does not have enough members for radio"]
    NotEnoughFans           ["NotEnoughFans:",          "This artist does not have enough fans for for radio"]
    NotEnoughNeighbours     ["NotEnoughNeighbours:",    "There are not enough neighbours for radio"]
    NoPeakRadio             ["NoPeakRadio:",            "This user is not allowed to listen to radio during peak usage"]
    RadioNotFound           ["RadioNotFound:",          "Radio station not found"]
    SuspendedAPIKey         ["SuspendedAPIKey:",        "Access for your account has been suspended, please contact Last.fm"]
    Deprecated              ["Deprecated:",             "This type of request is no longer supported"]
    RateLimitExceeded       ["RateLimitExceeded:",      "Your IP has made too many requests in a short period"]
    UnknownError n          ["UnknownError:",           "Lastfm API specs say nothing about this particular error:", show n]
    CurlError s             ["CurlError:", show s]

disambiguate  Int  LastfmError
disambiguate n = case n of
  1  DoesntExist
  2  InvalidService
  3  InvalidMethod
  4  AuthenticationFailed
  5  InvalidFormat
  6  InvalidParameters
  7  InvalidResource
  8  OperationFailed
  9  InvalidSessionKey
  10  InvalidAPIKey
  11  ServiceOffline
  12  SubscribersOnly
  13  InvalidMethodSignature
  14  TokenHasNotAuthorized
  15  NotForStreaming
  16  TemporaryUnavailable
  17  LoginRequired
  18  TrialExpired
  19  DoesntExistAgain
  20  NotEnoughContent
  21  NotEnoughMembers
  22  NotEnoughFans
  23  NotEnoughNeighbours
  24  NoPeakRadio
  25  RadioNotFound
  26  SuspendedAPIKey
  27  Deprecated
  28  RateLimitExceeded
  _  UnknownError n