class Card
  class Format
    class Nest
      # Fetch card for a nest
      module Fetch
        private

        def fetch_card cardish
          case cardish
          when Card            then cardish
          when Symbol, Integer then Card.fetch cardish
          when "_", "_self"    then format.context_card
          else                      new_card cardish
          end
        rescue Card::Error::CodenameNotFound
          not_found_codename cardish
        end

        def not_found_codename cardish
          @view = :not_found
          c = Card.new name: Array.wrap(cardish).join(Card::Name.joint).to_s
          c.errors.add :codename, not_found_codename_error(cardish)
          c
        end

        def not_found_codename_error codename
          ::I18n.t :lib_exception_unknown_codename, codename: codename
        end

        def new_card cardish
          view_opts[:nest_name] = Card::Name[cardish].to_s
          Card.fetch cardish, new: new_card_args
        end

        def new_card_args
          args = { name: view_opts[:nest_name] }
          args[:type] = view_opts[:type] if view_opts[:type]
          args.merge(new_supercard_args)
              .merge(new_main_args)
              .merge(new_content_args)
        end

        def new_supercard_args
          # special case.  gets absolutized incorrectly. fix in name?
          return {} if view_opts[:nest_name].strip.blank?

          { supercard: format.context_card }
        end

        def new_main_args
          nest_name = view_opts[:nest_name]
          return {} unless nest_name =~ /main/

          { name: nest_name.gsub(/^_main\+/, "+"),
            supercard: format.root.card }
        end

        def new_content_args
          content = content_from_shorthand_param || content_from_subcard_params
          content ? { content: content } : {}
        end

        def content_from_shorthand_param
          # FIXME: this is a lame shorthand; could be another card's key
          # should be more robust and managed by Card::Name
          shorthand_param = view_opts[:nest_name].tr "+", "_"
          Env.params[shorthand_param]
        end

        def content_from_subcard_params
          Env.params.dig "subcards", view_opts[:nest_name], "content"
        end
      end
    end
  end
end
