require 'plezi/render/has_cache'
# Support for Sass if SassC wasn't loaded.
unless defined?(::SassC)
   unless defined?(::Sass)
      begin
         require('sass')
      rescue Exception

      end
   end

   if defined?(::Sass)
      module Plezi
         module Base
            # This is a baker, not a renderer
            module BakeSASS
               extend HasCache

               module_function

               SASS_OPTIONS = { cache_store: Sass::CacheStores::Memory.new, style: (ENV['SASS_STYLE'] || ((ENV['ENV'] || ENV['RACK_ENV']) == 'production' ? :compressed : :nested)) }.dup

               # Bakes the SASS for the requested target, if a SASS source file is found.
               def call(target)
                  return self[target] if File.extname(target) == '.map'.freeze
                  review_cache("#{target}.scss", target) || review_cache("#{target}.sass", target)
               end

               def review_cache(filename, target)
                  return nil unless File.exist?(filename)
                  eng = self[filename]
                  return self[target] unless eng.nil? || refresh_sass?(filename)
                  self[filename] = (eng = Sass::Engine.for_file(filename, SASS_OPTIONS)).dependencies
                  map_name = "#{target}.map".freeze
                  css, map = eng.render_with_sourcemap(File.basename(map_name))
                  self[filename.to_sym] = Time.now
                  IO.write map_name, map.to_json(css_uri: File.basename(target))
                  self[target] = css
               end

               def refresh_sass?(sass)
                  mt = self[sass.to_sym]
                  return true if mt < File.mtime(sass)
                  self[sass].each { |e| return true if File.exist?(e.options[:filename]) && (File.mtime(e.options[:filename]) > mt) }
                  false
               end
            end

            ::Plezi::AssetBaker.register :css, ::Plezi::Base::BakeSASS
            ::Plezi::AssetBaker.register :map, ::Plezi::Base::BakeSASS
         end
      end
   end
end
