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

import 'package:flutter/material.dart';

import '../gallery/demo.dart';

const String _checkboxText =
  "# Checkboxes\n"
  "Checkboxes allow the user to select multiple options from a set.";

const String _checkboxCode = 'selectioncontrols_checkbox';

const String _radioText =
  "# Radio buttons\n"
  "Radio buttons allow the user to select one option from a set. Use radio "
  "buttons for exclusive selection if you think that the user needs to see "
  "all available options side-by-side.";

const String _radioCode = 'selectioncontrols_radio';

const String _switchText =
  "# Switches\n"
  "On/off switches toggle the state of a single settings option. The option "
  "that the switch controls, as well as the state it’s in, should be made "
  "clear from the corresponding inline label.";

const String _switchCode = 'selectioncontrols_switch';

class SelectionControlsDemo extends StatefulWidget {
  static const String routeName = '/selection-controls';

  @override
  _SelectionControlsDemoState createState() => new _SelectionControlsDemoState();
}

class _SelectionControlsDemoState extends State<SelectionControlsDemo> {
  @override
  Widget build(BuildContext context) {
    List<ComponentDemoTabData> demos = <ComponentDemoTabData>[
      new ComponentDemoTabData(
        tabName: "CHECKBOX",
        description: _checkboxText,
        widget: buildCheckbox(),
        exampleCodeTag: _checkboxCode
      ),
      new ComponentDemoTabData(
        tabName: "RADIO",
        description: _radioText,
        widget: buildRadio(),
        exampleCodeTag: _radioCode
      ),
      new ComponentDemoTabData(
        tabName: "SWITCH",
        description: _switchText,
        widget: buildSwitch(),
        exampleCodeTag: _switchCode
      )
    ];

    return new TabbedComponentDemoScaffold(
      title: 'Selection controls',
      demos: demos
    );
  }

  bool checkboxValueA = true;
  bool checkboxValueB = false;
  int radioValue = 0;
  bool switchValue = false;

  void handleRadioValueChanged(int value) {
    setState(() {
      radioValue = value;
    });
  }

  Widget buildCheckbox() {
    return new Align(
      alignment: new FractionalOffset(0.5, 0.4),
      child: new Column(
        mainAxisSize: MainAxisSize.min,
        children: <Widget>[
          new Row(
            mainAxisSize: MainAxisSize.min,
            children: <Widget>[
              new Checkbox(value: checkboxValueA, onChanged: (bool value) {
                setState(() {
                  checkboxValueA = value;
                });
              }),
              new Checkbox(value: checkboxValueB, onChanged: (bool value) {
                setState(() {
                  checkboxValueB = value;
                });
              })
            ]
          ),
          new Row(
            mainAxisSize: MainAxisSize.min,
            children: <Widget>[
              // Disabled checkboxes
              new Checkbox(value: true, onChanged: null),
              new Checkbox(value: false, onChanged: null)
            ]
          )
        ]
      )
    );
  }

  Widget buildRadio() {
    return new Align(
      alignment: new FractionalOffset(0.5, 0.4),
      child: new Column(
        mainAxisSize: MainAxisSize.min,
        children: <Widget>[
          new Row(
            mainAxisSize: MainAxisSize.min,
            children: <Widget>[
              new Radio<int>(
                value: 0,
                groupValue: radioValue,
                onChanged: handleRadioValueChanged
              ),
              new Radio<int>(
                value: 1,
                groupValue: radioValue,
                onChanged: handleRadioValueChanged
              ),
              new Radio<int>(
                value: 2,
                groupValue: radioValue,
                onChanged: handleRadioValueChanged
              )
            ]
          ),
          // Disabled radio buttons
          new Row(
            mainAxisSize: MainAxisSize.min,
            children: <Widget>[
              new Radio<int>(
                value: 0,
                groupValue: 0,
                onChanged: null
              ),
              new Radio<int>(
                value: 1,
                groupValue: 0,
                onChanged: null
              ),
              new Radio<int>(
                value: 2,
                groupValue: 0,
                onChanged: null
              )
            ]
          )
        ]
      )
    );
  }

  Widget buildSwitch() {
    return new Align(
      alignment: new FractionalOffset(0.5, 0.4),
      child: new Row(
        mainAxisSize: MainAxisSize.min,
        children: <Widget>[
          new Switch(value: switchValue, onChanged: (bool value) {
            setState(() {
              switchValue = value;
            });
          }),
          // Disabled switches
          new Switch(value: true, onChanged: null),
          new Switch(value: false, onChanged: null)
        ]
      )
    );
  }
}
