class GdsApi::Worldwide

def all_world_locations

def all_world_locations
  content_item = JSON.parse(get_raw("#{base_url}/content/world"))
  world_locations = format_locations(content_item.dig("details", "world_locations"), "World location")
  international_delegations = format_locations(content_item.dig("details", "international_delegations"), "International delegation")
  Array(world_locations) + Array(international_delegations)
end

def base_url

def base_url
  "#{endpoint}/api"
end

def format_locations(locations, type)

def format_locations(locations, type)
  locations&.map do |location|
    {
      "id" => "#{Plek.new.website_root}/world/#{location['slug']}",
      "title" => location["name"],
      "format" => type,
      "updated_at" => location["updated_at"],
      "web_url" => "#{Plek.new.website_root}/world/#{location['slug']}",
      "analytics_identifier" => location["analytics_identifier"],
      "details" => {
        "slug" => location["slug"],
        "iso2" => location["iso2"],
      },
      "organisations" => {
        "id" => "#{Plek.new.website_root}/world/#{location['slug']}#organisations",
        "web_url" => "#{Plek.new.website_root}/world/#{location['slug']}#organisations",
      },
      "content_id" => location["content_id"],
    }
  end
end

def format_office(office)

def format_office(office)
  return {} unless office
  contact = office.dig("links", "contact", 0)
  {
    "title" => office["title"],
    "format" => "World Office",
    "updated_at" => office["public_updated_at"],
    "web_url" => office["web_url"],
    "details" => {
      "email" => contact&.dig("details", "email_addresses"),
      "description" => contact&.dig("details", "description"),
      "contact_form_url" => contact&.dig("details", "contact_form_links"),
      "access_and_opening_times" => office.dig("details", "access_and_opening_times"),
      "type" => office.dig("details", "type"),
    },
    "address" => {
      "adr" => {
        "fn" => contact&.dig("details", "post_addresses", 0, "title"),
        "street-address" => contact&.dig("details", "post_addresses", 0, "street_address"),
        "postal-code" => contact&.dig("details", "post_addresses", 0, "postal_code"),
        "locality" => contact&.dig("details", "post_addresses", 0, "locality"),
        "region" => contact&.dig("details", "post_addresses", 0, "region"),
        "country-name" => contact&.dig("details", "post_addresses", 0, "world_location"),
      },
    },
    "contact_numbers" => contact&.dig("details", "phone_numbers")&.map do |phone_number|
      {
        "label" => phone_number["title"],
        "number" => phone_number["number"],
      }
    end,
    "services" => contact&.dig("details", "services")&.map do |service|
      {
        title: service["title"],
        type: service["type"],
      }
    end,
  }
end

def format_sponsor(sponsor)

def format_sponsor(sponsor)
  {
    "title" => sponsor["title"],
    "web_url" => sponsor["web_url"],
    "details" => {
      "acronym" => sponsor.dig("details", "acronym"),
    },
  }
end

def organisations_for_world_location(location_slug)

def organisations_for_world_location(location_slug)
  worldwide_organisations = worldwide_organisations_for_location(location_slug)
  worldwide_organisations.map do |organisation|
    worldwide_organisation(organisation["link"])
  end
end

def world_location(location_slug)

def world_location(location_slug)
  world_location = all_world_locations.find do |location|
    location.dig("details", "slug") == location_slug
  end
  raise GdsApi::HTTPNotFound, 404 unless world_location
  world_location
end

def world_locations

def world_locations
  all_world_locations
end

def worldwide_organisation(path)

def worldwide_organisation(path)
  content_item = JSON.parse(get_raw("#{base_url}/content#{path}"))
  {
    "id" => "#{Plek.new.website_root}#{path}",
    "title" => content_item["title"],
    "format" => "Worldwide Organisation",
    "updated_at" => content_item["updated_at"],
    "web_url" => "#{Plek.new.website_root}#{path}",
    "details" => {
      "slug" => path.gsub("/world/organisations/", ""),
    },
    "analytics_identifier" => content_item["analytics_identifier"],
    "offices" => {
      "main" => format_office(content_item.dig("links", "main_office", 0)),
      "other" => content_item.dig("links", "home_page_offices")&.map do |office|
                   format_office(office)
                 end || [],
    },
    "sponsors" => content_item.dig("links", "sponsoring_organisations")&.map do |sponsor|
                    format_sponsor(sponsor)
                  end || [],
  }
end

def worldwide_organisations_for_location(world_location)

def worldwide_organisations_for_location(world_location)
  search_results = JSON.parse(get_raw("#{base_url}/search.json?filter_format=worldwide_organisation&filter_world_locations=#{world_location}"))
  search_results["results"]
end