// Copyright 2017 The Fuchsia 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:lib.widgets.dart/model.dart';

import '../models/todo_list_model.dart';
import '../widgets/new_item_input.dart';

/// Widget rendering a single todo item.
class _TodoItem extends StatelessWidget {
  const _TodoItem({Key key, this.content, this.onDone}) : super(key: key);

  final String content;
  final VoidCallback onDone;

  @override
  Widget build(BuildContext context) {
    final ThemeData themeData = Theme.of(context);

    List<Widget> rowChildren = <Widget>[
      new Expanded(child: new Text(content)),
      new SizedBox(
        width: 72.0,
        child: new IconButton(
          icon: const Icon(Icons.done),
          color: themeData.primaryColor,
          onPressed: onDone,
        ),
      ),
    ];
    return new Padding(
      padding: const EdgeInsets.symmetric(vertical: 16.0),
      child: new Row(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          children: rowChildren),
    );
  }
}

/// Callback type for an item becoming done.
typedef ItemDoneCallback = void Function(List<int> id);

/// The top level widget for the todo list module
class TodoListModuleScreen extends StatelessWidget {
  final double _appBarHeight = 120.0;

  /// Constructor
  const TodoListModuleScreen({Key key, this.onNewItem, this.onItemDone})
      : super(key: key);

  /// New item callback.
  final NewItemCallback onNewItem;

  /// Item done callback.
  final ItemDoneCallback onItemDone;

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      body: new ScopedModelDescendant<TodoListModel>(builder: (
        BuildContext context,
        Widget child,
        TodoListModel model,
      ) {
        List<Widget> listItems = <Widget>[];
        model.items.forEach((List<int> key, String value) {
          listItems.add(new _TodoItem(
            content: value,
            onDone: () {
              onItemDone(key);
            },
          ));
        });

        List<Widget> slivers = <Widget>[
          new SliverAppBar(
            expandedHeight: _appBarHeight,
            pinned: true,
            flexibleSpace: const FlexibleSpaceBar(
              title: const Text('Todo List'),
            ),
          ),
          new SliverToBoxAdapter(child: new NewItemInput(onNewItem: onNewItem)),
          new SliverList(delegate: new SliverChildListDelegate(listItems))
        ];

        return new Material(child: new CustomScrollView(slivers: slivers));
      }),
    );
  }
}
