// 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/animation.dart';
import 'package:flutter/material.dart';

class ProgressIndicatorDemo extends StatefulComponent {
  _ProgressIndicatorDemoState createState() => new _ProgressIndicatorDemoState();
}

class _ProgressIndicatorDemoState extends State<ProgressIndicatorDemo> {

  void initState() {
    super.initState();
    controller = new AnimationController(
      duration: const Duration(milliseconds: 1500)
    )..play(AnimationDirection.forward);

    animation = new CurvedAnimation(
      parent: controller,
      curve: new Interval(0.0, 0.9, curve: Curves.ease),
      reverseCurve: Curves.ease
    )..addStatusListener((AnimationStatus status) {
      if (status == AnimationStatus.dismissed || status == AnimationStatus.completed)
        reverseValueAnimationDirection();
    });
  }

  Animation<double> animation;
  AnimationController controller;

  void handleTap() {
    setState(() {
      // valueAnimation.isAnimating is part of our build state
      if (controller.isAnimating)
        controller.stop();
      else
        controller.resume();
    });
  }

  void reverseValueAnimationDirection() {
    AnimationDirection direction = (controller.direction == AnimationDirection.forward)
      ? AnimationDirection.reverse
      : AnimationDirection.forward;
    controller.play(direction);
  }

  Widget buildIndicators(BuildContext context, Widget child) {
    List<Widget> indicators = <Widget>[
        new SizedBox(
          width: 200.0,
          child: new LinearProgressIndicator()
        ),
        new LinearProgressIndicator(),
        new LinearProgressIndicator(),
        new LinearProgressIndicator(value: animation.value),
        new CircularProgressIndicator(),
        new SizedBox(
            width: 20.0,
            height: 20.0,
            child: new CircularProgressIndicator(value: animation.value)
        ),
        new SizedBox(
          width: 50.0,
          height: 30.0,
          child: new CircularProgressIndicator(value: animation.value)
        ),
        new Text("${(animation.value * 100.0).toStringAsFixed(1)}%" + (controller.isAnimating ? '' : ' (paused)'))
    ];
    return new Column(
      children: indicators
        .map((Widget c) => new Container(child: c, margin: const EdgeDims.symmetric(vertical: 15.0, horizontal: 20.0)))
        .toList(),
      justifyContent: FlexJustifyContent.center
    );
  }

  Widget build(BuildContext context) {
    return new Scaffold(
      toolBar: new ToolBar(center: new Text('Progress Indicators')),
      body: new DefaultTextStyle(
        style: Theme.of(context).text.title,
        child: new GestureDetector(
          onTap: handleTap,
          behavior: HitTestBehavior.opaque,
          child: new Container(
            padding: const EdgeDims.symmetric(vertical: 12.0, horizontal: 8.0),
            child: new AnimatedBuilder(
              animation: animation,
              builder: buildIndicators
            )
          )
        )
      )
    );
  }
}