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

part of stocks;

class StockSettings extends StatefulComponent {
  const StockSettings(this.configuration, this.updater);

  final StockConfiguration configuration;
  final ValueChanged<StockConfiguration> updater;

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

class StockSettingsState extends State<StockSettings> {
  void _handleOptimismChanged(bool value) {
    value ??= false;
    sendUpdates(config.configuration.copyWith(stockMode: value ? StockMode.optimistic : StockMode.pessimistic));
  }

  void _handleBackupChanged(bool value) {
    sendUpdates(config.configuration.copyWith(backupMode: value ? BackupMode.enabled : BackupMode.disabled));
  }

  void _handleShowGridChanged(bool value) {
    sendUpdates(config.configuration.copyWith(debugShowGrid: value));
  }

  void _handleShowSizesChanged(bool value) {
    sendUpdates(config.configuration.copyWith(debugShowSizes: value));
  }

  void _handleShowPerformanceOverlayChanged(bool value) {
    sendUpdates(config.configuration.copyWith(showPerformanceOverlay: value));
  }

  void _confirmOptimismChange() {
    switch (config.configuration.stockMode) {
      case StockMode.optimistic:
        _handleOptimismChanged(false);
        break;
      case StockMode.pessimistic:
        showDialog(
          context: context,
          child: new Dialog(
            title: new Text("Change mode?"),
            content: new Text("Optimistic mode means everything is awesome. Are you sure you can handle that?"),
            actions: <Widget>[
              new FlatButton(
                child: new Text('NO THANKS'),
                onPressed: () {
                  Navigator.pop(context, false);
                }
              ),
              new FlatButton(
                child: new Text('AGREE'),
                onPressed: () {
                  Navigator.pop(context, true);
                }
              ),
            ]
          )
        ).then(_handleOptimismChanged);
        break;
    }
  }

  void sendUpdates(StockConfiguration value) {
    if (config.updater != null)
      config.updater(value);
  }

  Widget buildToolBar(BuildContext context) {
    return new ToolBar(
      center: new Text('Settings')
    );
  }

  Widget buildSettingsPane(BuildContext context) {
    List<Widget> rows = <Widget>[
      new DrawerItem(
        icon: 'action/thumb_up',
        onPressed: () => _confirmOptimismChange(),
        child: new Row(
          children: <Widget>[
            new Flexible(child: new Text('Everything is awesome')),
            new Checkbox(
              value: config.configuration.stockMode == StockMode.optimistic,
              onChanged: (bool value) => _confirmOptimismChange()
            ),
          ]
        )
      ),
      new DrawerItem(
        icon: 'action/backup',
        onPressed: () { _handleBackupChanged(!(config.configuration.backupMode == BackupMode.enabled)); },
        child: new Row(
          children: <Widget>[
            new Flexible(child: new Text('Back up stock list to the cloud')),
            new Switch(
              value: config.configuration.backupMode == BackupMode.enabled,
              onChanged: _handleBackupChanged
            ),
          ]
        )
      ),
      new DrawerItem(
        icon: 'action/picture_in_picture',
        onPressed: () { _handleShowPerformanceOverlayChanged(!config.configuration.showPerformanceOverlay); },
        child: new Row(
          children: <Widget>[
            new Flexible(child: new Text('Show rendering performance overlay')),
            new Switch(
              value: config.configuration.showPerformanceOverlay,
              onChanged: _handleShowPerformanceOverlayChanged
            ),
          ]
        )
      ),
    ];
    assert(() {
      // material grid and size construction lines are only available in checked mode
      rows.addAll([
        new DrawerItem(
          icon: 'editor/border_clear',
          onPressed: () { _handleShowGridChanged(!config.configuration.debugShowGrid); },
          child: new Row(
            children: <Widget>[
              new Flexible(child: new Text('Show material grid (for debugging)')),
              new Switch(
                value: config.configuration.debugShowGrid,
                onChanged: _handleShowGridChanged
              ),
            ]
          )
        ),
        new DrawerItem(
          icon: 'editor/border_all',
          onPressed: () { _handleShowSizesChanged(!config.configuration.debugShowSizes); },
          child: new Row(
            children: <Widget>[
              new Flexible(child: new Text('Show construction lines (for debugging)')),
              new Switch(
                value: config.configuration.debugShowSizes,
                onChanged: _handleShowSizesChanged
              ),
            ]
          )
        )
      ]);
      return true;
    });
    return new Block(
      rows,
      padding: const EdgeDims.symmetric(vertical: 20.0)
    );
  }

  Widget build(BuildContext context) {
    return new Scaffold(
      toolBar: buildToolBar(context),
      body: buildSettingsPane(context)
    );
  }
}