module Text.Yahoo.Types where

import Network.HTTP (urlEncode)

import Text.XML.Light.Cursor

import Data.Maybe

type URL = String
type MIME = String
type UserString = String
type Date = String
type Size = Integer


type Error = (String, Maybe Cursor)
-- 'Error's pass an optional 'Cursor', as defined in the 'xml' library.

data ResultSet = ResultSet
  { totalResultsAvailable :: Integer
  , totalResultsReturned :: Int
  , firstResultPosition :: Integer
  , results :: [Result] }
  deriving (Eq,Show)

data Result = Result
  { title :: String
  , summary :: String
  , url :: URL
  , clickUrl :: URL
  , mimeType :: Maybe MIME
  , modDate :: Maybe Date
  , cache :: Maybe (URL,Size) }
  deriving (Eq,Show)

-- | Related Suggestion and Spelling Suggestion results
type RSResultSet = [String]

-- | Web and Context Search queries
data Query = Query
  { appid :: UserString -- ^ An application-specific ID provided by Yahoo
  , query :: UserString -- ^ The query string
  , context :: Maybe UserString -- ^ An optional context string
  , region :: Region -- ^ Filter results by region
  , ty :: Type -- ^ The query type
  , numResults :: Int -- ^ The number of results to return
  , start :: Int -- ^ The index of the first result to return, beginning with 1
  , format :: Format -- ^ The query format
  , adult_ok :: Bool -- ^ True turns on adult results
  , similar_ok :: Bool -- ^ True turns on approximate search
  , language :: Language -- ^ Filter results by language
  , country :: Country -- ^ Filter results by country 
  , site :: Maybe [UserString] -- ^ Restrict search to specific websites
  , subscription :: Maybe Subscription -- ^ Search subscription-based sites
  , license :: License -- ^ Filter results by license
  }

-- | Related Suggestion and Spelling Suggestion queries
data RSQuery = RSQuery
  { rsappid :: UserString -- ^ An application-specific ID provided by Yahoo
  , rsquery :: UserString -- ^ The query string
  , rsNumResults :: Int -- ^ The number of results to return
  }

-- | Coerce a 'UserString' to a 'String'
sanitize :: UserString -> String
sanitize = urlEncode

instance Show Query where
  showsPrec _ q = showString "appid=" . showString (sanitize (appid q))
    . showString "&query=" . showString (sanitize (query q))
    . showString (maybe "" (("&context=" ++) . sanitize) (context q))
    . showString "&region=" . (showString . show) (region q)
    . showString "&type=" . (showString . show) (ty q)
    . showString "&results=" . (showString . show) (numResults q)
    . showString "&start=" . (showString . show) (start q)
    . showString "&format=" . (showString . show) (format q)
    . showString (if (adult_ok q) then "&adult_ok=1" else "")
    . showString (if (similar_ok q) then "&similar_ok=1" else "")
    . showString "&language=" . (showString . show) (language q)
    . showString "&country=" . (showString . show) (country q)
    . showString (maybe "" (unwords . (map (("&site=" ++) . sanitize))) (site q))
    . showString "&subscription=" . showString ((maybe "" show) (subscription q))
    . showString "&license=" . (showString . show) (license q)

instance Show RSQuery where
  showsPrec _ q = showString "appid=" . showString (sanitize (rsappid q))
    . showString "&query=" . showString (sanitize (rsquery q))
    . showString "&results=" . (showString . show) (rsNumResults q)
  
data Region =
    RegionDefault
  | RegionArgentina
  | RegionAustralia 
  | RegionAustria
  | RegionBrazil
  | RegionCanada
  | RegionCatalan
  | RegionDenmark
  | RegionFinland
  | RegionFrance
  | RegionGermany
  | RegionIndia
  | RegionIndonesia
  | RegionItaly
  | RegionMalaysia
  | RegionMexico
  | RegionNetherlands
  | RegionNorway
  | RegionPhillipines
  | RegionRussianFederation
  | RegionSingapore
  | RegionSpain
  | RegionSweden
  | RegionSwitzerland
  | RegionThailand
  | RegionUnitedKingdomIreland
  | RegionUnitedStates 

