module CamaleonCms::Frontend::SeoHelper
  # add seo attributes to your page
  # you can pass custom data to overwrite default data generated by the system
  # return hash of seo attributes used by the_head(...)
  def cama_the_seo(data = {})
    if is_home?
      data2 = {}
    elsif is_page?
      data2 = {image: @cama_visited_post.the_thumb_url, title: "#{current_site.the_title} | #{@cama_visited_post.the_title}", description: @cama_visited_post.the_excerpt, keywords: @cama_visited_post.the_keywords, object: @cama_visited_post }
    elsif is_ajax?
      data2 = {}
    elsif is_search?
      data2 = {title: "#{current_site.the_title} | #{ct("search_title", default: "Search")}"}
    elsif is_post_type?
      data2 = {image: @cama_visited_post_type.the_thumb_url, title: "#{current_site.the_title} | #{@cama_visited_post_type.the_title}", description: @cama_visited_post_type.the_excerpt, keywords: @cama_visited_post_type.the_keywords, object: @cama_visited_post_type }
    elsif is_post_tag?
      data2 = {title: "#{current_site.the_title} | #{@cama_visited_tag.the_title}", description: @cama_visited_tag.the_excerpt, keywords: @cama_visited_tag.the_keywords, object: @cama_visited_tag }
    elsif is_category?
      data2 = {image: @cama_visited_category.the_thumb_url, title: "#{current_site.the_title} | #{@cama_visited_category.the_title}", description: @cama_visited_category.the_excerpt, keywords: @cama_visited_category.the_keywords, object: @cama_visited_category }
    elsif is_profile?
      data2 = {image: @user.the_avatar, title: "#{current_site.the_title} | #{@user.the_name}", description: @user.the_slogan, object: @user }
    else
      data2 = {}
    end
    cama_build_seo(data2.merge(@_cama_seo_setting_values || {}).merge(data))
  end

  # permit to define seo attributes by code without hooks (check here for more attributes: https://github.com/kpumuk/meta-tags)
  # @Sample: cama_seo_settings({title: "my custom title", description: "my descr", keywords: "my keywords", image: 'my img url'})
  # This values will be shown within the_head(...)
  def cama_seo_settings(options)
    @_cama_seo_setting_values ||= {}
    @_cama_seo_setting_values = @_cama_seo_setting_values.merge(options)
  end

  private
  # create seo attributes with options + default attributes
  def cama_build_seo(options = {})
    options[:image] = current_site.get_option("screenshot", current_site.the_logo) unless options[:image].present?
    options[:title] = current_site.the_title unless options[:title].present?
    options[:description] = current_site.the_option("seo_description") unless options[:description].present?
    options[:url] = request.original_url
    options[:keywords] = current_site.the_option("keywords") unless options[:keywords].present?

    s = {
      keywords: options[:keywords],
      author: current_site.get_option('seo_author'),
      icon: current_site.the_icon,
      og: {
        title: options[:title],
        description: options[:description],
        type: 'website',
        url: options[:url],
        image: options[:image]
      },
      twitter: {
        card: 'summary',
        title: options[:title],
        description: options[:description],
        url:   options[:url],
        image: options[:image],
        site: current_site.get_option('twitter_card'),
        creator: current_site.get_option('twitter_card'),
        domain: request.host
      },
      alternate: [
        { type: 'application/rss+xml', href: cama_rss_url }
      ]
    }.merge(options.except(:object))

    l = current_site.get_languages
    if l.size > 1
      l.each do |lang|
        s[:alternate] << {
          href: options[:object].present? ? options[:object].the_url(locale: lang) : current_site.the_url(locale: lang),
          hreflang: lang
        }
      end
    end

    # call all hooks for seo
    r = { seo_data: s, object: options[:object] }
    hooks_run('seo', r)
    r[:seo_data]
  end
end
