module Hob.Context.FileContext (
    FileContext(..),
    FileLoader,
    FileWriter,
    FileTreeLoader,
    defaultFileContext,
    sourceLanguage
) where

import Data.Text                  (Text)
import Data.Tree                  (Forest)
import Graphics.UI.Gtk.SourceView (SourceLanguage, SourceLanguageManager,
                                   sourceLanguageManagerGuessLanguage,
                                   sourceLanguageManagerNew)

import Hob.DirectoryTree

type FileLoader = FilePath -> IO (Maybe Text)
type FileWriter = FilePath -> Text -> IO ()
type FileTreeLoader = IO (Forest DirectoryTreeElement)

data FileContext = FileContext {
    contextLanguageManager :: SourceLanguageManager,
    contextFileLoader      :: FileLoader,
    contextFileWriter      :: FileWriter,
    contextFileTreeLoader  :: FileTreeLoader
}

defaultFileContext :: FileLoader -> FileWriter -> FileTreeLoader -> IO FileContext
defaultFileContext loader writer treeLoader = do
    languageManager <- sourceLanguageManagerNew
    return $ FileContext languageManager loader writer treeLoader

sourceLanguage :: FileContext -> FilePath -> IO (Maybe SourceLanguage)
sourceLanguage ctx filePath = sourceLanguageManagerGuessLanguage (contextLanguageManager ctx) (Just filePath) (Nothing::Maybe String)