defmodule Oli.Predefined do
  def country_codes do
    [
      {"Afghanistan", "AF"},
      {"Åland Islands", "AX"},
      {"Albania", "AL"},
      {"Algeria", "DZ"},
      {"American Samoa", "AS"},
      {"Andorra", "AD"},
      {"Angola", "AO"},
      {"Anguilla", "AI"},
      {"Antarctica", "AQ"},
      {"Antigua and Barbuda", "AG"},
      {"Argentina", "AR"},
      {"Armenia", "AM"},
      {"Aruba", "AW"},
      {"Australia", "AU"},
      {"Austria", "AT"},
      {"Azerbaijan", "AZ"},
      {"Bahamas", "BS"},
      {"Bahrain", "BH"},
      {"Bangladesh", "BD"},
      {"Barbados", "BB"},
      {"Belarus", "BY"},
      {"Belgium", "BE"},
      {"Belize", "BZ"},
      {"Benin", "BJ"},
      {"Bermuda", "BM"},
      {"Bhutan", "BT"},
      {"Bolivia, Plurinational State of", "BO"},
      {"Bonaire, Sint Eustatius and Saba", "BQ"},
      {"Bosnia and Herzegovina", "BA"},
      {"Botswana", "BW"},
      {"Bouvet Island", "BV"},
      {"Brazil", "BR"},
      {"British Indian Ocean Territory", "IO"},
      {"Brunei Darussalam", "BN"},
      {"Bulgaria", "BG"},
      {"Burkina Faso", "BF"},
      {"Burundi", "BI"},
      {"Cambodia", "KH"},
      {"Cameroon", "CM"},
      {"Canada", "CA"},
      {"Cape Verde", "CV"},
      {"Cayman Islands", "KY"},
      {"Central African Republic", "CF"},
      {"Chad", "TD"},
      {"Chile", "CL"},
      {"China", "CN"},
      {"Christmas Island", "CX"},
      {"Cocos (Keeling) Islands", "CC"},
      {"Colombia", "CO"},
      {"Comoros", "KM"},
      {"Congo", "CG"},
      {"Congo, the Democratic Republic of the", "CD"},
      {"Cook Islands", "CK"},
      {"Costa Rica", "CR"},
      {"Côte d'Ivoire", "CI"},
      {"Croatia", "HR"},
      {"Cuba", "CU"},
      {"Curaçao", "CW"},
      {"Cyprus", "CY"},
      {"Czech Republic", "CZ"},
      {"Denmark", "DK"},
      {"Djibouti", "DJ"},
      {"Dominica", "DM"},
      {"Dominican Republic", "DO"},
      {"Ecuador", "EC"},
      {"Egypt", "EG"},
      {"El Salvador", "SV"},
      {"Equatorial Guinea", "GQ"},
      {"Eritrea", "ER"},
      {"Estonia", "EE"},
      {"Ethiopia", "ET"},
      {"Falkland Islands (Malvinas)", "FK"},
      {"Faroe Islands", "FO"},
      {"Fiji", "FJ"},
      {"Finland", "FI"},
      {"France", "FR"},
      {"French Guiana", "GF"},
      {"French Polynesia", "PF"},
      {"French Southern Territories", "TF"},
      {"Gabon", "GA"},
      {"Gambia", "GM"},
      {"Georgia", "GE"},
      {"Germany", "DE"},
      {"Ghana", "GH"},
      {"Gibraltar", "GI"},
      {"Greece", "GR"},
      {"Greenland", "GL"},
      {"Grenada", "GD"},
      {"Guadeloupe", "GP"},
      {"Guam", "GU"},
      {"Guatemala", "GT"},
      {"Guernsey", "GG"},
      {"Guinea", "GN"},
      {"Guinea-Bissau", "GW"},
      {"Guyana", "GY"},
      {"Haiti", "HT"},
      {"Heard Island and McDonald Islands", "HM"},
      {"Holy See (Vatican City State)", "VA"},
      {"Honduras", "HN"},
      {"Hong Kong", "HK"},
      {"Hungary", "HU"},
      {"Iceland", "IS"},
      {"India", "IN"},
      {"Indonesia", "ID"},
      {"Iran, Islamic Republic of", "IR"},
      {"Iraq", "IQ"},
      {"Ireland", "IE"},
      {"Isle of Man", "IM"},
      {"Israel", "IL"},
      {"Italy", "IT"},
      {"Jamaica", "JM"},
      {"Japan", "JP"},
      {"Jersey", "JE"},
      {"Jordan", "JO"},
      {"Kazakhstan", "KZ"},
      {"Kenya", "KE"},
      {"Kiribati", "KI"},
      {"Korea, Democratic People's Republic of", "KP"},
      {"Korea, Republic of", "KR"},
      {"Kuwait", "KW"},
      {"Kyrgyzstan", "KG"},
      {"Lao People's Democratic Republic", "LA"},
      {"Latvia", "LV"},
      {"Lebanon", "LB"},
      {"Lesotho", "LS"},
      {"Liberia", "LR"},
      {"Libya", "LY"},
      {"Liechtenstein", "LI"},
      {"Lithuania", "LT"},
      {"Luxembourg", "LU"},
      {"Macao", "MO"},
      {"Macedonia, the former Yugoslav Republic of", "MK"},
      {"Madagascar", "MG"},
      {"Malawi", "MW"},
      {"Malaysia", "MY"},
      {"Maldives", "MV"},
      {"Mali", "ML"},
      {"Malta", "MT"},
      {"Marshall Islands", "MH"},
      {"Martinique", "MQ"},
      {"Mauritania", "MR"},
      {"Mauritius", "MU"},
      {"Mayotte", "YT"},
      {"Mexico", "MX"},
      {"Micronesia, Federated States of", "FM"},
      {"Moldova, Republic of", "MD"},
      {"Monaco", "MC"},
      {"Mongolia", "MN"},
      {"Montenegro", "ME"},
      {"Montserrat", "MS"},
      {"Morocco", "MA"},
      {"Mozambique", "MZ"},
      {"Myanmar", "MM"},
      {"Namibia", "NA"},
      {"Nauru", "NR"},
      {"Nepal", "NP"},
      {"Netherlands", "NL"},
      {"New Caledonia", "NC"},
      {"New Zealand", "NZ"},
      {"Nicaragua", "NI"},
      {"Niger", "NE"},
      {"Nigeria", "NG"},
      {"Niue", "NU"},
      {"Norfolk Island", "NF"},
      {"Northern Mariana Islands", "MP"},
      {"Norway", "NO"},
      {"Oman", "OM"},
      {"Pakistan", "PK"},
      {"Palau", "PW"},
      {"Palestinian Territory, Occupied", "PS"},
      {"Panama", "PA"},
      {"Papua New Guinea", "PG"},
      {"Paraguay", "PY"},
      {"Peru", "PE"},
      {"Philippines", "PH"},
      {"Pitcairn", "PN"},
      {"Poland", "PL"},
      {"Portugal", "PT"},
      {"Puerto Rico", "PR"},
      {"Qatar", "QA"},
      {"Réunion", "RE"},
      {"Romania", "RO"},
      {"Russian Federation", "RU"},
      {"Rwanda", "RW"},
      {"Saint Barthélemy", "BL"},
      {"Saint Helena, Ascension and Tristan da Cunha", "SH"},
      {"Saint Kitts and Nevis", "KN"},
      {"Saint Lucia", "LC"},
      {"Saint Martin (French part)", "MF"},
      {"Saint Pierre and Miquelon", "PM"},
      {"Saint Vincent and the Grenadines", "VC"},
      {"Samoa", "WS"},
      {"San Marino", "SM"},
      {"Sao Tome and Principe", "ST"},
      {"Saudi Arabia", "SA"},
      {"Senegal", "SN"},
      {"Serbia", "RS"},
      {"Seychelles", "SC"},
      {"Sierra Leone", "SL"},
      {"Singapore", "SG"},
      {"Sint Maarten (Dutch part)", "SX"},
      {"Slovakia", "SK"},
      {"Slovenia", "SI"},
      {"Solomon Islands", "SB"},
      {"Somalia", "SO"},
      {"South Africa", "ZA"},
      {"South Georgia and the South Sandwich Islands", "GS"},
      {"South Sudan", "SS"},
      {"Spain", "ES"},
      {"Sri Lanka", "LK"},
      {"Sudan", "SD"},
      {"Suriname", "SR"},
      {"Svalbard and Jan Mayen", "SJ"},
      {"Swaziland", "SZ"},
      {"Sweden", "SE"},
      {"Switzerland", "CH"},
      {"Syrian Arab Republic", "SY"},
      {"Taiwan, Province of China", "TW"},
      {"Tajikistan", "TJ"},
      {"Tanzania, United Republic of", "TZ"},
      {"Thailand", "TH"},
      {"Timor-Leste", "TL"},
      {"Togo", "TG"},
      {"Tokelau", "TK"},
      {"Tonga", "TO"},
      {"Trinidad and Tobago", "TT"},
      {"Tunisia", "TN"},
      {"Turkey", "TR"},
      {"Turkmenistan", "TM"},
      {"Turks and Caicos Islands", "TC"},
      {"Tuvalu", "TV"},
      {"Uganda", "UG"},
      {"Ukraine", "UA"},
      {"United Arab Emirates", "AE"},
      {"United Kingdom", "GB"},
      {"United States", "US"},
      {"United States Minor Outlying Islands", "UM"},
      {"Uruguay", "UY"},
      {"Uzbekistan", "UZ"},
      {"Vanuatu", "VU"},
      {"Venezuela, Bolivarian Republic of", "VE"},
      {"Viet Nam", "VN"},
      {"Virgin Islands, British", "VG"},
      {"Virgin Islands, U.S.", "VI"},
      {"Wallis and Futuna", "WF"},
      {"Western Sahara", "EH"},
      {"Yemen", "YE"},
      {"Zambia", "ZM"},
      {"Zimbabwe", "ZW"}
    ]
  end

  def world_universities_and_domains do
    Application.get_env(:oli, :world_universities_and_domains_json)
    |> Jason.decode!()
    |> Enum.map(fn el ->
      %{
        name: el["name"],
        country_code: el["alpha_two_code"],
        # pick the first webpage url in a list of possible urls for a university
        institution_url: Enum.at(el["web_pages"], 0)
      }
    end)
  end

  def lti_config_defaults do
    configs = [
      %{
        product_family_code: "canvas",
        name: "Canvas",
        key_set_path: "/api/lti/security/jwks",
        auth_token_path: "/login/oauth2/token",
        auth_login_path: "/api/lti/authorize_redirect",
        auth_server_path: "/login/oauth2/token"
      },
      %{
        product_family_code: "moodle",
        name: "Moodle",
        key_set_path: "/mod/lti/certs.php",
        auth_token_path: "/mod/lti/token.php",
        auth_login_path: "/mod/lti/auth.php",
        auth_server_path: "/"
      },
      %{
        product_family_code: "desire2learn",
        name: "D2L (Desire2Learn)",
        key_set_path: "/d2l/.well-known/jwks",
        auth_token_url: "https://auth.brightspace.com/core/connect/token",
        auth_login_path: "/d2l/lti/authenticate",
        auth_server_url: "https://api.brightspace.com/auth/token"
      }
    ]

    case Application.get_env(:oli, :blackboard_application_client_id) do
      nil ->
        configs

      blackboard_application_client_id ->
        [
          %{
            product_family_code: "blackboard",
            name: "Blackboard",
            key_set_url:
              "https://developer.blackboard.com/api/v1/management/applications/#{blackboard_application_client_id}/jwks.json",
            auth_token_url: "https://developer.blackboard.com/api/v1/gateway/oauth2/jwttoken",
            auth_login_url: "https://developer.blackboard.com/api/v1/gateway/oidcauth",
            auth_server_url: "https://blackboard.com/api/lti/security/jwks"
          }
          | configs
        ]
    end
  end

  def map_id_to_anonymous_name(id) do
    case rem(id, 66) do
      0 -> "Hippo"
      1 -> "Iguana"
      2 -> "Cheetah"
      3 -> "Vulture"
      4 -> "Seahorse"
      5 -> "Meerkat"
      6 -> "Sloth"
      7 -> "Cobra"
      8 -> "Elephant"
      9 -> "Narwhal"
      10 -> "Ostrich"
      11 -> "Salamander"
      12 -> "Gazelle"
      13 -> "Unicorn"
      14 -> "Pangolin"
      15 -> "Falcon"
      16 -> "Eel"
      17 -> "Impala"
      18 -> "Mantis"
      19 -> "Snail"
      20 -> "Capybara"
      21 -> "Viper"
      22 -> "Chameleon"
      23 -> "Uakari"
      24 -> "Chinchilla"
      25 -> "Shark"
      26 -> "Aardvark"
      27 -> "Hedgehog"
      28 -> "Newt"
      29 -> "Emu"
      30 -> "Koala"
      31 -> "Ibis"
      32 -> "Bat"
      33 -> "Stingray"
      34 -> "Manatee"
      35 -> "Gecko"
      36 -> "Squirrel"
      37 -> "Echidna"
      38 -> "Octopus"
      39 -> "Peacock"
      40 -> "Flamingo"
      41 -> "Egret"
      42 -> "Mongoose"
      43 -> "Cuttlefish"
      44 -> "Warbler"
      45 -> "Shrimp"
      46 -> "Cockatoo"
      47 -> "Numbat"
      48 -> "Caiman"
      49 -> "Stoat"
      50 -> "Heron"
      51 -> "Cassowary"
      52 -> "Badger"
      53 -> "Serval"
      54 -> "Owl"
      55 -> "Firefly"
      56 -> "Mandrill"
      57 -> "Sheep"
      58 -> "Monkey"
      59 -> "Seal"
      60 -> "Cuscus"
      61 -> "Starfish"
      62 -> "Albatross"
      63 -> "Crocodile"
      64 -> "Ocelot"
      65 -> "Marmoset"
    end
  end
end
