{-# LANGUAGE OverloadedStrings #-}
-----------------------------------------------------------------------------
--
-- Module      :  VCSGui.Svn.Checkout
-- Copyright   :  2011 Stephan Fortelny, Harald Jagenteufel
-- License     :  GPL
--
-- Maintainer  :  stephanfortelny at gmail.com, h.jagenteufel at gmail.com
-- Stability   :
-- Portability :
--
-- | Provides a GUI for checking out a working copy of a SVN repository.
--
-----------------------------------------------------------------------------

module VCSGui.Svn.Checkout (
    showCheckoutGUI
) where

import Graphics.UI.Gtk
import Control.Monad.Trans(liftIO)
import Control.Monad
import Control.Monad.Reader
import qualified VCSWrapper.Svn as Svn
import qualified VCSGui.Common.GtkHelper as H
import Paths_vcsgui(getDataFileName)
import Data.Maybe
import qualified Data.Text as T (unpack, pack)
import Control.Applicative ((<$>))
--
-- glade path and object accessors
--

getGladepath = getDataFileName "data/guiSvnCheckout.glade"
accessorWindowCheckout = "windowCheckout"
accessorActCheckout = "actCheckout"
accessorActCancel = "actCancel"
accessorActTxtViewUrl = "txtViewUrl"
accessorActTxtViewRevision = "txtViewRevision"
accessorActTxtViewPath = "txtViewPath"

data CheckoutGUI = CheckoutGUI {
    windowCheckout :: H.WindowItem
    ,actCheckout :: H.ActionItem
    ,actCancel :: H.ActionItem
    ,txtViewUrl :: H.TextViewItem
    ,txtViewRevision :: H.TextViewItem
    ,txtViewPath :: H.TextViewItem
    }

-- | Shows a GUI asking user for data to checkout a working copy of a SVN repository.
showCheckoutGUI :: Svn.Ctx()
showCheckoutGUI = do
    config <- ask
    liftIO $ do
        putStrLn "Starting gui ..."
        gui <- loadCheckoutGUI

         -- connect actions
        H.registerClose $ windowCheckout gui
        H.registerCloseAction (actCancel gui) (windowCheckout gui)
        liftIO $ on (H.getItem (actCheckout gui)) actionActivated $ do
                                            url <- H.get (txtViewUrl gui)
                                            realRevision <- H.get (txtViewRevision gui)
                                            realFilePath <- H.get (txtViewPath gui)
                                            let mbPwd = Nothing
                                            Svn.runVcs config $ Svn.checkout [(fromMaybe "" url, realRevision)] realFilePath mbPwd [] -- TODO pw handler
                                            H.closeWin $ windowCheckout gui


        liftIO $ widgetShowAll $ H.getItem $ windowCheckout gui

        liftIO $ putStrLn "Finished"
    return ()


loadCheckoutGUI :: IO CheckoutGUI
loadCheckoutGUI = do
                putStrLn $ "Creating builder from gladefile"
                gladepath <- liftIO getGladepath
                builder <- liftIO $ H.openGladeFile gladepath

                putStrLn $ "Creating gtk widgets from builder"
                win <- liftIO $ H.getWindowFromGlade builder accessorWindowCheckout
                actCheckout <- liftIO $  H.getActionFromGlade builder accessorActCheckout
                actCancel <- liftIO $  H.getActionFromGlade builder accessorActCancel
                txtViewUrl <- liftIO $  H.getTextViewFromGlade builder accessorActTxtViewUrl
                txtViewRevision <- liftIO $  H.getTextViewFromGlade builder accessorActTxtViewRevision
                txtViewPath <- liftIO $  H.getTextViewFromGlade builder accessorActTxtViewPath
                return $ CheckoutGUI win actCheckout actCancel txtViewUrl txtViewRevision txtViewPath