// Copyright 2018 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.

import 'dart:async';
import 'dart:developer' show Timeline;

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

import 'src/models/settings_model.dart';
import 'src/setting_entry.dart';
import 'src/setting_entry_parser.dart';
import 'src/widgets/all_settings.dart';

/// Main function of settings.
Future<Null> main() async {
  setupLogger(name: 'settings');
  Timeline.instantSync('settings starting');

  SettingsModel settingsModel = SettingsModel();
  List<SettingEntry> entries = await SettingEntryParser.parseFile(
      settingsModel, 'pkg/data/settings.config');

  // We handle license setting separately as it is not a component.
  entries.add(LicenseSettingEntry());

  Widget app = MaterialApp(
    home: AllSettings(entries),
    routes: _buildRoutes(settingsModel, entries),
  );

  app = ScopedModel<SettingsModel>(
    model: settingsModel,
    child: app,
  );

  runApp(app);

  Timeline.instantSync('settings started');
}

Map<String, WidgetBuilder> _buildRoutes(
    SettingsModel settingsModel, List<SettingEntry> entries) {
  Map<String, WidgetBuilder> routes = {};

  for (SettingEntry entry in entries) {
    routes[entry.route] = entry.getRouteBuilder(settingsModel);
  }

  return routes;
}
