module ManageBackHelper
  extend ActiveSupport::Concern

  def sidebar_item_group(url, text, **opts)
    if opts[:has_permission]
      link_opts = url.start_with?('/') ? {} : { 'data-toggle': 'collapse', 'aria-expanded': false }
      content =
        link_to url, link_opts do
          content_tag(:i, '', class: "fa fa-#{opts[:icon]}", 'data-toggle': 'tooltip', 'data-placement': 'right', 'data-boundary': 'window', title: text) +
            content_tag(:span, text)
        end

      content +=
        content_tag(:ul, id: url[1..-1], class: 'collapse list-unstyled', "data-parent": '#sidebar') do
          yield
        end

      raw content
    end
  end

  def sidebar_item(url, text, **opts)
    if opts[:has_permission]
      content =
        link_to url, 'data-controller': opts[:controller] do
          content_tag(:i, '', class: "fa fa-#{opts[:icon]} fa-fw", 'data-toggle': 'tooltip', 'data-placement': 'right', 'data-boundary': 'window', title: text) +
            content_tag(:span, text)
        end

      raw content
    end
  end

  def admin_sidebar_controller
    key = params[:controller].to_s.gsub(/\//, '-')
    SidebarUtil.controller_name(key) || key
  end
  alias_method :sidebar_controller, :admin_sidebar_controller

  def define_admin_breadcrumbs(&block)
    content_for(:setup_admin_breadcrumb, &block)
  end
  alias_method :define_breadcrumbs, :define_admin_breadcrumbs

  def add_admin_breadcrumb(text, url = nil)
    @_breadcrumbs ||= []
    @_breadcrumbs << OpenStruct.new(text: text, url: url)
  end
  alias_method :add_breadcrumb, :add_admin_breadcrumb

  def display_text(str, default = '--')
    str.presence || default
  end

  def overflow_hidden_span(text, width: 300, placement: nil)
    opts = { class: 'd-inline-block text-truncate', style: "max-width: #{width}px" }
    opts.merge!('data-toggle': 'tooltip', title: text) if text != '--'
    opts.merge!('data-placement': placement) if placement

    content_tag(:span, text, opts)
  end

  def sort_tag(content = '', **opts)
    options = {}
    options[:sort_by] = opts.delete(:name)
    is_current_sort = params[:sort_by].to_s == options[:sort_by]
    options[:sort_direction] = is_current_sort && params[:sort_direction].to_s == 'desc' ? 'asc' : 'desc'

    path = opts.delete(:path) + "?" + unsafe_params.merge(options).to_query
    arrow_class = case params[:sort_direction].to_s
                  when 'desc' then 'fa-sort-amount-desc'
                  when 'asc' then 'fa-sort-amount-asc'
                  else ''
                  end
    opts[:style] = "#{opts[:style]} ;position: relative;"

    content_tag(:span, opts) do
      link_to path, remote: true do
        content = content_tag(:span) { yield } if block_given?

        content += content_tag(:i, '', class: "fa color-light-green ml-1 #{arrow_class}", style: 'position: absolute;top:0;') if is_current_sort
        raw content
      end
    end
  end

  def javascript_void_link(name, **opts)
    raw link_to(name, 'javascript:void(0)', opts)
  end

  def agree_link(name, url, **opts)
    klass = ['action agree-action', opts.delete(:class)].compact.join(' ')

    refresh_url_data = "refresh_url=#{CGI::escape(request.fullpath)}"
    url = url + (url.index('?') ? '&' : '?') + refresh_url_data

    raw link_to(name, url, { method: :post, remote: true, class: klass, 'data-confirm': '确认审核通过？'}.merge(opts))
  end

  def delete_link(name, url, **opts, &block)
    klass = ['action delete-action', opts.delete(:class)].compact.join(' ')

    refresh_url_data = "refresh_url=#{CGI::escape(request.fullpath)}"
    url = url + (url.index('?') ? '&' : '?') + refresh_url_data

    if block_given?
      raw link_to(url, { method: :delete, remote: true, class: klass, 'data-confirm': '确认删除？'}.merge(opts), &block)
    else
      raw link_to(name, url, { method: :delete, remote: true, class: klass, 'data-confirm': '确认删除？'}.merge(opts))
    end
  end

  def unsafe_params
    params.except(:controller, :action).to_unsafe_h
  end

  def list_index_no(page,index)
    (page - 1) * 10 + index + 1
  end
end