module AdminIt
  #
  module Helpers
    #
    class Cell < WrapIt::Base
      include WrapIt::TextContainer
      default_tag 'td'
      attr_accessor :column
      option :column

      before_capture do
        unless column.nil?
          col = parent.parent.context.field(column)
          unless col.nil?
            col.render(parent.parent.context.entity, instance: self)
          end
        end
      end
    end

    #
    class ActionsCell < WrapIt::Base
      default_tag 'td'

      before_capture do
        context = parent.parent.context
        entity = context.entity
        resource = parent.parent.resource
        single = resource.singles.select { |c| !(c <= NewContext) }
        buttons = single.map do |_context|
          if _context <= ShowContext && context.show_in_dialog?
            '<a class="btn btn-xs btn-info" ' +
            %Q(data-toggle="modal" data-target="#confirm_modal" ) +
            %Q(href="#{_context.path(entity)}?layout=dialog">) +
            %Q(<i class="fa fa-#{_context.icon}"></i></a>)
          else
            cl = _context <= ShowContext ? 'info' : 'default'
            href = _context.path(entity)
            "<a class=\"btn btn-xs btn-#{cl}\" href=\"#{href}\">" \
            "<i class=\"fa fa-#{_context.icon}\"></i></a>"
          end
        end
        if resource.destroyable?
          if context.confirm_destroy?
            confirm = single.find { |c| c.context_name == :confirm } ||
                      single.first { |c| c <= ShowContext }
            unless confirm.nil?
              buttons <<
                '<a class="btn btn-xs btn-danger" ' +
                %Q(data-toggle="modal" data-target="#confirm_modal" ) +
                %Q(href="#{confirm.path(entity)}) +
                '?layout=dialog&confirm=destroy">' +
                '<i class="fa fa-trash-o"></i></a>'
            end
          else
            show = single.first { |c| c <= ShowContext }
            unless show.nil?
              buttons << @template.link_to(
                html_safe('<i class="fa fa-trash-o"></i>'),
                show.path(entity),
                method: :delete,
                class: 'btn btn-xs btn-danger'
              )
            end
          end
        end

        html = buttons.join
        html = "<div class=\"btn-group\">#{html}</div>" if buttons.size > 1

        self[:content] = html_safe(html)
      end
    end

    #
    class Header < WrapIt::Container
      default_tag 'tr'
      child :cell, Cell, tag: 'th'
    end

    #
    class Row < WrapIt::Container
      default_tag 'tr'
      child :cell, Cell
      child :actions, ActionsCell

      before_capture do
        block = parent.context.row
        instance_exec(parent.context.entity, &block) unless block.nil?
      end
    end

    #
    class Table < WrapIt::Container
      default_tag 'table'
      html_class %w(table)
      attr_writer :context
      argument :context, if: AdminIt::Context

      def context
        @context ||= @template.context
      end

      def resource
        context.resource
      end

      child :header, Header
      child :row, Row
    end

    register :table, Table
  end
end