// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

/**
 * This file should be imported, along with date_format.dart in order to read
 * locale data from files in the file system.
 */

library date_symbol_data_file;

import 'dart:async';

import 'package:path/path.dart' as path;

import 'date_symbols.dart';
import 'src/data/dates/locale_list.dart';
import 'src/date_format_internal.dart';
import 'src/file_data_reader.dart';
import 'src/lazy_locale_data.dart';

export 'src/data/dates/locale_list.dart';

/**
 * This should be called for at least one [locale] before any date formatting
 * methods are called. It sets up the lookup for date symbols using [path].
 * The [path] parameter should end with a directory separator appropriate
 * for the platform.
 */
Future initializeDateFormatting(String locale, String filePath) {
  var reader = new FileDataReader(path.join(filePath, 'symbols'));
  initializeDateSymbols(() => new LazyLocaleData(
      reader, _createDateSymbol, availableLocalesForDateFormatting));
  var reader2 = new FileDataReader(path.join(filePath, 'patterns'));
  initializeDatePatterns(() => new LazyLocaleData(
      reader2, (x) => x, availableLocalesForDateFormatting));
  return initializeIndividualLocaleDateFormatting(
      (symbols, patterns) {
        return Future.wait([
            symbols.initLocale(locale),
            patterns.initLocale(locale)]);
      });
}

/** Defines how new date symbol entries are created. */
DateSymbols _createDateSymbol(Map map) =>
    new DateSymbols.deserializeFromMap(map);
