require 'wunderbar'
require 'wunderbar/markdown'

# Define common page features for whimsy tools using bootstrap styles
class Wunderbar::HtmlMarkup

  # Emit a form control based on a hash of options with a type:
  def _whimsy_field_chooser(args)
    _p "DEBUG #{__method__} #{args.inspect} /// #{args['type']}"
    case args['type']
    when 'subhead'
      _whimsy_forms_subhead args
    when 'text'
      _whimsy_forms_input args
    when 'textarea'
      args['rows'] ||= '3'
      _whimsy_forms_input args
    when 'select'
      _whimsy_forms_select args
    when 'radio', 'checkbox'
      _whimsy_forms_checkradio args
    else
      _div "#{__method__}(#{args['type']}) TODO: Error condition?"
    end
  end

  # Utility function to add icons after form controls
  def _whimsy_forms_iconlink(**args)
    if args['iconlink']
      _div.input_group_btn do
        _a.btn.btn_default type: 'button', aria_label: "#{iconlabel}", href: "#{args['iconlink']}", target: 'whimsy_help' do
          _span.glyphicon class: "#{args['icon']}", aria_label: "#{args['iconlabel']}"
        end
      end
    elsif args['icon']
      _span.input_group_addon do
        _span.glyphicon class: "#{args['icon']}", aria_label: "#{args['iconlabel']}"
      end
    end
  end

  # Utility function for divs around form controls, including help
  def _whimsy_control_wrapper(**args)
    _div.form_group do
      _label.control_label.col_sm_3 args['label'], for: "#{args['name']}"
      _div.col_sm_9 do
        _div.input_group do
          yield
          _whimsy_forms_iconlink(args)
        end
        if args['helptext']
          _span.help_block id: "#{args['aria_describedby']}" do
            _markdown "#{args['helptext']}"
          end
        end
      end
    end
  end

  # Display a subheader separator between sections of a form
  # @param text string to display
  def _whimsy_forms_subhead(text: 'Form Section')
    _div.form_group do
      _label.col_sm_offset_3.col_sm_9.strong.text_left text
    end
  end
  
  # Display a single input control within a form; or if rows, then a textarea
  # @param name required string ID of control's label/id
  def _whimsy_forms_input(**args)
    return unless args['name']
    args['label'] ||= 'Enter string'
    args['type'] ||= 'text'
    args['id'] = args['name']
    args['aria_describedby'] = "#{args['name']}_help" if args['helptext']
    _whimsy_control_wrapper(args) do
      args['class'] = 'form-control'
      if args['rows']
        _textarea! type: args['type'], name: args['name'], id: args['id'], value: args['value'], class: args['class'], aria_describedby: args['aria_describedby'], rows: args['rows'] do
          _! args['value']
        end
      else
        _input type: args['type'], name: args['name'], id: args['id'], value: args['value'], class: args['class'], aria_describedby: args['aria_describedby']
      end
    end
  end

  # Display an optionlist control within a form
  # @param name required string ID of control's label/id
  # @param options required ['value'] or {"value" => 'Label for value'} of all selectable values
  # @param values required 'value' or ['value'] or {"value" => 'Label for value'} of all selected values
  # @param placeholder Currently displayed text if passed (not selectable)
  def _whimsy_forms_select(**args)
    return unless args['name']
    return unless args['values']
    args['label'] ||= 'Select value(s)'
    args['id'] = args['name']
    args['aria_describedby'] = "#{args['name']}_help" if args['helptext']
    _whimsy_control_wrapper(args) do 
      if args['multiple']
        args['multiple'] = 'true'
      end
      _select.form_control type: args['type'], name: args['name'], id: args['id'], value: args['value'], aria_describedby: args['aria_describedby'], multiple: args['multiple'] do
        if ''.eql?(args['placeholder'])
          _option '', value: '', selected: 'selected'
        else
          _option "#{args['placeholder']}", value: '', selected: 'selected', disabled: 'disabled', hidden: 'hidden'
        end
        # Construct selectable list from values (first) then options
        if args['values'].kind_of?(Array)
          args['values'].each do |val|
            _option val, value: val, selected: true
          end
        elsif args['values'].kind_of?(Hash)
          args['values'].each do |val, disp|
            _option disp, value: val, selected: true
          end
        elsif args['values'] # Fallback for simple case of single string value
          _option "#{args['values']}", value: "#{args['values']}", selected: true
          args['values'] = [args['values']] # Ensure supports .include? for options loop below
        end
        if args['options'].kind_of?(Array)
          args['options'].each do |val|
            _option val, value: val unless args['values'].include?(val)
          end
        elsif args['options'].kind_of?(Hash)
          args['options'].each do |val, disp|
            _option disp, value: val unless args['values'].include?(val)
          end
        end
      end
    end
  end

  # Display a list of radio or checkbox controls
  # @param name required string ID of control's label/id
  # @param type required FORM_CHECKBOX|FORM_RADIO
  # @param options required ['value'...] or {"value" => 'Label for value'} of all values
  # @param selected optional 'value' or ['value'...] of all selected values
  def _whimsy_forms_checkradio(**args)
    return unless args['name']
    return unless args['type']
    return unless args['options']
    args['label'] ||= 'Select value(s)'
    args['id'] = args['name']
    args['aria_describedby'] = "#{args['name']}_help" if args['helptext']
    args['selected'] = [args['selected']] if args['selected'].kind_of?(String)
    _whimsy_control_wrapper(args) do 
      # Construct list of all :options; mark any that are in :selected 
      if args['options'].kind_of?(Array)
        args['options'].each do |val|
          checked = true if args['selected'] && args['selected'].include?(val.to_s)
          _input type: args['type'], name: args['name'], id: args['id'], value: val, class: args['class'], aria_describedby: args['aria_describedby'], checked: checked do
            _! val
          end
        end
      elsif args['options'].kind_of?(Hash)
        args['options'].each do |val, disp|
          checked = true if args['selected'] && args['selected'].include?(val.to_s)
          _input type: args['type'], name: args['name'], id: args['id'], value: val, class: args['class'], aria_describedby: args['aria_describedby'], checked: checked do
            _! disp
          end
        end
      end
    end
  end

  # Gather POST form data into submission Hash
  # @returns {field: 'string', field2: ['array', 'only for', 'multivalue'] ...}
  def _whimsy_params2formdata(params)
    formdata = {}
    params.each do |k,v|
      v && (v.length == 1) ? formdata[k] = v[0] : formdata[k] = v
    end
    return formdata
  end

end
