// 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.

part of store;

// Defines all possible actions that the application can perform.
abstract class AppActions {
  //////////////////////////////////////
  // Decks

  // Adds a new deck.
  Future addDeck(model.Deck deck);

  // Removes a deck given its key.
  Future removeDeck(String key);

  // Loads a deck from SdCard.
  Future loadDeckFromSdCard();

  // Sets the slides for a deck.
  Future setSlides(String deckKey, List<model.Slide> slides);

  // Sets the current slide number for a deck.
  Future setCurrSlideNum(String deckId, int slideNum);

  //////////////////////////////////////
  // Presentation

  // Joins an advertised presentation.
  Future joinPresentation(model.PresentationAdvertisement presentation);

  // Starts a presentation.
  Future<model.PresentationAdvertisement> startPresentation(String deckId);

  // Stops the given presentation.
  Future stopPresentation(String presentationId);

  // If viewer has started navigating on their own, this will align the navigation
  // back up with the presentation.
  Future followPresentation(String deckId);

  // Adds a question to a specific slide within a presentation.
  Future askQuestion(String deckId, int slideNum, String questionText);

  // Sets the driver of a presentation to the given user.
  Future setDriver(String deckId, model.User driver);

  //////////////////////////////////////
  // Blobs

  // Stores the given blob bytes under the given key.
  Future putBlob(String key, List<int> bytes);

  // Gets the blob bytes for the given key.
  Future<List<int>> getBlob(String key);
}
