module MountSvelte::ViewHelpers

def svelte_component(filename, props = {})

def svelte_component(filename, props = {})
  unless filename.match(/[a-z|A-Z][a-z|A-Z|0-9]+$/)
    raise "FileName/TagName must be in camelCase format and without .svelte suffix. It must not start with a number."
  end
  render_server_side = if props.key?(:render_server_side)
                         props.delete(:render_server_side)
                       else
                         MountSvelte::Configuration.instance.render_server_side
                       end
  unless [true, false, :auto].include?(render_server_side)
    raise "Only true, false or auto are allowed for the argument #render_server_side"
  end
  hydrate = if props.key?(:hydrate)
              props[:hydrate]
            else
              true
            end
  props.delete(:hydrate)
  html_class = props.delete(:class).to_s + " svelte-component"
  is_initial_request = request.headers['X-Turbo-Request-ID'].blank?
  # render
  if render_server_side == true || (render_server_side == :auto && is_initial_request)
    # render server side
    start_time = Time.now
    sv = MountSvelte::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"
    data = { props: props }
    data[:not_hydrated_svelte_component] = filename if hydrate
    content_tag(:div, class: html_class, data: data) do
      r = content_tag(:style, res['css'], type: 'text/css')
      r << res['html'].html_safe
      #res['html'].html_safe
    end
  else
    # render for custom-element
    tag_name = filename.gsub('/','--').underscore.gsub('_', '-') + '-svelte'
    prp = []
    props.each do |k, v|
      _v = if v.is_a?(Array) || v.is_a?(Hash)
             v.to_json
           else
             v.to_s
           end
      prp.push("#{k}='#{_v}'")
    end
    if html_class
      prp.push("class='#{html_class}'")
    end
    tag = "<#{tag_name} #{prp.join(' ')}></#{tag_name}>"
    Rails.logger.info "  Rendered Tag for Svelte custom element: «#{tag}»"
    tag.html_safe
  end
end