// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// @dart = 2.9

part of swarmlib;

/**
 * The base class for UI state that intends to support browser history.
 */
abstract class UIState {
  /**
   * The event listener we hook to the window's "popstate" event.
   * This event is triggered by the back button or by the first page load.
   */
  StreamSubscription _historyTracking;

  UIState();

  void startHistoryTracking() {
    stopHistoryTracking();

    bool firstEvent = true;
    var handler = EventBatch.wrap((event) {
      String state = window.location.hash;
      if (state.startsWith('#')) {
        // TODO(jimhug): Support default argument on substring.
        state = state.substring(1, state.length);
      }

      if (firstEvent && state != '') {
        // TODO(jmesserly): When loading a bookmark or refreshing, we replace
        // the app state with a clean app state so the back button works. It
        // would be better to support jumping to the previous story.
        // We'd need to do some history manipulation here and some fixes to
        // the views for this.
        window.history.replaceState(null, document.title, '#');
      } else if (state != '') {
        loadFromHistory(jsonDecode(state));
      }
      firstEvent = false;
    });

    _historyTracking = window.onPopState.listen(handler);
  }

  void stopHistoryTracking() {
    if (_historyTracking != null) {
      _historyTracking.cancel();
    }
  }

  /** Pushes a state onto the browser history stack */
  void pushToHistory() {
    if (_historyTracking == null) {
      throw 'history tracking not started';
    }

    String state = jsonEncode(toHistory());

    // TODO(jmesserly): [state] should be an Object, and we should pass it to
    // the state parameter instead of as a #hash URL. Right now we're working
    //  around b/4582542.
    window.history
        .pushState(null, '${document.title}', '${document.title}#$state');
  }

  /**
   * Serialize the state to a form suitable for storing in browser history.
   */
  Map<String, String> toHistory();

  /**
   * Load the UI state from the given [values].
   */
  void loadFromHistory(Map<String, String> values);
}
