lib/wolf_core/application/integrations/custom_value_api_operations.rb



# frozen_string_literal: true

module WolfCore
  module Integrations
    module CustomValueApiOperations
      include WolfCore::HttpOperations

      def fetch_custom_values!(wolf_token:, tenant:, wolf_platform_url:, error_message:, error_data: nil, query: nil)
        response = fetch_custom_values(
          wolf_token: wolf_token,
          tenant: tenant,
          wolf_platform_url: wolf_platform_url,
          query: query
        )
        validate_http_response(response: response, message: error_message, error_data: error_data)
        response.body.dig("data", "table", "custom_values")
      end

      def fetch_custom_values(wolf_token:, tenant:, wolf_platform_url:, query: nil)
        query ||= {}
        parsed_http_get(
          headers: { "Authorization" => "Bearer #{wolf_token}" },
          url: "#{wolf_platform_url}/api/v2/custom_values",
          query: query.merge(tenant: tenant)
        )
      end

      def fetch_custom_value!(wolf_token:, custom_value_id:, tenant:, wolf_platform_url:, error_message:,
                              error_data: nil, query: nil)
        response = fetch_custom_value(
          wolf_token: wolf_token,
          custom_value_id: custom_value_id,
          tenant: tenant,
          wolf_platform_url: wolf_platform_url,
          query: query
        )
        validate_http_response(response: response, message: error_message, error_data: error_data)
        response.body.dig("data", "table", "custom_value")
      end

      def fetch_custom_value(wolf_token:, custom_value_id:, tenant:, wolf_platform_url:, query: nil)
        query ||= {}
        parsed_http_get(
          headers: { "Authorization" => "Bearer #{wolf_token}" },
          url: "#{wolf_platform_url}/api/v2/custom_values/#{custom_value_id}",
          query: query.merge(tenant: tenant)
        )
      end

      def create_custom_value!(wolf_token:, custom_value:, tenant:, wolf_platform_url:, error_message:,
                               custom_requirement_id:, error_data: nil, query: nil)
        response = create_custom_value(
          wolf_token: wolf_token,
          custom_value: custom_value,
          tenant: tenant,
          wolf_platform_url: wolf_platform_url,
          custom_requirement_id: custom_requirement_id,
          query: query
        )
        validate_http_response(response: response, message: error_message, error_data: error_data)
        response
      end

      def create_custom_value(wolf_token:, custom_value:, tenant:, wolf_platform_url:, custom_requirement_id:,
                              query: nil)
        query ||= {}
        parsed_http_post(
          headers: { "Authorization" => "Bearer #{wolf_token}" },
          query: query.merge(tenant: tenant),
          url: "#{wolf_platform_url}/api/v2/custom_requirements/#{custom_requirement_id}/custom_values",
          body: custom_value
        )
      end

      def update_custom_value!(wolf_token:, custom_value:, tenant:, wolf_platform_url:, error_message:,
                               custom_value_id:, error_data: nil, query: nil)
        response = update_custom_value(
          wolf_token: wolf_token,
          custom_value: custom_value,
          tenant: tenant,
          wolf_platform_url: wolf_platform_url,
          custom_value_id: custom_value_id,
          query: query
        )
        validate_http_response(response: response, message: error_message, error_data: error_data)
        response
      end

      def update_custom_value(wolf_token:, custom_value:, tenant:, wolf_platform_url:, custom_value_id:, query: nil)
        query ||= {}
        parsed_http_put(
          headers: { "Authorization" => "Bearer #{wolf_token}" },
          query: query.merge(tenant: tenant),
          url: "#{wolf_platform_url}/api/v2/custom_values/#{custom_value_id}",
          body: custom_value
        )
      end

      def upsert_custom_value!(wolf_token:, tenant:, wolf_platform_url:, query:, custom_requirement_id:, custom_value:,
                               error_message:, error_data: nil)
        response = fetch_custom_values(
          wolf_token: wolf_token,
          tenant: tenant,
          wolf_platform_url: wolf_platform_url,
          query: query
        )
        validate_http_response(response: response, message: error_message, error_data: error_data)
        custom_values = response.body.dig("data", "table", "custom_values")

        response = if custom_values&.any?
          operation_type = :update
          custom_value_id = custom_values.first["id"]
          update_custom_value!(
            wolf_platform_url: wolf_platform_url,
            tenant: tenant,
            wolf_token: wolf_token,
            custom_value_id: custom_value_id,
            custom_value: custom_value,
            error_message: error_message,
            error_data: error_data
          )
        else
          operation_type = :create
          create_custom_value!(
            wolf_platform_url: wolf_platform_url,
            tenant: tenant,
            wolf_token: wolf_token,
            custom_requirement_id: custom_requirement_id,
            custom_value: custom_value,
            error_message: error_message,
            error_data: error_data
          )
        end

        { operation_type: operation_type, response: response }
      end

      def upsert_custom_value(wolf_token:, tenant:, wolf_platform_url:, query:, custom_requirement_id:, custom_value:)
        response = fetch_custom_values(
          wolf_token: wolf_token,
          tenant: tenant,
          wolf_platform_url: wolf_platform_url,
          query: query
        )

        return response unless response_success?(response)

        custom_values = response.body.dig("data", "table", "custom_values")

        response = if custom_values&.any?
          operation_type = :update
          custom_value_id = custom_values.first["id"]
          update_custom_value(
            wolf_platform_url: wolf_platform_url,
            tenant: tenant,
            wolf_token: wolf_token,
            custom_value_id: custom_value_id,
            custom_value: custom_value
          )
        else
          operation_type = :create
          create_custom_value(
            wolf_platform_url: wolf_platform_url,
            tenant: tenant,
            wolf_token: wolf_token,
            custom_requirement_id: custom_requirement_id,
            custom_value: custom_value
          )
        end
        OpenStruct.new({ operation_type: operation_type, response: response })
      end
    end
  end
end