class ForestLiana::Model::Action
  include ActiveModel::Validations
  include ActiveModel::Conversion
  include ActiveModel::Serialization
  extend ActiveModel::Naming

  attr_accessor :id, :name, :base_url, :endpoint, :http_method, :fields, :redirect,
    :type, :download, :hooks, :description, :submit_button_label

  def initialize(attributes = {})
    if attributes.key?(:global)
      FOREST_LOGGER.error "REMOVED OPTION: The support for Smart Action \"global\" option is now " \
        "removed. Please set \"type: 'global'\" instead of \"global: true\" for the " \
        "\"#{attributes[:name]}\" Smart Action."
    end


    if attributes.key?(:type) && !['bulk', 'global', 'single'].include?(attributes[:type])
      FOREST_LOGGER.warn "Please set a valid Smart Action type (\"bulk\", \"global\" or " \
        "\"single\") for the \"#{attributes[:name]}\" Smart Action."
    end

    attributes.each do |name, value|
      send("#{name}=", value)
    end

    @fields ||= []

    has_fields_without_name = false

    @fields.delete_if do |field|
      if field.key?(:field)
        false
      else
        has_fields_without_name = true
        true
      end
    end

    @fields.map! do |field|
      if field.key?(:isRequired)
        FOREST_LOGGER.warn "DEPRECATION WARNING: isRequired on field \"#{field[:field]}\" is deprecated. Please use is_required."
        field[:is_required] = !!field[:isRequired]
        field.delete(:isRequired)
      end

      if field.key?(:isReadOnly)
        FOREST_LOGGER.warn "DEPRECATION WARNING: isReadOnly on field \"#{field[:field]}\" is deprecated. Please use is_read_only."
        field[:is_read_only] = !!field[:isReadOnly]
        field.delete(:isReadOnly)
      end

      field[:type] = "String" unless field.key?(:type)
      field[:default_value] = nil unless field.key?(:default_value)
      field[:enums] = nil unless field.key?(:enums)
      field[:is_required] = false unless field.key?(:is_required)
      field[:is_read_only] = false unless field.key?(:is_read_only)
      field[:reference] = nil unless field.key?(:reference)
      field[:description] = nil unless field.key?(:description)
      field[:widget] = nil unless field.key?(:widget)
      field
    end

    if has_fields_without_name
      FOREST_LOGGER.warn "Please set a name to all your \"#{@name}\" Smart Action fields " \
        "(Smart Actions fields without name are ignored)."
    end

    dasherized_name = ActiveSupport::Inflector.parameterize(@name) unless @name.nil?
    @endpoint ||= "forest/actions/#{dasherized_name}" unless dasherized_name.nil?
    @http_method ||= "POST"
    @redirect ||= nil
    @base_url ||= nil
    @type ||= "bulk"
    @download ||= false
    @hooks = !@hooks.nil? ? @hooks.symbolize_keys : nil
    @description ||= nil
    @submit_button_label ||= nil
  end

  def persisted?
    false
  end
end
