// 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 provides a basic example of internationalization usage. It uses the
 * local variant of all the facilities, meaning that libraries with the
 * data for all the locales are directly imported by the program. Once lazy
 * loading is available, we expect this to be the preferred mode, with
 * the initialization code actually loading the specific libraries needed.
 *
 * This defines messages for an English locale directly in the program and
 * has separate libraries that define German and Thai messages that say more or
 * less the same thing, and prints the message with the date and time in it
 * formatted appropriately for the locale.
 */

library intl_basic_example;

import 'dart:async';
import 'package:intl/date_symbol_data_local.dart';
import 'package:intl/intl.dart';
import 'messages_all.dart';

/**
 * In order to use this both as an example and as a test case, we pass in
 * the function for what we're going to do with the output. For a simple
 * example we just pass in [print] and for tests we pass in a function that
 * adds it a list to be verified.
 */
Function doThisWithTheOutput;

void setup(Function program, Function output) {
  // Before we use any messages or use date formatting for a locale we must
  // call their initializtion messages, which are asynchronous, since they
  // might be reading information from files or over the web. Since we are
  // running here in local mode they will all complete immediately.
  doThisWithTheOutput = output;
  var germanDatesFuture = initializeDateFormatting('de_DE', null);
  var thaiDatesFuture = initializeDateFormatting('th_TH', null);
  var germanMessagesFuture = initializeMessages('de_DE');
  var thaiMessagesFuture = initializeMessages('th_TH');
  Future
      .wait([
    germanDatesFuture,
    thaiDatesFuture,
    germanMessagesFuture,
    thaiMessagesFuture
  ])
      .then(program);
}

// Because the initialization messages return futures we split out the main
// part of our program into a separate function that runs once all the
// futures have completed. We are passed the collection of futures, but we
// don't need to use them, so ignore the parameter.
runProgram(List<Future> _) {
  var aDate = new DateTime.fromMillisecondsSinceEpoch(0, isUtc: true);
  var de = new Intl('de_DE');
  var th = new Intl('th_TH');
  // This defines a message that can be internationalized. It is written as a
  // function that returns the result of an Intl.message call. The primary
  // parameter is a string that may use interpolation.
  runAt(time, date) =>
      Intl.message('Ran at $time on $date', name: 'runAt', args: [time, date]);
  printForLocale(aDate, new Intl(), runAt);
  printForLocale(aDate, de, runAt);
  printForLocale(aDate, th, runAt);
  // Example making use of the return value from withLocale;
  var returnValue = Intl.withLocale(th.locale, () => runAt('now', 'today'));
  doThisWithTheOutput(returnValue);
}

printForLocale(aDate, intl, operation) {
  var hmsFormat = intl.date().add_Hms();
  var dayFormat = intl.date().add_yMMMMEEEEd();
  var time = hmsFormat.format(aDate);
  var day = dayFormat.format(aDate);
  Intl.withLocale(intl.locale, () => doThisWithTheOutput(operation(time, day)));
}
