// Copyright 2015 The Vanadium 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/widgets.dart';

import '../models/all.dart' as model;
import '../stores/store.dart';
import '../styles/common.dart' as style;
import '../utils/image_provider.dart' as imageProvider;
import 'syncslides_page.dart';
import 'toast.dart' as toast;

final GlobalKey _scaffoldKey = new GlobalKey();

class QuestionListPage extends SyncSlidesPage {
  final String _deckId;

  QuestionListPage(this._deckId);

  Widget build(BuildContext context, AppState appState, AppActions appActions) {
    if (!appState.decks.containsKey(_deckId)) {
      // TODO(aghassemi): Proper error page with navigation back to main view.
      return new Text('Deck no longer exists.');
    }
    var deckState = appState.decks[_deckId];
    var presentationState = deckState.presentation;
    if (presentationState == null) {
      // TODO(aghassemi): Proper error page with navigation back to main view.
      return new Text('Not in a presentation.');
    }
    if (!presentationState.isOwner) {
      // TODO(aghassemi): Proper error page with navigation back to main view.
      return new Text('Only presentation owner can see the list of questions.');
    }

    return new Scaffold(
        key: _scaffoldKey,
        toolBar: new ToolBar(
            left: new IconButton(
                icon: 'navigation/arrow_back',
                onPressed: () => Navigator.of(context).pop()),
            center: new Text('Answer questions')),
        body: new Material(
            child: new QuestionList(_deckId, presentationState,
                deckState.slides, appActions, appState)));
  }
}

class QuestionList extends StatelessComponent {
  String _deckId;
  PresentationState _presentationState;
  List<model.Slide> _slides;
  AppActions _appActions;
  AppState _appState;
  QuestionList(this._deckId, this._presentationState, this._slides,
      this._appActions, this._appState);

  Widget build(BuildContext context) {
    List<Widget> questionCards = _presentationState.questions
        .map((model.Question q) => _buildQuestionCard(context, q))
        .toList();
    return new ScrollableViewport(child: new Block(questionCards));
  }

  Widget _buildQuestionCard(BuildContext context, model.Question q) {
    List<Widget> titleChildren = [
      new Text('Slide ${q.slideNum + 1}', style: style.Text.titleStyle)
    ];

    Widget jumpToSlide;
    if (_presentationState.isDriving(_appState.user)) {
      jumpToSlide = new IconButton(icon: 'av/loop', onPressed: () async {
        await _appActions.setCurrSlideNum(_deckId, q.slideNum);
        toast.info(_scaffoldKey, 'Jumped to slide ${q.slideNum + 1}');
      });
      titleChildren.add(jumpToSlide);
    }

    Widget title = new Column([
      new Text('${q.questioner.name} asked about',
          style: style.Text.subtitleStyle),
      new Row(titleChildren)
    ], alignItems: FlexAlignItems.start);

    Widget thumbnail = new Container(
        child: new AsyncImage(
            width: style.Size.questionListThumbnailWidth,
            provider:
                imageProvider.getSlideImage(_deckId, _slides[q.slideNum])));

    Widget titleAndThumbnail = new Row([
      new Flexible(child: title, flex: 2),
      new Flexible(child: thumbnail, flex: 1)
    ], alignItems: FlexAlignItems.start);

    Widget question = new Container(
        child: new BlockBody([titleAndThumbnail, new Text(q.text)]),
        padding: style.Spacing.normalPadding);

    Widget handoff = new GestureDetector(onTap: () async {
      await _appActions.setDriver(_deckId, q.questioner);
      Navigator.of(context).pop();
    }, child: new Container(child: new Text('HAND OFF')));

    Widget actions = new Container(
        padding: style.Spacing.normalPadding,
        decoration: new BoxDecoration(
            border: new Border(
                top: new BorderSide(color: style.theme.dividerColor))),
        child: new DefaultTextStyle(
            style: new TextStyle(color: style.theme.accentColor),
            child: new Row([handoff], justifyContent: FlexJustifyContent.end)));

    return new Card(
        child: new Container(
            child: new BlockBody([question, actions]),
            margin: style.Spacing.listItemMargin));
  }
}
