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

library template_binding.src.binding_delegate;

import 'dart:html';
import 'package:template_binding/template_binding.dart' show TemplateInstance;

/**
 * Template Bindings native features enables a wide-range of use cases,
 * but (by design) don't attempt to implement a wide array of specialized
 * behaviors.
 *
 * Enabling these features is a matter of implementing and registering a
 * BindingDelegate. A binding delegate is an object which contains one or more
 * delegation functions which implement specialized behavior. This object is
 * registered via [TemplateBindExtension.bindingDelegate]:
 *
 * HTML:
 *     <template bind>
 *       {{ What!Ever('crazy')->thing^^^I+Want(data) }}
 *     </template>
 *
 * Dart:
 *     class MySyntax extends BindingDelegate {
 *       prepareBinding(path, name, node) {
 *         // The magic happens here!
 *       }
 *     }
 *     ...
 *     templateBind(query('template'))
 *         ..bindingDelegate = new MySyntax()
 *         ..model = new MyModel();
 *
 *
 * See
 * <http://www.polymer-project.org/platform/template.html#binding-delegate-api>
 * for more information about the binding delegate.
 */
// TODO(jmesserly): need better api docs here. The link above seems out of date.
abstract class BindingDelegate {
  /**
   * Prepares a binding. This is called immediately after parsing a mustache
   * token with `{{ path }}` in the context of the [node] and the property named
   * [name]. This should return a function that will be passed the actual
   * node and model, and either returns null or an object with a `value`
   * property. This allows the syntax to reinterpret the model for each binding.
   */
  PrepareBindingFunction prepareBinding(String path, String name, Node node)
      => null;

  /**
   * Returns a function that can optionally replace the model that will be
   * passed to [TemplateBindExtension.createInstance]. This can be used to
   * implement syntax such as `<template repeat="{{ item in items }}">` by
   * ensuring that the returned model has the "item" name available.
   */
  PrepareInstanceModelFunction prepareInstanceModel(Element template) => null;

  /**
   * Returns a function that will be called whenever the position of an item
   * inside this template changes.
   */
  PrepareInstancePositionChangedFunction prepareInstancePositionChanged(
      Element template) => null;
}

typedef PrepareBindingFunction(model, Node node, bool oneTime);

typedef PrepareInstanceModelFunction(model);

typedef PrepareInstancePositionChangedFunction(TemplateInstance instance,
    int index);
