// 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;
typedef ThenList(List l);

void setup(ThenList program, Function output) {
  // Before we use any messages or use date formatting for a locale we must
  // call their initialization 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/*<Future>*/(<Future>[
    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 _) {
  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)));
}
