class Card
  class View
    # Manages options for rendering card views
    #
    # Many options are available to sharks via nests. (See https://decko.org/Nest_Syntax)
    #
    #      {{cardname|hide:menu}}
    #
    # These options and others are available to monkeys when rendering views
    # via #render or #nest.
    #
    #      nest "cardname", hide: :menu
    #      render :viewname, hide: :menu
    #
    module Options
      # the keymap represents a 2x2 matrix, where the factors are
      # (a) whether an option's value can be set by a shark via nests, and
      # (b) whether subviews can inherit the option from a parent view.
      #
      #                  for sharks  | not for sharks
      #                 ________________________________
      #       inherit  | both        | heir
      # don't inherit  | shark       | none
      #
      # (note: each option will likely some day merit its own object)
      @keymap = {
        shark: [
          :view,           # view to render
          :nest_name,      # name as used in nest
          :nest_syntax,    # full nest syntax
          :wrap,           # wrap the nest with a wrapper
          :show,           # render these views when optional
          :hide,           # do not render these views when optional
          :unknown         # view to use if nested card is unknown
        ],                 #   show/hide can be view (Symbol), list of views (Array),
        #                      or comma separated views (String)
        # NOTE: although show and hide are in this non-inheriting group, they are
        # actually inherited, just not through the standard mechanism. Because, well,
        # they're weird. (See process_visibility)
        heir: [
          :main,           # format object is page's "main" object (Boolean)
          :home_view,      # view for slot to return to when no view specified
          :buttons_view,
          :edit_structure, # use a different structure for editing (Array)
          :cql,            # contextual cql alterations for search cards (Hash)
          :action_id,      # a Card::Action id (Integer)
          :content_opts    # options for Card::Content.new
          # :context_names   # names used to contextualize titles
        ],
        both: [
          :help,           # cue text when editing
          :structure,      # overrides the content of the card
          :title,          # overrides the name of the card
          :variant,        # override the standard name with a different variant
          :joint,          # what joins the parts of a compound name ("+" by default)
          :input_type,     # inline_nests makes a form within standard content (Symbol)
          :type,           # set the default type of new cards
          :size,           # set an image size
          #                    (also used for character limit in one_line_content)
          :header,         # h1, h2, h3..
          :items,          # options for items (Hash)
          :cache,          # change view cache behaviour
          #                    (Symbol<:always, :standard, :never>)
          :edit,           # edit mode
          #                    (Symbol<:inline, :standard, :full>)
          :separator,      # item separator in certain lists
          :filter,

          # DEPRECATED
          :params          # parameters for add button
        ],
        none: [
          :skip_perms,     # do not check permissions for this view (Boolean)
          :main_view,      # this is main view of page (Boolean)
          :layout          #
        ]
      }
      # NOTE: option values are strings unless otherwise noted

      class << self
        attr_reader :keymap

        def add_option name, type
          raise "invalid option type: #{type}" unless @keymap.key?(type)

          @keymap[type] << name
          reset_key_lists
          VooApi.define_getter name
          VooApi.define_setter name
        end
      end

      extend KeyLists
      include VooApi
      include Visibility
    end
  end
end
