module WolfCore::Integrations::CustomValueApiOperations

def create_custom_value(wolf_token:, custom_value:, tenant:, wolf_platform_url:, custom_requirement_id:,

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 create_custom_value!(wolf_token:, custom_value:, tenant:, wolf_platform_url:, error_message:,

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 fetch_custom_value(wolf_token:, custom_value_id:, tenant:, wolf_platform_url:, query: nil)

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 fetch_custom_value!(wolf_token:, custom_value_id:, tenant:, wolf_platform_url:, error_message:,

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_responses")
end

def fetch_custom_values(wolf_token:, tenant:, wolf_platform_url:, query: nil)

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_values!(wolf_token:, tenant:, wolf_platform_url:, error_message:, error_data: nil, query: nil)

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_responses")
end

def update_custom_value(wolf_token:, custom_value:, tenant:, wolf_platform_url:, custom_value_id:, query: nil)

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 update_custom_value!(wolf_token:, custom_value:, tenant:, wolf_platform_url:, error_message:,

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 upsert_custom_value(wolf_token:, tenant:, wolf_platform_url:, query:, custom_requirement_id:, custom_value:)

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_responses")
  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

def upsert_custom_value!(wolf_token:, tenant:, wolf_platform_url:, query:, custom_requirement_id:, custom_value:,

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_responses")
  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