-- ----- BEGIN LICENSE BLOCK -----
-- Version: BSD
--
-- Copyright (c) 2016, Filip Brcic <brcha@gna.org>. All rights reserved.
--
-- Redistribution and use in source and binary forms, with or without
-- modification, are permitted provided that the following conditions are met:
--
--  * Redistributions of source code must retain the above copyright notice,
--    this list of conditions and the following disclaimer.
--
--  * Redistributions in binary form must reproduce the above copyright notice,
--    this list of conditions and the following disclaimer in the documentation
--    and/or other materials provided with the distribution.
--
--  * The name of the copyright holder may not be used to endorse or promote
--    products derived from this software without specific prior written
--    permission.
--
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER "AS IS" AND ANY EXPRESS OR
-- IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-- MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
-- EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY DIRECT, INDIRECT,
-- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-- OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-- ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--
-- ----- END LICENSE BLOCK -----

module Text.Shakespeare.Sass
    ( wsass'
    , wfsSass
    ) where

import Text.Sass
import Language.Haskell.TH
import Yesod.Default.Util (WidgetFileSettings, TemplateLanguage (..)
                          ,defaultTemplateLanguages, wfsLanguages)
import Yesod.Core

wsass' :: [FilePath] -> FilePath -> Q Exp
wsass' incPath fileName = do
    css <- runIO $ compileSassFile (Just incPath) fileName
    [| CssBuilder $(stringE css) |]

compileSassFile :: Maybe [FilePath] -> FilePath -> IO String
compileSassFile incPath fileName = do
    result <- compileFile fileName ( def { sassIncludePaths = incPath } )
    case result of
        Left err -> do
            err' <- errorMessage err
            error err'
        Right compiled -> return . resultString $ compiled

wfsSass :: [FilePath] -> WidgetFileSettings
wfsSass sassInclude = def { wfsLanguages = \hset -> defaultTemplateLanguages hset ++
    [ TemplateLanguage True  "sass" wsass wsass
    , TemplateLanguage True  "scss" wsass wsass
    ] }
    where
         wsass = wsass' sassInclude