class GdsApi::ContentApi

def artefact(slug, params = {})

def artefact(slug, params = {})
  get_json(artefact_url(slug, params))
end

def artefact!(slug, params = {})

def artefact!(slug, params = {})
  get_json(artefact_url(slug, params))
end

def artefact_url(slug, params)

def artefact_url(slug, params)
  url = "#{base_url}/#{CGI.escape(slug)}.json"
  query = params.map { |k, v| "#{k}=#{v}" }
  if query.any?
    url += "?#{query.join('&')}"
  end
  if params[:edition] && ! options.include?(:bearer_token)
    raise GdsApi::NoBearerToken
  end
  url
end

def artefacts

def artefacts
  get_list("#{base_url}/artefacts.json")
end

def base_url

def base_url
  endpoint
end

def business_support_schemes(facets)

def business_support_schemes(facets)
  url = "#{base_url}/business_support_schemes.json"
  query = facets.map { |k, v| "#{k}=#{v}" }
  if query.any?
    url += "?#{query.join('&')}"
  end
  get_json(url)
end

def child_tags(tag_type, parent_tag, options = {})

def child_tags(tag_type, parent_tag, options = {})
  params = [
    "type=#{CGI.escape(tag_type)}",
    "parent_id=#{CGI.escape(parent_tag)}",
  ]
  params << "sort=#{options[:sort]}" if options.has_key?(:sort)
  get_list("#{base_url}/tags.json?#{params.join('&')}")
end

def for_need(need_id)

def for_need(need_id)
  get_list("#{base_url}/for_need/#{CGI.escape(need_id.to_s)}.json")
end

def get_json(url, &create_response)

def get_json(url, &create_response)
  create_response = create_response || Proc.new { |r|
    GdsApi::Response.new(r, web_urls_relative_to: @web_urls_relative_to)
  }
  super(url, &create_response)
end

def get_list(url)

def get_list(url)
  get_json(url) { |r|
    GdsApi::ListResponse.new(r, self, web_urls_relative_to: @web_urls_relative_to)
  }
end

def initialize(endpoint_url, options = {})

def initialize(endpoint_url, options = {})
  # If the `web_urls_relative_to` option is given, the adapter will convert
  # any `web_url` values to relative URLs if they are from the same host.
  #
  # For example: "https://www.gov.uk"
  @web_urls_relative_to = options.delete(:web_urls_relative_to)
  super
end

def key_for_tag_type(tag_type)

def key_for_tag_type(tag_type)
  tag_type.nil? ? "tag" : CGI.escape(tag_type)
end

def licences_for_ids(ids)

def licences_for_ids(ids)
  ids = ids.map(&:to_s).sort.join(',')
  get_json("#{@endpoint}/licences.json?ids=#{ids}")
end

def local_authorities_by_name(name)

def local_authorities_by_name(name)
  get_json("#{base_url}/local_authorities.json?name=#{CGI.escape(name)}")
end

def local_authorities_by_snac_code(snac_code)

def local_authorities_by_snac_code(snac_code)
  get_json("#{base_url}/local_authorities.json?snac_code=#{CGI.escape(snac_code)}")
end

def local_authority(snac_code)

def local_authority(snac_code)
  get_json("#{base_url}/local_authorities/#{CGI.escape(snac_code)}.json")
end

def root_sections

def root_sections
  root_tags("section")
end

def root_tags(tag_type)

def root_tags(tag_type)
  get_list("#{base_url}/tags.json?type=#{CGI.escape(tag_type)}&root_sections=true")
end

def sections

def sections
  tags("section")
end

def sub_sections(parent_tag)

def sub_sections(parent_tag)
  child_tags("section", parent_tag)
end

def tag(tag, tag_type = nil)

def tag(tag, tag_type = nil)
  if tag_type.nil?
    raise "Requests for tags without a tag_type are no longer supported. You probably want a tag_type of 'section'. See https://github.com/alphagov/govuk_content_api/blob/f4c0102a1ae4970be6a440707b89798442f768b9/govuk_content_api.rb#L241-L250"
  end
  url = [base_url, "tags", CGI.escape(tag_type), CGI.escape(tag)].join("/") + ".json"
  get_json(url)
end

def tags(tag_type, options = {})

def tags(tag_type, options = {})
  params = [
    "type=#{CGI.escape(tag_type)}"
  ]
  params << "sort=#{options[:sort]}" if options.has_key?(:sort)
  params << "draft=true" if options[:draft]
  params << "cachebust=#{Time.now.utc.to_i}#{rand(1000)}" if options[:bust_cache]
  get_list("#{base_url}/tags.json?#{params.join('&')}")
end