import '../logic/croupier.dart' as logic_croupier;
import '../logic/game.dart' as logic_game;
import 'package:sky/widgets.dart' show FlatButton;
import 'package:sky/widgets/basic.dart';
import 'game.dart' show GameComponent;
import 'dart:sky' as sky;

class CroupierComponent extends StatefulComponent {
  logic_croupier.Croupier croupier;

  CroupierComponent(this.croupier) : super();

  void syncFields(CroupierComponent other) {
    croupier = other.croupier;
  }

  Function setStateCallbackFactory(logic_croupier.CroupierState s, [var data = null]) {
    return () => setState(() {
      croupier.setState(s, data);
    });
  }

  Widget build() {
    switch (croupier.state) {
      case logic_croupier.CroupierState.Welcome:
        // in which we show them a UI to start a new game, join a game, or change some settings.
        return new Container(
          padding: new EdgeDims.only(top: sky.view.paddingTop),
          child: new Flex([
            new FlatButton(
              child: new Text('Create Game'),
              onPressed: setStateCallbackFactory(logic_croupier.CroupierState.ChooseGame)
            ),
            new FlatButton(
              child: new Text('Join Game')
            ),
            new FlatButton(
              child: new Text('Settings')
            )
          ], direction: FlexDirection.vertical
        )
      );
      case logic_croupier.CroupierState.Settings:
        return null; // in which we let them pick an avatar, name, and color. And return to the previous screen after (NOT IMPLEMENTED YET)
      case logic_croupier.CroupierState.ChooseGame:
        // in which we let them pick a game out of the many possible games... There aren't that many.
        return new Container(
          padding: new EdgeDims.only(top: sky.view.paddingTop),
          child: new Flex([
            new FlatButton(
              child: new Text('Proto'),
              onPressed: setStateCallbackFactory(logic_croupier.CroupierState.PlayGame, logic_game.GameType.Proto)
            ),
            new FlatButton(
              child: new Text('Hearts'),
              onPressed: setStateCallbackFactory(logic_croupier.CroupierState.PlayGame, logic_game.GameType.Hearts)
            ),
            new FlatButton(
              child: new Text('Poker')
            ),
            new FlatButton(
              child: new Text('Solitaire')
            )
          ], direction: FlexDirection.vertical
        )
      );
      case logic_croupier.CroupierState.AwaitGame:
        return null; // in which players wait for game invitations to arrive.
      case logic_croupier.CroupierState.ArrangePlayers:
        return null; // If needed, lists the players around and what devices they'd like to use.
      case logic_croupier.CroupierState.PlayGame:
        return new GameComponent(croupier.game); // Asks the game UI to draw itself.
      default:
        assert(false);
        return null;
    }
  }
}