// Copyright 2016, the Flutter 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.

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:usage/usage.dart';

Future main() async {
  runApp(new Container());
  Analytics ga = await Analytics.create('UA-67589403-4', 'ga_test', '1.0');
  runApp(new MaterialApp(
    title: 'Usage Example',
    theme: new ThemeData.dark(),
    routes: <String, WidgetBuilder>{
      '/': (BuildContext context) => new FlutterDemo(ga)
    },
  ));
}

class FlutterDemo extends StatefulWidget {
  FlutterDemo(this.ga);
  Analytics ga;
  @override
  State createState() => new _FlutterDemoState();
}

class _FlutterDemoState extends State<FlutterDemo> {
  int _times = 0;

  void _handleButtonPressed() {
    config.ga.sendEvent('button', 'pressed');
    setState(() {
      _times++;
    });
  }

  void _handleOptIn(bool value) {
    setState(() {
      config.ga.enabled = value;
    });
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text('Usage Example'),
      ),
      body: new Column(
        children: <Widget>[
          new Center(
            child: new Text("Button pressed $_times times."),
          ),
          new ListItem(
            onTap: () => _handleOptIn(!config.ga.enabled),
            leading: new Checkbox(
              value: config.ga.enabled,
              onChanged: _handleOptIn,
            ),
            title: new Text("Opt in to analytics"),
          ),
        ],
        mainAxisAlignment: MainAxisAlignment.spaceAround,
      ),
      floatingActionButton: new FloatingActionButton(
        child: new Icon(Icons.add),
        onPressed: _handleButtonPressed,
      ),
    );
  }
}
