// Copyright 2015 The Vanadium 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 'package:sky/widgets_next.dart';
import 'package:sky/material.dart' show Colors;

import 'logic/croupier.dart' show Croupier;
import 'components/croupier.dart' show CroupierComponent;

class CroupierApp extends StatefulComponent {
  final NavigatorState navigator;
  CroupierApp(this.navigator);

  CroupierAppState createState() => new CroupierAppState();
}

class CroupierAppState extends State<CroupierApp> {
  Croupier croupier;

  void initState(_) {
    super.initState(_);
    this.croupier = new Croupier();
  }

  Widget build(BuildContext context) {
    return new Container(
        decoration: new BoxDecoration(
            backgroundColor: const Color(0xFF6666FF), borderRadius: 5.0),
        child: new DefaultTextStyle(
            style: Theme.of(context).text.body1,
            child: new CroupierComponent(config.navigator, this.croupier)));
  }
}

void main() {
  runApp(new App(
      title: 'Croupier',
      routes: <String, RouteBuilder>{
        "/": (NavigatorState navigator, Route route) =>
            new CroupierApp(navigator)
      },
      theme: new ThemeData(
          brightness: ThemeBrightness.light, primarySwatch: Colors.purple)));
}