instance Show Region where
  showsPrec _ RegionDefault = showString ""
  showsPrec _ RegionArgentina = showString "ar"
  showsPrec _ RegionAustralia = showString "au"
  showsPrec _ RegionAustria = showString "at"
  showsPrec _ RegionBrazil = showString "br"
  showsPrec _ RegionCanada = showString "ca"
  showsPrec _ RegionCatalan = showString "ct"
  showsPrec _ RegionDenmark = showString "dk"
  showsPrec _ RegionFinland = showString "fi"
  showsPrec _ RegionFrance = showString "fr"
  showsPrec _ RegionGermany = showString "de"
  showsPrec _ RegionIndia = showString "in"
  showsPrec _ RegionIndonesia = showString "id"
  showsPrec _ RegionItaly = showString "it"
  showsPrec _ RegionMalaysia = showString "my"
  showsPrec _ RegionMexico = showString "mx"
  showsPrec _ RegionNetherlands = showString "nl"
  showsPrec _ RegionNorway = showString "no"
  showsPrec _ RegionPhillipines = showString "ph"
  showsPrec _ RegionRussianFederation = showString "ru"
  showsPrec _ RegionSingapore = showString "sg"
  showsPrec _ RegionSpain = showString "es"
  showsPrec _ RegionSweden = showString "se"
  showsPrec _ RegionSwitzerland = showString "ch"
  showsPrec _ RegionThailand = showString "th"
  showsPrec _ RegionUnitedKingdomIreland = showString "uk"
  showsPrec _ RegionUnitedStates = showString "us"

data Type =
    TypeDefault
  | TypeAll
  | TypeAny
  | TypePhrase

instance Show Type where
  showsPrec _ TypeDefault = showString ""
  showsPrec _ TypeAll = showString "all"
  showsPrec _ TypeAny = showString "any"
  showsPrec _ TypePhrase = showString "phrase"

data Format =
    FormatDefault
  | FormatAny
  | FormatHtml
  | FormatMsWord
  | FormatPdf
  | FormatPpt
  | FormatRss
  | FormatTxt
  | FormatXls

instance Show Format where
  showsPrec _ FormatDefault = showString ""
  showsPrec _ FormatAny = showString "any"
  showsPrec _ FormatHtml = showString "html"
  showsPrec _ FormatMsWord = showString "msword"
  showsPrec _ FormatPdf = showString "pdf"
  showsPrec _ FormatPpt = showString "ppt"
  showsPrec _ FormatRss = showString "rss"
  showsPrec _ FormatTxt = showString "txt"
  showsPrec _ FormatXls = showString "xls"

data Language = 
    LanguageDefault
  | LanguageArabic
  | LanguageBulgarian 
  | LanguageCatalan      
  | LanguageChineseSimplified	
  | LanguageChineseTraditional
  | LanguageCroatian	
  | LanguageCzech	
  | LanguageDanish	
  | LanguageDutch	
  | LanguageEnglish	
  | LanguageEstonian	
  | LanguageFinnish	
  | LanguageFrench	
  | LanguageGerman	
  | LanguageGreek	
  | LanguageHebrew
  | LanguageHungarian
  | LanguageIcelandic
  | LanguageIndonesian
  | LanguageItalian
  | LanguageJapanese
  | LanguageKorean
  | LanguageLatvian
  | LanguageLithuanian
  | LanguageNorwegian
  | LanguagePersian
  | LanguagePolish
  | LanguagePortuguese
  | LanguageRomanian
  | LanguageRussian
  | LanguageSlovak
  | LanguageSerbian
  | LanguageSlovenian
  | LanguageSpanish
  | LanguageSwedish
  | LanguageThai
  | LanguageTurkish

instance Show Language where
  showsPrec _ LanguageDefault = showString ""
  showsPrec _ LanguageArabic = showString "ar"
  showsPrec _ LanguageBulgarian = showString "bg"
  showsPrec _ LanguageCatalan = showString "ca"
  showsPrec _ LanguageChineseSimplified = showString "szh"
  showsPrec _ LanguageChineseTraditional = showString "tzh"
  showsPrec _ LanguageCroatian = showString "hr"
  showsPrec _ LanguageCzech = showString "cs"
  showsPrec _ LanguageDanish = showString "da"
  showsPrec _ LanguageDutch = showString "nl"
  showsPrec _ LanguageEnglish = showString "en"
  showsPrec _ LanguageEstonian = showString "et"
  showsPrec _ LanguageFinnish = showString "fi"
  showsPrec _ LanguageFrench = showString "fr"
  showsPrec _ LanguageGerman = showString "de"
  showsPrec _ LanguageGreek = showString "el"
  showsPrec _ LanguageHebrew = showString "he"
  showsPrec _ LanguageHungarian = showString "hu"
  showsPrec _ LanguageIcelandic = showString "is"
  showsPrec _ LanguageIndonesian = showString "id"
  showsPrec _ LanguageItalian = showString "it"
  showsPrec _ LanguageJapanese = showString "ja"
  showsPrec _ LanguageKorean = showString "ko"
  showsPrec _ LanguageLatvian = showString "lv"
  showsPrec _ LanguageLithuanian = showString "lt"
  showsPrec _ LanguageNorwegian = showString "no"
  showsPrec _ LanguagePersian = showString "fa"
  showsPrec _ LanguagePolish = showString "pl"
  showsPrec _ LanguagePortuguese = showString "pt"
  showsPrec _ LanguageRomanian = showString "ro"
  showsPrec _ LanguageRussian = showString "ru"
  showsPrec _ LanguageSlovak = showString "sk"
  showsPrec _ LanguageSerbian = showString "sr"
  showsPrec _ LanguageSlovenian = showString "sl"
  showsPrec _ LanguageSpanish = showString "es"
  showsPrec _ LanguageSwedish = showString "sv"
  showsPrec _ LanguageThai = showString "th"
  showsPrec _ LanguageTurkish = showString "tr"

