module Middleman
  module Sass
    module Functions
      def asset_path(_source, _options)
        # current_resource
      end

      # Using Middleman::Util#asset_path, return the full path
      # for the given +source+ as a Sass String. This supports keyword
      # arguments that mirror the +options+.
      #
      # === Examples
      #
      #   background: url(image-path("image.jpg"));                // background: url("/assets/image.jpg");
      #   background: url(image-path("image.jpg", $digest: true)); // background: url("/assets/image-27a8f1f96afd8d4c67a59eb9447f45bd.jpg");
      #
      def image_path(source, options={})
        p = ::Middleman::Util.asset_path(middleman_context, :images, source.value, map_options(options))
        ::SassC::Script::Value::String.new p.to_s, :string
      end

      # Using Middleman::Util#asset_path, return the url CSS
      # for the given +source+ as a Sass String. This supports keyword
      # arguments that mirror the +options+.
      #
      # === Examples
      #
      #   background: image-url("image.jpg");                // background: url("/assets/image.jpg");
      #   background: image-url("image.jpg", $digest: true); // background: url("/assets/image-27a8f1f96afd8d4c67a59eb9447f45bd.jpg");
      #
      def image_url(source, options={}, _cache_buster=nil)
        # Work with the Sass #image_url API
        if options.respond_to? :value
          case options.value
          when true
            return image_path source
          else
            options = {}
          end
        end

        ::SassC::Script::Value::String.new "url(#{image_path(source, options)})"
      end

      # Using Middleman::Util#asset_path, return the full path
      # for the given +source+ as a Sass String. This supports keyword
      # arguments that mirror the +options+.
      #
      # === Examples
      #
      #   src: url(font-path("font.ttf"));                // src: url("/assets/font.ttf");
      #   src: url(font-path("font.ttf", $digest: true)); // src: url("/assets/font-27a8f1f96afd8d4c67a59eb9447f45bd.ttf");
      #
      def font_path(source, options={})
        p = ::Middleman::Util.asset_path(middleman_context, :fonts, source.value, map_options(options))
        ::SassC::Script::Value::String.new p.to_s, :string
      end

      # Using Middleman::Util#asset_path, return the url CSS
      # for the given +source+ as a Sass String. This supports keyword
      # arguments that mirror the +options+.
      #
      # === Examples
      #
      #   src: font-url("font.ttf");                  // src: url("/assets/font.ttf");
      #   src: font-url("image.jpg", $digest: true);  // src: url("/assets/font-27a8f1f96afd8d4c67a59eb9447f45bd.ttf");
      #
      def font_url(source, options={})
        # Work with the Sass #font_url API
        if options.respond_to? :value
          case options.value
          when true
            return font_path source
          else
            options = {}
          end
        end
        ::SassC::Script::Value::String.new "url(#{font_path(source, options)})"
      end

      protected

      # Returns a reference to Middleman's context through
      # the importer.
      def middleman_context # :nodoc:
        options[:custom][:middleman_context]
      end

      # Returns a reference to Middleman's current resource.
      def current_resource # :nodoc:
        options[:custom][:current_resource]
      end

      # Returns an options hash where the keys are symbolized
      # and the values are unwrapped Sass literals.
      def map_options(options={}) # :nodoc:
        # ::Sass::Util.map_hash(options) do |key, value|
        #   [key.to_sym, value.respond_to?(:value) ? value.value : value]
        # end

        options[:current_resource] = current_resource

        options
      end
    end
  end
end

::SassC::Script::Functions.send :include, ::Middleman::Sass::Functions
