/*
 * Copyright 2010 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.gwt.tools.cldr;

import com.google.gwt.i18n.shared.GwtLocale;

import org.unicode.cldr.util.CLDRFile.Factory;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;

/**
 * Extract list formatting information from CLDR data.
 */
public class ListFormattingProcessor extends Processor {

  public ListFormattingProcessor(File outputDir, Factory cldrFactory, LocaleData localeData) {
    super(outputDir, cldrFactory, localeData);
  }

  @Override
  protected void cleanupData() {
    localeData.removeCompleteDuplicates("list");
  }

  @Override
  protected void loadData() throws IOException {
    System.out.println("Loading data for list formatting");
    localeData.addEntries("list", cldrFactory, "//ldml/listPatterns/listPattern",
        "listPatternPart", "type");
  }

  @Override
  protected void writeOutputFiles() throws IOException {
    for (GwtLocale locale : localeData.getNonEmptyLocales("list")) {
      PrintWriter pw = null;
      for (Map.Entry<String, String> entry : localeData.getEntries("list", locale).entrySet()) {
        if (pw == null) {
          pw = createOutputFile("rebind/cldr/ListPatterns_" + locale.getAsString() + ".properties");
        }
        pw.println(entry.getKey() + "=" + entry.getValue());
      }
      if (pw != null) {
        pw.close();
      }
    }
  }
}
