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

class DragData {
  DragData(this.text);

  final String text;
}

class ExampleDragTarget extends StatefulComponent {
  ExampleDragTargetState createState() => new ExampleDragTargetState();
}

class ExampleDragTargetState extends State<ExampleDragTarget> {
  String _text = 'Drag Target';

  void _handleAccept(DragData data) {
    setState(() {
      _text = 'dropped: ${data.text}';
    });
  }

  Widget build(BuildContext context) {
    return new DragTarget<DragData>(
      onAccept: _handleAccept,
      builder: (BuildContext context, List<DragData> data, _) {
        return new Container(
          height: 100.0,
          margin: new EdgeDims.all(10.0),
          decoration: new BoxDecoration(
            border: new Border.all(
              width: 3.0,
              color: data.isEmpty ? Colors.white : Colors.blue[500]
            ),
            backgroundColor: data.isEmpty ? Colors.grey[500] : Colors.green[500]
          ),
          child: new Center(
            child: new Text(_text)
          )
        );
      }
    );
  }
}

class Dot extends StatelessComponent {
  Dot({ Key key, this.color, this.size }) : super(key: key);
  final Color color;
  final double size;
  Widget build(BuildContext context) {
    return new Container(
      width: size,
      height: size,
      decoration: new BoxDecoration(
        borderRadius: 10.0,
        backgroundColor: color
      )
    );
  }
}

class ExampleDragSource extends StatelessComponent {
  ExampleDragSource({ Key key, this.navigator, this.name, this.color }) : super(key: key);
  final NavigatorState navigator;
  final String name;
  final Color color;

  static const kDotSize = 50.0;
  static const kFingerSize = 50.0;

  Widget build(BuildContext context) {
    return new Draggable(
      navigator: navigator,
      data: new DragData(name),
      child: new Dot(color: color, size: kDotSize),
      feedback: new Transform(
        transform: new Matrix4.identity()..translate(-kDotSize / 2.0, -(kDotSize / 2.0 + kFingerSize)),
        child: new Opacity(
          opacity: 0.75,
          child: new Dot(color: color, size: kDotSize)
        )
      ),
      feedbackOffset: const Offset(0.0, -kFingerSize),
      dragAnchor: DragAnchor.pointer
    );
  }
}

class DragAndDropApp extends StatefulComponent {
  DragAndDropApp({ this.navigator });
  final NavigatorState navigator;
  DragAndDropAppState createState() => new DragAndDropAppState();
}

class DragAndDropAppState extends State<DragAndDropApp> {
  Widget build(BuildContext context) {
    return new Scaffold(
      toolBar: new ToolBar(
        center: new Text('Drag and Drop Flutter Demo')
      ),
      body: new Material(
        child: new DefaultTextStyle(
          style: Theme.of(context).text.body1.copyWith(textAlign: TextAlign.center),
          child: new Column([
            new Flexible(child: new Row([
                new ExampleDragSource(navigator: config.navigator, name: 'Orange', color: const Color(0xFFFF9000)),
                new ExampleDragSource(navigator: config.navigator, name: 'Teal', color: const Color(0xFF00FFFF)),
                new ExampleDragSource(navigator: config.navigator, name: 'Yellow', color: const Color(0xFFFFF000)),
              ],
              alignItems: FlexAlignItems.center,
              justifyContent: FlexJustifyContent.spaceAround
            )),
            new Flexible(child: new Row([
              new Flexible(child: new ExampleDragTarget()),
              new Flexible(child: new ExampleDragTarget()),
              new Flexible(child: new ExampleDragTarget()),
              new Flexible(child: new ExampleDragTarget()),
            ])),
          ])
        )
      )
    );
  }
}

void main() {
  runApp(new MaterialApp(
    title: 'Drag and Drop Flutter Demo',
    routes: {
     '/': (RouteArguments args) => new DragAndDropApp(navigator: args.navigator)
    }
  ));
}
