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

library fitness;

import 'package:playfair/playfair.dart' as playfair;
import 'package:sky/editing/input.dart';
import 'package:sky/painting/text_style.dart';
import 'package:sky/theme/colors.dart' as colors;
import 'package:sky/widgets.dart';
import 'user_data.dart';
import 'date_utils.dart';
import 'dart:async';

part 'feed.dart';
part 'fitness_item.dart';
part 'fitness_types.dart';
part 'meal.dart';
part 'measurement.dart';
part 'settings.dart';

class UserData {
  List<FitnessItem> _items = [];

  List<FitnessItem> get items => _items;
  void set items(List<FitnessItem> newItems) {
    _items = [];
    _items.addAll(newItems);
    sort();
  }

  void sort() {
    _items.sort((a, b) => -a.when.compareTo(b.when));
  }

  void addAndSave(FitnessItem item) {
    _items.add(item);
    sort();
    save();
  }

  void removeAndSave(FitnessItem item) {
    _items.remove(item);
    save();
  }

  Future save() => saveFitnessData(_items);
}

class FitnessApp extends App {
  NavigationState _navigationState;
  final UserData _userData = new UserData();

  void didMount() {
    super.didMount();
    loadFitnessData().then((List<Measurement> list) {
      setState(() => _userData.items = list);
    }).catchError((e) => print("Failed to load data: $e"));
  }

  void save() {
    _userData.save().catchError((e) => print("Failed to load data: $e"));
  }

  void initState() {
    _navigationState = new NavigationState([
      new Route(
        name: '/',
        builder: (navigator, route) => new FeedFragment(
          navigator: navigator,
          userData: _userData.items,
          onItemCreated: _handleItemCreated,
          onItemDeleted: _handleItemDeleted
        )
      ),
      new Route(
        name: '/meals/new',
        builder: (navigator, route) => new MealFragment(
          navigator: navigator,
          onCreated: _handleItemCreated
        )
      ),
      new Route(
        name: '/measurements/new',
        builder: (navigator, route) => new MeasurementFragment(
          navigator: navigator,
          onCreated: _handleItemCreated
        )
      ),
      new Route(
        name: '/settings',
        builder: (navigator, route) => new SettingsFragment(navigator, backupSetting, settingsUpdater)
      ),
    ]);
    super.initState();
  }

  void onBack() {
    if (_navigationState.hasPrevious()) {
      setState(() => _navigationState.pop());
    } else {
      super.onBack();
    }
  }

  void _handleItemCreated(FitnessItem item) {
    setState(() => _userData.addAndSave(item));
  }

  void _handleItemDeleted(FitnessItem item) {
    setState(() => _userData.removeAndSave(item));
  }

  BackupMode backupSetting = BackupMode.disabled;

  void settingsUpdater({ BackupMode backup }) {
    setState(() {
      if (backup != null)
        backupSetting = backup;
    });
  }

  Widget build() {
    return new Theme(
      data: new ThemeData(
        brightness: ThemeBrightness.light,
        primarySwatch: colors.Indigo,
        accentColor: colors.PinkAccent[200]
      ),
      child: new TaskDescription(
        label: 'Fitness',
        child: new Navigator(_navigationState)
      )
    );
  }
}

void main() {
  runApp(new FitnessApp());
}
