module SvelteOnRails::ViewHelpers

def svelte_component(filename, props = {})

def svelte_component(filename, props = {})
  # check filename
  conf = SvelteOnRails::Configuration.instance
  cff = conf.components_folder_full
  file_path = cff + "#{filename}.svelte"
  found = (conf.watch_changes? ? SvelteOnRails::RenderServerSide.file_exist_case_sensitive?(cff, filename + '.svelte') : File.exist?(file_path))
  unless found
    ff = conf.frontend_folder
    cf = conf.components_folder
    raise "File not found: #{file_path}\nsvelte-on-rails gem, view helper #svelte_component\n\nYour configurations are:\nfrontend_folder: «#{ff}»\ncomponents_folder: «#{cf}»\n.. and the filename attribute for the view helper: «#{filename}»\n"
  end
  # check what to do
  rss = if props.key?(:render_server_side)
          props.delete(:render_server_side)
        else
          conf.render_server_side
        end
  unless [true, false, :auto].include?(rss)
    raise "Only true, false or auto are allowed for the argument #render_server_side"
  end
  render_server_side = (rss == :auto && request.headers['X-Turbo-Request-ID'].blank? || rss)
  hydrate = if props.key?(:hydrate)
              props[:hydrate]
            else
              true
            end
  # separate hashes
  props.delete(:hydrate)
  props.delete(:render_server_side)
  options = props.slice(:class, :id, :style)
  props.delete(:class)
  props.delete(:id)
  props.delete(:style)
  # set up html
  options[:class] = options[:class].to_s
  options[:class] += ' svelte-component svelte-on-rails-not-initialized-component'
  options[:data] ||= {}
  options[:data][:props] = props.to_json
  options[:data][:svelte_component] = filename
  if render_server_side
    # render server side
    start_time = Time.now
    sv = SvelteOnRails::RenderServerSide.new(filename + '.svelte')
    sv.compile_if_changes
    res = sv.render_compiled_file(props)
    time = Time.now - start_time
    Rails.logger.info "  Rendered #{filename}.svelte server-side: #{time.round(3)}ms"
    content_tag(:div, options) do
      r = content_tag(:style, res['css'], type: 'text/css')
      r << res['html'].html_safe
    end
  else
    # render empty element
    Rails.logger.info "  Rendered #{filename}.svelte as empty element that will be mounted on the client side"
    content_tag(:div, options) {}
  end
end