class SassC::Engine

def dependencies

def dependencies
  raise NotRenderedError unless @loaded_urls
  Dependency.from_filenames(@loaded_urls.filter_map do |url|
    Uri.file_url_to_path(url) if url.start_with?('file:') && !url.include?('?') && url != file_url
  end)
end

def file_url

def file_url
  @file_url ||= Uri.path_to_file_url(File.absolute_path(filename || 'stdin'))
end

def load_paths

def load_paths
  @load_paths ||= (@options[:load_paths] || []) + SassC.load_paths
end

def output_style

def output_style
  @output_style ||= begin
    style = @options.fetch(:style, :sass_style_nested).to_s.delete_prefix('sass_style_').to_sym
    case style
    when :nested, :compact, :expanded
      :expanded
    when :compressed
      :compressed
    else
      raise InvalidStyleError
    end
  end
end

def render

def render
  result = ::Sass.compile_string(
    @template,
    importer: (NoopImporter unless @options[:importer].nil?),
    load_paths:,
    syntax:,
    url: file_url,
    charset: @options.fetch(:charset, true),
    source_map: source_map_embed? || !source_map_file.nil?,
    source_map_include_sources: source_map_contents?,
    style: output_style,
    functions: functions_handler.setup(nil, functions: @functions),
    importers: import_handler.setup(nil).concat(@options.fetch(:importers, [])),
    alert_ascii: @options.fetch(:alert_ascii, false),
    alert_color: @options.fetch(:alert_color, nil),
    fatal_deprecations: @options.fetch(:fatal_deprecations, []),
    future_deprecations: @options.fetch(:future_deprecations, []),
    logger: quiet? ? ::Sass::Logger.silent : @options.fetch(:logger, nil),
    quiet_deps: @options.fetch(:quiet_deps, false),
    silence_deprecations: @options.fetch(:silence_deprecations, []),
    verbose: @options.fetch(:verbose, false)
  )
  @loaded_urls = result.loaded_urls
  @source_map = result.source_map
  css = result.css
  css += "\n" unless css.empty?
  unless @source_map.nil? || omit_source_map_url?
    source_mapping_url = if source_map_embed?
                           "data:application/json;base64,#{[@source_map].pack('m0')}"
                         else
                           Uri.file_urls_to_relative_url(source_map_file_url, file_url)
                         end
    css += "\n/*# sourceMappingURL=#{source_mapping_url} */"
  end
  css.encode(@template.encoding)
rescue ::Sass::CompileError => e
  @loaded_urls = e.loaded_urls
  line = e.span&.start&.line
  line += 1 unless line.nil?
  url = e.span&.url
  path = (Uri.file_urls_to_relative_path(url, Uri.path_to_file_url("#{Dir.pwd}/")) if url&.start_with?('file:'))
  raise SyntaxError.new(e.full_message, filename: path, line:)
end

def source_map

def source_map
  raise NotRenderedError unless @source_map
  url = Uri.parse(source_map_file_url || file_url)
  data = JSON.parse(@source_map)
  data['sources'].map! do |source|
    if source.start_with?('file:')
      Uri.file_urls_to_relative_url(source, url)
    else
      source
    end
  end
  JSON.generate(data)
end

def source_map_file_url

def source_map_file_url
  @source_map_file_url ||= if source_map_file
                             Uri.path_to_file_url(File.absolute_path(source_map_file))
                                .gsub('%3F', '?') # https://github.com/sass-contrib/sassc-embedded-shim-ruby/pull/69
                           end
end

def syntax

def syntax
  syntax = @options.fetch(:syntax, :scss)
  syntax = :indented if syntax.to_sym == :sass
  syntax
end