// 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>*/([
    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)));
}