data Country =
    CountryDefault
  | CountryArgentina
  | CountryAustralia 
  | CountryAustria
  | CountryBelgium
  | CountryBrazil
  | CountryCanada
  | CountryChina
  | CountryCzechoslovakia
  | CountryDenmark
  | CountryFinland
  | CountryFrance
  | CountryGermany
  | CountryItaly
  | CountryJapan
  | CountryKorea
  | CountryNetherlands
  | CountryNorway
  | CountryPoland
  | CountryRussianFederation
  | CountrySpain
  | CountrySweden
  | CountrySwitzerland
  | CountryTaiwan
  | CountryUnitedKingdom
  | CountryUnitedStates 

instance Show Country where
  showsPrec _ CountryDefault = showString ""
  showsPrec _ CountryArgentina = showString "ar"
  showsPrec _ CountryAustralia = showString "au"
  showsPrec _ CountryAustria = showString "at"
  showsPrec _ CountryBelgium = showString "be"
  showsPrec _ CountryBrazil = showString "br"
  showsPrec _ CountryCanada = showString "ca"
  showsPrec _ CountryChina = showString "cn"
  showsPrec _ CountryCzechoslovakia = showString "cz"
  showsPrec _ CountryDenmark = showString "dk"
  showsPrec _ CountryFinland = showString "fi"
  showsPrec _ CountryFrance = showString "fr"
  showsPrec _ CountryGermany = showString "de"
  showsPrec _ CountryItaly = showString "it"
  showsPrec _ CountryJapan = showString "jp"
  showsPrec _ CountryKorea = showString "kr"
  showsPrec _ CountryNetherlands = showString "nl"
  showsPrec _ CountryNorway = showString "no"
  showsPrec _ CountryPoland = showString "pl"
  showsPrec _ CountryRussianFederation = showString "ru"
  showsPrec _ CountrySpain = showString "es"
  showsPrec _ CountrySweden = showString "se"
  showsPrec _ CountrySwitzerland = showString "ch"
  showsPrec _ CountryTaiwan = showString "tw"
  showsPrec _ CountryUnitedKingdom = showString "uk"
  showsPrec _ CountryUnitedStates = showString "us"

data Subscription =
    SubscriptionConsumerReports
  | SubscriptionFT
  | SubscriptionForresterResearch
  | SubscriptionIEEEPublications
  | SubscriptionNewEnglandJournalOfMedicine
  | SubscriptionTheStreet
  | SubscriptionWallStreetJournal

instance Show Subscription where
  showsPrec _ SubscriptionConsumerReports = showString "cr"
  showsPrec _ SubscriptionFT = showString "ft"
  showsPrec _ SubscriptionForresterResearch = showString "forrester"
  showsPrec _ SubscriptionIEEEPublications = showString "ieee"
  showsPrec _ SubscriptionNewEnglandJournalOfMedicine = showString "nejm"
  showsPrec _ SubscriptionTheStreet = showString "thestreet"
  showsPrec _ SubscriptionWallStreetJournal = showString "wsj"

data License =
    LicenseDefault
  | LicenseAny
  | LicenseCCAny
  | LicenseCCommercial
  | LicenseCCModifiable

instance Show License where
  showsPrec _ LicenseDefault = showString ""
  showsPrec _ LicenseAny = showString "any"
  showsPrec _ LicenseCCAny = showString "cc_any"
  showsPrec _ LicenseCCommercial = showString "cc_commercial"
  showsPrec _ LicenseCCModifiable = showString "cc_modifiable"