module Hob.Command.SaveCurrentTab (
        NewFileNameChooser,
        saveCurrentEditorTab,
        saveCurrentEditorTabHandler) where

import Control.Monad.Reader
import Graphics.UI.Gtk
import Graphics.UI.Gtk.SourceView (SourceView)

import Hob.Context
import Hob.Context.FileContext
import Hob.Context.UiContext
import Hob.Control
import Hob.Ui.Editor

type NewFileNameChooser = IO (Maybe FilePath)

saveCurrentEditorTab :: CommandHandler
saveCurrentEditorTab = CommandHandler Nothing (do
    ctx <- ask
    saveCurrentEditorTabHandler $ fileChooser ctx)
    where
        fileChooser :: Context -> IO (Maybe FilePath)
        fileChooser ctx = do
            dialog <- fileChooserDialogNew Nothing (Just $ mainWindow.uiContext $ ctx) FileChooserActionSave [("Cancel", ResponseCancel), ("Save", ResponseOk)]
            resp <- dialogRun dialog
            file <- if resp == ResponseOk then fileChooserGetFilename dialog else return Nothing
            widgetDestroy dialog
            return file

saveCurrentEditorTabHandler :: NewFileNameChooser -> App()
saveCurrentEditorTabHandler newFileNameChooser = do
    ctx <- ask
    maybeEditor <- liftIO $ getActiveEditor ctx
    maybeDo (saveInContext newFileNameChooser) maybeEditor


saveInContext :: NewFileNameChooser -> SourceView -> App ()
saveInContext newFileNameChooser editor = do
    ctx <- ask
    liftIO $ saveEditor ctx
    where fileWriter ctx = contextFileWriter . fileContext $ ctx
          saveEditor ctx = do
              path <- getEditorFilePath editor
              case path of
                  Just filePath -> saveEditorContents ctx filePath
                  Nothing -> askForFile $ saveAsNewFile ctx
          askForFile onSuccess = newFileNameChooser >>= maybe (return()) onSuccess
          saveAsNewFile ctx filePath = do
              saveEditorContents ctx filePath
              setEditorFilePath editor $ Just filePath
              updateEditorTitle editor

          saveEditorContents ctx filePath = do
              textBuf <- textViewGetBuffer editor
              text <- get textBuf textBufferText
              fileWriter ctx filePath text
              textBuf `set` [textBufferModified := False]
              return ()
