// 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 GestureDetector(
      onTap: () {
        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());
}
