module Web.VKHS.Types where

-- | AccessToken is a authentication data, required by all VK API
-- functions. It is a tuple of access_token, user_id, expires_in fields,
-- returned by login procedure.
-- 
-- See http://vk.com/developers.php?oid=-1&p=Авторизация_клиентских_приложений
-- (in Russian) for more details
type AccessToken = (String,String,String)

-- | Access rigth to request from VK.
data AccessRight
  = Notify  -- Пользователь разрешил отправлять ему уведомления.
  | Friends -- Доступ к друзьям.
  | Photos  -- Доступ к фотографиям.
  | Audio   -- Доступ к аудиозаписям.
  | Video   -- Доступ к видеозаписям.
  | Docs    -- Доступ к документам.
  | Notes   -- Доступ заметкам пользователя.
  | Pages   -- Доступ к wiki-страницам.
  | Status  -- Доступ к статусу пользователя.
  | Offers  -- Доступ к предложениям (устаревшие методы).
  | Questions   -- Доступ к вопросам (устаревшие методы).
  | Wall    -- Доступ к обычным и расширенным методам работы со стеной.
            -- Внимание, данное право доступа недоступно для сайтов (игнорируется при попытке авторизации).
  | Groups  -- Доступ к группам пользователя.
  | Messages    -- (для Standalone-приложений) Доступ к расширенным методам работы с сообщениями.
  | Notifications   -- Доступ к оповещениям об ответах пользователю.
  | Stats   -- Доступ к статистике групп и приложений пользователя, администратором которых он является.
  | Ads     -- Доступ к расширенным методам работы с рекламным API.
  | Offline -- Доступ к API в любое время со стороннего сервера. 
  deriving(Show)

allAccess :: [AccessRight]
allAccess =
  [ 
  --   Notify
    Friends
  , Photos
  , Audio
  , Video
  , Docs
  , Notes
  -- , Pages
  , Status
  , Offers
  , Questions
  , Wall
  , Groups
  , Messages
  , Notifications
  , Stats
  -- , Ads
  -- , Offline
  ]

-- See API docs http://vk.com/developers.php?oid=-1&p=Права_доступа_приложений (in
-- Russian) for details

-- | Verbosity level. Debug will dump *html and output curl log
data Verbosity = Normal | Trace | Debug
  deriving(Enum,Eq,Ord,Show)

type ClientId = String

data LoginEnv = LoginEnv
  { formdata :: [(String,String)]
  -- ^ Dictionary containig forms input/value
  , ac_rights :: [AccessRight]
  -- ^ Access rights, required by later API calls
  , clientId :: ClientId
  -- ^ Application ID provided by vk.com
  } deriving(Show)

data CallEnv = CallEnv
  { access_token :: String
  -- ^ Access token, the result of login operation
  } deriving(Show)

-- | VKHS environment
data Env subenv = Env
  { sub :: subenv
  , verbose :: Verbosity
  -- ^ Verbosity level
  , useragent :: String
  -- ^ User agent identifier, defaults to Mozilla Firefox
  , delay_ms :: Int
  -- ^ Delay after each transaction, in milliseconds. Library uses it for
  -- preventing application from being banned for flooding.
  } deriving (Show)

mkEnv :: s -> Env s
mkEnv x = Env
  x
  Normal
  "Mozilla/5.0 (X11; Linux x86_64; rv:12.0) Gecko/20120702 Firefox/12.0"
  500

callEnv :: Env a -> String -> Env CallEnv
callEnv (Env _ a b c) at = Env (CallEnv at) a b c