// 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:sky/theme/colors.dart' as colors;
import 'package:sky/widgets.dart';

class GreenCard extends Component {
  GreenCard({ this.child });

  Widget child;

  Widget build() {
    return new Container(
      decoration: new BoxDecoration(
        backgroundColor: const Color(0xFF0000FF),
        border: new Border.all(
          color: const Color(0xFF00FF00),
          width: 10.0
        )
      ),
      child: new Center(child: child)
    );
  }
}

class CardData {
  final GlobalKey key;
  final String content;

  CardData({ this.key, this.content });
}

class ExampleApp extends App {
  ExampleApp() {
    for (int i = 0; i < 20; ++i) {
      _data.add(new CardData(
        key: new GlobalKey(),
        content: '$i'
      ));
    }
  }

  final List<CardData> _data = new List<CardData>();

  GlobalKey _overlay;

  Widget _buildCard(CardData cardData) {
    return new Listener(
      onGestureTap: (_) {
        setState(() {
          _overlay = cardData.key;
        });
      },
      child: new Container(
        height: 100.0,
        margin: new EdgeDims.symmetric(horizontal: 20.0, vertical: 4.0),
        child: new Mimicable(
          key: cardData.key,
          child: new GreenCard(child: new Text(cardData.content))
        )
      )
    );
  }

  Rect _targetRect;
  void _handleOverlaySizeChanged(Size size) {
    setState(() {
      _targetRect = Point.origin & size;
    });
  }

  Widget build() {
    List<Widget> cards = new List<Widget>();
    for (int i = 0; i < _data.length; ++i) {
      cards.add(_buildCard(_data[i]));
    }

    return new IconTheme(
      data: const IconThemeData(color: IconThemeColor.white),
      child: new Theme(
        data: new ThemeData(
          brightness: ThemeBrightness.light,
          primarySwatch: colors.Blue,
          accentColor: colors.RedAccent[200]
        ),
        child: new Scaffold(
          toolbar: new ToolBar(
            left: new IconButton(
              icon: "navigation/arrow_back",
              onPressed: () {
                setState(() {
                  _overlay = null;
                });
              }
            )
          ),
          body: new SizeObserver(
            callback: _handleOverlaySizeChanged,
            child: new MimicOverlay(
              overlay: _overlay,
              duration: const Duration(milliseconds: 5000),
              targetRect: _targetRect,
              children: [ new Block(cards) ]
            )
          )
        )
      )
    );
  }
}

void main() {
  runApp(new ExampleApp());
}
