// 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 'dart:async';

import 'dart:math';
import 'dart:typed_data';

import 'package:flutter/services.dart' as services;

import '../models/all.dart' as model;
import '../stores/store.dart';

import 'loader.dart';

// DemoLoader loads some sample decks and slides and randomly adds/removes
// decks based on a timer.
class DemoLoader implements Loader {
  final Store _store;
  final Random _rand;

  DemoLoader()
      : _store = new Store.singleton(),
        _rand = new Random();

  static const int numDeckSets = 2;
  Stream<model.Deck> _getSampleDecks() async* {
    for (var i = 1; i <= numDeckSets; i++) {
      yield new model.Deck('baku$i', 'Baku Discovery Discussion #$i',
          await _getRawBytes('assets/images/sample_decks/baku/thumb.png'));
      yield new model.Deck('pitch$i', 'Pitch Deck #$i',
          await _getRawBytes('assets/images/sample_decks/pitch/thumb.png'));
      yield new model.Deck('vanadium$i', 'Vanadium #$i',
          await _getRawBytes('assets/images/sample_decks/vanadium/thumb.png'));
    }
  }

  Stream<model.Slide> _getSampleSlides() async* {
    // TODO(aghassemi): We need different slides for different decks.
    // For now use Vanadium slides for all.
    for (var i = 1; i <= 6; i++) {
      yield new model.Slide(
          await _getRawBytes('assets/images/sample_decks/vanadium/$i.jpg'));
    }
  }

  Future loadDecks() async {
    // Add some initial decks.
    await for (var deck in _getSampleDecks()) {
      await _addDeck(deck);
    }

    // Periodically add or remove random decks.
    new Timer.periodic(new Duration(seconds: 2), (_) async {
      var decks = await _store.getAllDecks();
      var deckKeys = decks.map((d) => d.key);
      var removeDeck = _rand.nextBool();

      if (removeDeck && decks.length > 0) {
        var rIndex = _rand.nextInt(decks.length);
        // Never delete the first deck so we can safely use it for slideshow
        if (rIndex >= 1) {
          _store.removeDeck(decks[rIndex].key);
        }
      } else {
        await for (var deck in _getSampleDecks()) {
          if (!deckKeys.contains(deck.key)) {
            await _addDeck(deck);
            break;
          }
        }
      }
    });
  }

  Future _addDeck(model.Deck deck) async {
    await _store.addDeck(deck);
    List<model.Slide> slides = await _getSampleSlides().toList();
    await _store.setSlides(deck.key, slides);
  }

  Map<String, Uint8List> _assetCache = new Map<String, Uint8List>();
  Future<Uint8List> _getRawBytes(String url) async {
    if (_assetCache.containsKey(url)) {
      return _assetCache[url];
    }
    services.Response response = await services.fetchBody(url);
    var bytes = new Uint8List.fromList(response.body.buffer.asUint8List());
    _assetCache[url] = bytes;
    return bytes;
  }
}
