module Hbro.Socket where
    
-- {{{ Imports
import Hbro.Types

import Control.Monad
import Data.ByteString.Char8 (pack, unpack)
import Graphics.UI.Gtk.General.General
import Graphics.UI.Gtk.WebKit.WebView
import System.ZMQ 
-- }}}
    
createReplySocket :: String -> Browser -> IO a
createReplySocket socketName browser = withContext 1 $ \context -> do  
    withSocket context Rep $ \socket -> do
        bind socket socketName

        postGUIAsync $ do
            quitAdd 0 $ do
                close socket
                return False
            return ()

        forever $ do
            command <- receive socket []
            case unpack command of
                -- Get information
                "getUri" -> do
                    getUri <- postGUISync $ webViewGetUri (mWebView $ mGUI browser)
                    case getUri of
                        Just uri -> send socket (pack uri) []
                        _        -> send socket (pack "ERROR No URL opened") []
                "getTitle" -> do
                    getTitle <- postGUISync $ webViewGetTitle (mWebView $ mGUI browser)
                    case getTitle of
                        Just title -> send socket (pack title) []
                        _          -> send socket (pack "ERROR No title") []
                "getFaviconUri" -> do
                    getUri <- postGUISync $ webViewGetIconUri (mWebView $ mGUI browser)
                    case getUri of
                        Just uri -> send socket (pack uri) []
                        _        -> send socket (pack "ERROR No favicon uri") []
                "getLoadProgress" -> do
                    progress <- postGUISync $ webViewGetProgress (mWebView $ mGUI browser)
                    send socket (pack (show progress)) []

                -- Trigger actions
                ('l':'o':'a':'d':'U':'r':'i':' ':uri) -> do
                    postGUIAsync $ webViewLoadUri (mWebView $ mGUI browser) uri
                    send socket (pack "OK") []
                "stopLoading" -> do
                    postGUIAsync $ webViewStopLoading (mWebView $ mGUI browser) 
                    send socket (pack "OK") []
                "reload" -> do
                    postGUIAsync $ webViewReload (mWebView $ mGUI browser)
                    send socket (pack "OK") []
                "goBack" -> do
                    postGUIAsync $ webViewGoBack (mWebView $ mGUI browser)
                    send socket (pack "OK") []
                "goForward" -> do
                    postGUIAsync $ webViewGoForward (mWebView $ mGUI browser)
                    send socket (pack "OK") []
                "zoomIn" -> do
                    postGUIAsync $ webViewZoomIn (mWebView $ mGUI browser)
                    send socket (pack "OK") []
                "zoomOut" -> do
                    postGUIAsync $ webViewZoomOut (mWebView $ mGUI browser)
                    send socket (pack "OK") []

                _ -> send socket (pack "ERROR Unknown command") []