/*
 * Copyright (C) 2009 Google Inc.
 *
 * Licensed 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 com.google.i18n.phonenumbers;

import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata;
import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadataCollection;

import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.Formatter;
import java.util.List;
import java.util.Map;

/**
 * Tool to convert phone number metadata from the XML format to protocol buffer format.
 *
 * @author Shaopeng Jia
 */
public class BuildMetadataProtoFromXml {
  private static final String PACKAGE_NAME = PhoneNumberUtil.class.getPackage().getName();
  private static final String TEST_COUNTRY_CODE_TO_REGION_CODE_MAP_CLASS_NAME =
      "CountryCodeToRegionCodeMapForTesting";
  private static final String COUNTRY_CODE_TO_REGION_CODE_MAP_CLASS_NAME =
      "CountryCodeToRegionCodeMap";

  private static final String HELP_MESSAGE =
      "Usage:\n" +
      "BuildMetadataProtoFromXml <inputFile> <outputDir> <forTesting> [<liteBuild>]\n" +
      "\n" +
      "where:\n" +
      "  inputFile    The input file containing phone number metadata in XML format.\n" +
      "  outputDir    The output directory to store phone number metadata in proto\n" +
      "               format (one file per region) and the country code to region code\n" +
      "               mapping file.\n" +
      "  forTesting   Flag whether to generate metadata for testing purposes or not.\n" +
      "  liteBuild    Whether to generate the lite-version of the metadata (default:\n" +
      "               false). When set to true certain metadata will be omitted.\n" +
      "               At this moment, example numbers information is omitted.\n" +
      "\n" +
      "Metadata will be stored in:\n" +
      "  <outputDir>" + PhoneNumberUtil.META_DATA_FILE_PREFIX + "_*\n" +
      "Mapping file will be stored in:\n" +
      "  <outputDir>/" + PACKAGE_NAME.replaceAll("\\.", "/") + "/" +
          COUNTRY_CODE_TO_REGION_CODE_MAP_CLASS_NAME + ".java\n" +
      "\n" +
      "Example command line invocation:\n" +
      "BuildMetadataProtoFromXml PhoneNumberMetadata.xml src false false\n";

  public static void main(String[] args) throws Exception {
    if (args.length != 3 && args.length != 4) {
      System.err.println(HELP_MESSAGE);
      System.exit(1);
    }
    String inputFile = args[0];
    String outputDir = args[1];
    boolean forTesting = args[2].equals("true");
    boolean liteBuild = args.length > 3 && args[3].equals("true");

    String filePrefix;
    if (forTesting) {
      filePrefix = outputDir + PhoneNumberUtilTest.TEST_META_DATA_FILE_PREFIX;
    } else {
      filePrefix = outputDir + PhoneNumberUtil.META_DATA_FILE_PREFIX;
    }

    PhoneMetadataCollection metadataCollection =
        BuildMetadataFromXml.buildPhoneMetadataCollection(inputFile, liteBuild);

    for (PhoneMetadata metadata : metadataCollection.getMetadataList()) {
      String regionCode = metadata.getId();
      PhoneMetadataCollection outMetadataCollection = new PhoneMetadataCollection();
      outMetadataCollection.addMetadata(metadata);
      FileOutputStream outputForRegion = new FileOutputStream(filePrefix + "_" + regionCode);
      ObjectOutputStream out = new ObjectOutputStream(outputForRegion);
      outMetadataCollection.writeExternal(out);
      out.close();
    }

    Map<Integer, List<String>> countryCodeToRegionCodeMap =
        BuildMetadataFromXml.buildCountryCodeToRegionCodeMap(metadataCollection);

    writeCountryCallingCodeMappingToJavaFile(countryCodeToRegionCodeMap, outputDir, forTesting);
  }

