/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.lucene.benchmark.byTask.feeds;

import java.util.Properties;
import java.util.Random;
import org.apache.lucene.benchmark.byTask.utils.Config;

/**
 * Adds fields appropriate for sorting: country, random_string and sort_field (int). Supports the
 * following parameters:
 *
 * <ul>
 *   <li><b>sort.rng</b> - defines the range for sort-by-int field (default <b>20000</b>).
 *   <li><b>rand.seed</b> - defines the seed to initialize Random with (default <b>13</b>).
 * </ul>
 */
public class SortableSingleDocSource extends SingleDocSource {

  private static String[] COUNTRIES =
      new String[] {
        "European Union",
        "United States",
        "Japan",
        "Germany",
        "China (PRC)",
        "United Kingdom",
        "France",
        "Italy",
        "Spain",
        "Canada",
        "Brazil",
        "Russia",
        "India",
        "South Korea",
        "Australia",
        "Mexico",
        "Netherlands",
        "Turkey",
        "Sweden",
        "Belgium",
        "Indonesia",
        "Switzerland",
        "Poland",
        "Norway",
        "Republic of China",
        "Saudi Arabia",
        "Austria",
        "Greece",
        "Denmark",
        "Iran",
        "South Africa",
        "Argentina",
        "Ireland",
        "Thailand",
        "Finland",
        "Venezuela",
        "Portugal",
        "Hong Kong",
        "United Arab Emirates",
        "Malaysia",
        "Czech Republic",
        "Colombia",
        "Nigeria",
        "Romania",
        "Chile",
        "Israel",
        "Singapore",
        "Philippines",
        "Pakistan",
        "Ukraine",
        "Hungary",
        "Algeria",
        "New Zealand",
        "Egypt",
        "Kuwait",
        "Peru",
        "Kazakhstan",
        "Slovakia",
        "Morocco",
        "Bangladesh",
        "Vietnam",
        "Qatar",
        "Angola",
        "Libya",
        "Iraq",
        "Croatia",
        "Luxembourg",
        "Sudan",
        "Slovenia",
        "Cuba",
        "Belarus",
        "Ecuador",
        "Serbia",
        "Oman",
        "Bulgaria",
        "Lithuania",
        "Syria",
        "Dominican Republic",
        "Tunisia",
        "Guatemala",
        "Azerbaijan",
        "Sri Lanka",
        "Kenya",
        "Latvia",
        "Turkmenistan",
        "Costa Rica",
        "Lebanon",
        "Uruguay",
        "Uzbekistan",
        "Yemen",
        "Cyprus",
        "Estonia",
        "Trinidad and Tobago",
        "Cameroon",
        "El Salvador",
        "Iceland",
        "Panama",
        "Bahrain",
        "Ivory Coast",
        "Ethiopia",
        "Tanzania",
        "Jordan",
        "Ghana",
        "Bosnia and Herzegovina",
        "Macau",
        "Burma",
        "Bolivia",
        "Brunei",
        "Botswana",
        "Honduras",
        "Gabon",
        "Uganda",
        "Jamaica",
        "Zambia",
        "Senegal",
        "Paraguay",
        "Albania",
        "Equatorial Guinea",
        "Georgia",
        "Democratic Republic of the Congo",
        "Nepal",
        "Afghanistan",
        "Cambodia",
        "Armenia",
        "Republic of the Congo",
        "Mozambique",
        "Republic of Macedonia",
        "Malta",
        "Namibia",
        "Madagascar",
        "Chad",
        "Burkina Faso",
        "Mauritius",
        "Mali",
        "The Bahamas",
        "Papua New Guinea",
        "Nicaragua",
        "Haiti",
        "Benin",
        "alestinian flag West Bank and Gaza",
        "Jersey",
        "Fiji",
        "Guinea",
        "Moldova",
        "Niger",
        "Laos",
        "Mongolia",
        "French Polynesia",
        "Kyrgyzstan",
        "Barbados",
        "Tajikistan",
        "Malawi",
        "Liechtenstein",
        "New Caledonia",
        "Kosovo",
        "Rwanda",
        "Montenegro",
        "Swaziland",
        "Guam",
        "Mauritania",
        "Guernsey",
        "Isle of Man",
        "Togo",
        "Somalia",
        "Suriname",
        "Aruba",
        "North Korea",
        "Zimbabwe",
        "Central African Republic",
        "Faroe Islands",
        "Greenland",
        "Sierra Leone",
        "Lesotho",
        "Cape Verde",
        "Eritrea",
        "Bhutan",
        "Belize",
        "Antigua and Barbuda",
        "Gibraltar",
        "Maldives",
        "San Marino",
        "Guyana",
        "Burundi",
        "Saint Lucia",
        "Djibouti",
        "British Virgin Islands",
        "Liberia",
        "Seychelles",
        "The Gambia",
        "Northern Mariana Islands",
        "Grenada",
        "Saint Vincent and the Grenadines",
        "Saint Kitts and Nevis",
        "East Timor",
        "Vanuatu",
        "Comoros",
        "Samoa",
        "Solomon Islands",
        "Guinea-Bissau",
        "American Samoa",
        "Dominica",
        "Micronesia",
        "Tonga",
        "Cook Islands",
        "Palau",
        "Marshall Islands",
        "S�o Tom� and Pr�ncipe",
        "Anguilla",
        "Kiribati",
        "Tuvalu",
        "Niue"
      };

  private int sortRange;
  private Random r;

  @Override
  public DocData getNextDocData(DocData docData) throws NoMoreDataException {
    docData = super.getNextDocData(docData);
    Properties props = new Properties();

    // random int
    props.put("sort_field", Integer.toString(r.nextInt(sortRange)));

    // random string
    int len = nextInt(2, 20);
    char[] buffer = new char[len];
    for (int i = 0; i < len; i++) {
      buffer[i] = (char) r.nextInt(0x80);
    }
    props.put("random_string", new String(buffer));

    // random country
    props.put("country", COUNTRIES[r.nextInt(COUNTRIES.length)]);
    docData.setProps(props);
    return docData;
  }

  private int nextInt(int start, int end) {
    return start + r.nextInt(end - start);
  }

  @Override
  public void setConfig(Config config) {
    super.setConfig(config);
    sortRange = config.get("sort.rng", 20000);
    r = new Random(config.get("rand.seed", 13));
  }
}
