// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Should the localizations delegate be generated instead?

import 'dart:async';
import 'dart:ui' show Locale;

import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:fuchsia_logger/logger.dart';

import 'localization/messages_all.dart' as messages_all;
import 'supported_locales.dart' as supported_locales;

LocalizationsDelegate<void> delegate() => _LocalizationsDelegate();

class _LocalizationsDelegate extends LocalizationsDelegate<void> {
  static Future<void> loadLocale(Locale locale) async {
    final String name =
        (locale.countryCode == null || locale.countryCode.isEmpty)
            ? locale.languageCode
            : locale.toString();
    final String localeName = Intl.canonicalizedLocale(name);
    await messages_all.initializeMessages(localeName);
    log.info(
        '_LocalizationsDelegate: current default locale: ${Intl.defaultLocale}');
  }

  const _LocalizationsDelegate();

  @override
  Future<void> load(Locale locale) => loadLocale(locale);

  // For the time being, never reload.
  @override
  bool shouldReload(_LocalizationsDelegate __) => false;

  @override
  bool isSupported(Locale locale) {
    bool supported = supported_locales.locales.contains(locale);
    log.finer(
        '_LocalizationsDelegate: locale: ${locale.toString()}; isSupported: ${supported.toString()}');
    return supported;
  }
}