  static final String COPYRIGHT_NOTICE =
      "/*\n" +
      " * Copyright (C) 2010 Google Inc.\n" +
      " *\n" +
      " * Licensed under the Apache License, Version 2.0 (the \"License\");\n" +
      " * you may not use this file except in compliance with the License.\n" +
      " * You may obtain a copy of the License at\n" +
      " *\n" +
      " * http://www.apache.org/licenses/LICENSE-2.0\n" +
      " *\n" +
      " * Unless required by applicable law or agreed to in writing, software\n" +
      " * distributed under the License is distributed on an \"AS IS\" BASIS,\n" +
      " * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n" +
      " * See the License for the specific language governing permissions and\n" +
      " * limitations under the License.\n" +
      " *\n" +
      " * This file is automatically generated by BuildMetadataProtoFromXml. Please\n" +
      " * don't modify directly.\n" +
      " */\n\n";
  private static final String MAPPING_IMPORTS =
      "import java.util.ArrayList;\n" +
      "import java.util.HashMap;\n" +
      "import java.util.List;\n" +
      "import java.util.Map;\n";
  private static final String MAPPING_COMMENT =
      "  // A mapping from a country code to the region codes which denote the\n" +
      "  // country/region represented by that country code. In the case of multiple\n" +
      "  // countries sharing a calling code, such as the NANPA countries, the one\n" +
      "  // indicated with \"isMainCountryForCode\" in the metadata should be first.\n";
  private static final double MAPPING_LOAD_FACTOR = 0.75;
  private static final String MAPPING_COMMENT_2 =
      "    // The capacity is set to %d as there are %d different country codes,\n" +
      "    // and this offers a load factor of roughly " + MAPPING_LOAD_FACTOR + ".\n";

  private static void writeCountryCallingCodeMappingToJavaFile(
      Map<Integer, List<String>> countryCodeToRegionCodeMap,
      String outputDir, boolean forTesting) throws IOException {
    String mappingClassName;
    if (forTesting) {
      mappingClassName = TEST_COUNTRY_CODE_TO_REGION_CODE_MAP_CLASS_NAME;
    } else {
      mappingClassName = COUNTRY_CODE_TO_REGION_CODE_MAP_CLASS_NAME;
    }
    String mappingFile =
        outputDir + "/" + PACKAGE_NAME.replaceAll("\\.", "/") + "/" + mappingClassName + ".java";
    int capacity = (int) (countryCodeToRegionCodeMap.size() / MAPPING_LOAD_FACTOR);

    BufferedWriter writer = new BufferedWriter(new FileWriter(mappingFile));

    writer.write(COPYRIGHT_NOTICE);
    if (PACKAGE_NAME.length() > 0) {
      writer.write("package " + PACKAGE_NAME + ";\n\n");
    }
    writer.write(MAPPING_IMPORTS);
    writer.write("\n");
    writer.write("public class " + mappingClassName + " {\n");
    writer.write(MAPPING_COMMENT);
    writer.write("  static Map<Integer, List<String>> getCountryCodeToRegionCodeMap() {\n");
    Formatter formatter = new Formatter(writer);
    formatter.format(MAPPING_COMMENT_2, capacity, countryCodeToRegionCodeMap.size());
    writer.write("    Map<Integer, List<String>> countryCodeToRegionCodeMap =\n");
    writer.write("        new HashMap<Integer, List<String>>(" + capacity + ");\n");
    writer.write("\n");
    writer.write("    ArrayList<String> listWithRegionCode;\n");
    writer.write("\n");

    for (Map.Entry<Integer, List<String>> entry : countryCodeToRegionCodeMap.entrySet()) {
      int countryCallingCode = entry.getKey();
      List<String> regionCodes = entry.getValue();
      writer.write("    listWithRegionCode = new ArrayList<String>(" + regionCodes.size() + ");\n");
      for (String regionCode : regionCodes) {
        writer.write("    listWithRegionCode.add(\"" + regionCode + "\");\n");
      }
      writer.write("    countryCodeToRegionCodeMap.put(" + countryCallingCode +
                   ", listWithRegionCode);\n");
      writer.write("\n");
    }

    writer.write("    return countryCodeToRegionCodeMap;\n");
    writer.write("  }\n");
    writer.write("}\n");

    writer.flush();
    writer.close();
  }
}
