# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/

class ObjectManagerAttributesController < ApplicationController
  prepend_before_action { authentication_check(permission: 'admin.object') }

  # GET /object_manager_attributes_list
  def list
    render json: {
      objects: ObjectManager.list_frontend_objects,
    }
  end

  # GET /object_manager_attributes
  def index
    render json: ObjectManager::Attribute.list_full
  end

  # GET /object_manager_attributes/1
  def show
    model_show_render(ObjectManager::Attribute, params)
  end

  # POST /object_manager_attributes
  def create
    # check if attribute already exists
    exists = ObjectManager::Attribute.get(
      object: permitted_params[:object],
      name:   permitted_params[:name],
    )
    raise Exceptions::UnprocessableEntity, 'already exists' if exists

    begin
      object_manager_attribute = ObjectManager::Attribute.add(
        object:      permitted_params[:object],
        name:        permitted_params[:name],
        display:     permitted_params[:display],
        data_type:   permitted_params[:data_type],
        data_option: permitted_params[:data_option],
        active:      permitted_params[:active],
        screens:     permitted_params[:screens],
        position:    1550,
        editable:    true,
      )
      render json: object_manager_attribute.attributes_with_association_ids, status: :created
    rescue => e
      logger.error e
      raise Exceptions::UnprocessableEntity, e
    end
  end

  # PUT /object_manager_attributes/1
  def update

    object_manager_attribute = ObjectManager::Attribute.add(
      object:      permitted_params[:object],
      name:        permitted_params[:name],
      display:     permitted_params[:display],
      data_type:   permitted_params[:data_type],
      data_option: permitted_params[:data_option],
      active:      permitted_params[:active],
      screens:     permitted_params[:screens],
      position:    1550,
      editable:    true,
    )
    render json: object_manager_attribute.attributes_with_association_ids, status: :ok
  rescue => e
    logger.error e
    raise Exceptions::UnprocessableEntity, e

  end

  # DELETE /object_manager_attributes/1
  def destroy
    object_manager_attribute = ObjectManager::Attribute.find(params[:id])
    ObjectManager::Attribute.remove(
      object_lookup_id: object_manager_attribute.object_lookup_id,
      name:             object_manager_attribute.name,
    )
    model_destroy_render_item
  rescue => e
    logger.error e
    raise Exceptions::UnprocessableEntity, e
  end

  # POST /object_manager_attributes_discard_changes
  def discard_changes
    ObjectManager::Attribute.discard_changes
    render json: {}, status: :ok
  end

  # POST /object_manager_attributes_execute_migrations
  def execute_migrations
    ObjectManager::Attribute.migration_execute
    render json: {}, status: :ok
  end

  private

  def permitted_params
    @permitted_params ||= begin
      permitted = params.permit!.to_h

      if permitted[:data_type].match?(/^(boolean)$/)
        if permitted[:data_option][:options]
          # rubocop:disable Lint/BooleanSymbol
          if permitted[:data_option][:options][:false]
            permitted[:data_option][:options][false] = permitted[:data_option][:options].delete(:false)
          end
          if permitted[:data_option][:options][:true]
            permitted[:data_option][:options][true] = permitted[:data_option][:options].delete(:true)
          end
          if permitted[:data_option][:default] == 'true'
            permitted[:data_option][:default] = true
          elsif permitted[:data_option][:default] == 'false'
            permitted[:data_option][:default] = false
          end
          # rubocop:enable Lint/BooleanSymbol
        end
      end

      if permitted[:data_option]

        if !permitted[:data_option].key?(:default)
          permitted[:data_option][:default] = if permitted[:data_type].match?(/^(input|select|tree_select)$/)
                                                ''
                                              end
        end

        if permitted[:data_option][:null].nil?
          permitted[:data_option][:null] = true
        end

        if !permitted[:data_option][:options].is_a?(Hash) &&
           !permitted[:data_option][:options].is_a?(Array)
          permitted[:data_option][:options] = {}
        end

        if !permitted[:data_option][:relation].is_a?(String)
          permitted[:data_option][:relation] = ''
        end
      else
        permitted[:data_option] = {
          default:  '',
          options:  {},
          relation: '',
          null:     true
        }
      end

      permitted
    end
  end
end
