// Copyright (c) 2013, 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.

part of app;

abstract class LocationManager extends Observable {
  final _initialPath = '/vm';
  ObservatoryApplication _app;

  String _lastUrl;

  void _init(ObservatoryApplication app) {
    // Called once.
    assert(_app == null);
    _app = app;
    // Register for history events.
    window.onPopState.listen(_onLocationChange);
    _onStartup();
  }

  void _onStartup();
  void _onLocationChange(PopStateEvent event);

  void _pushUrl(String url) {
    if (_lastUrl != url) {
      Logger.root.info('Navigated to ${url}');
      window.history.pushState(url, document.title, url);
      _lastUrl = url;
    }
  }

  /// Go to a specific url.
  void go(String url) {
    if (_app.vm == null) {
      url = makeLink('/vm-connect/');
    }
    _pushUrl(url);
    _go(url);
  }

  void _go(String url) {
    // Chop off leading '#'.
    if (url.startsWith('#')) {
      url = url.substring(1);
    }
    // Fall through handles '#/'
    // Chop off leading '/'.
    if (url.startsWith('/')) {
      url = url.substring(1);
    }
    var args;
    // Parse out arguments.
    if (url.contains('#')) {
      var chunks = url.split('#');
      url = chunks[0];
      if ((chunks.length > 1) && (chunks[1] != '')) {
        args = chunks[1];
      }
    }
    _app._visit(url, args);
  }

  /// Go back.
  void back() {
    window.history.go(-1);
  }

  /// Go forward.
  void forward() {
    window.history.go(1);
  }

  /// Handle clicking on an application url link.
  void onGoto(MouseEvent event, var detail, Element target) {
    var href = target.attributes['href'];
    if (event.button > 0 || event.metaKey || event.ctrlKey ||
        event.shiftKey || event.altKey) {
      // Not a left-click or a left-click with a modifier key:
      // Let browser handle.
      return;
    }
    go(href);
    event.preventDefault();
  }

  /// Given an application url, generate a link.
  String makeLink(String url);
}

/// Uses location.hash to encode application urls.
class HashLocationManager extends LocationManager {
  void _onStartup() {
    String initialPath = '${window.location.hash}';
    if ((window.location.hash == '') || (window.location.hash == '#')) {
      initialPath = '#${_initialPath}';
    }
    window.history.pushState(initialPath, document.title, initialPath);
    _go(window.location.hash);
  }

  void _onLocationChange(PopStateEvent _) {
    _go(window.location.hash);
  }

  /// Given an application url, generate a link for an anchor tag.
  String makeLink(String url) {
    return '#$url';
  }
}

/// Uses location.pathname to encode application urls. Requires server side
/// rewriting to support copy and paste linking. pub serve makes this hard.
/// STATUS: Work in progress.
class LinkLocationManager extends LocationManager {
  void _onStartup() {
    Logger.root.warning('Using untested LinkLocationManager');
    String initialPath = window.location.pathname;
    if ((window.location.pathname == '/index.html') ||
        (window.location.pathname == '/')) {
      initialPath = '/vm';
    }
    window.history.replaceState(initialPath, document.title, initialPath);
    _go(window.location.pathname);
  }

  void _onLocationChange(PopStateEvent _) {
    _go(window.location.pathname);
  }

  /// Given an application url, generate a link for an anchor tag.
  String makeLink(String url) => url;
}
