module Network.Telegram.API.Bot.Property.Accessible (Accessible (..)) where

import "base" Data.Function (flip)
import "base" Data.Functor ((<$>))
import "lens" Control.Lens (Lens')

import Network.Telegram.API.Bot.Object (Object)
import Network.Telegram.API.Bot.Object.Callback (Callback (Datatext))
import Network.Telegram.API.Bot.Object.Chat (Chat)
import Network.Telegram.API.Bot.Object.From (From)
import Network.Telegram.API.Bot.Object.Message (Message (Textual, Command))
import Network.Telegram.API.Bot.Object.Moving (Moving (Gone, Joined))
import Network.Telegram.API.Bot.Object.Update (Update (Query, Membership, Incoming))

class Object source => Accessible target source where
        access :: Lens' source target

instance Accessible Chat Callback where
        access f (Datatext cq_id msg dttxt) = flip
                (Datatext cq_id) dttxt <$> access f msg

instance Accessible Chat Message where
        access f (Textual msg_id chat from txt) = (\chat' -> Textual msg_id chat' from txt) <$> f chat
        access f (Command msg_id chat from cmd) = (\chat' -> Command msg_id chat' from cmd) <$> f chat

instance Accessible Chat Moving where
        access f (Gone chat from) = (\chat' -> Gone chat' from) <$> f chat
        access f (Joined chat froms) = (\chat' -> Joined chat' froms) <$> f chat

instance Accessible Chat Update where
        access f (Incoming upd_id msg) = Incoming upd_id <$> access f msg
        access f (Query upd_id cb) = Query upd_id <$> access f cb
        access f (Membership upd_id mmb) = Membership upd_id <$> access f mmb

instance Accessible From Callback where
        access f (Datatext cq_id msg dttxt) = flip
                (Datatext cq_id) dttxt <$> access f msg

instance Accessible From Message where
        access f (Textual msg_id chat from txt) = (\from' -> Textual msg_id chat from' txt) <$> f from
        access f (Command msg_id chat from cmd) = (\from' -> Command msg_id chat from' cmd) <$> f from