library angel_mustache;

import 'package:angel_framework/angel_framework.dart';
import 'package:file/file.dart';
import 'package:mustache4dart/mustache4dart.dart' show render;
import 'package:path/path.dart' as p;
import 'src/cache.dart';
import 'src/mustache_context.dart';

mustache(Directory viewsDirectory,
    {String fileExtension: '.mustache', String partialsPath: './partials'}) {
  Directory partialsDirectory = viewsDirectory.fileSystem
      .directory(p.join(p.fromUri(viewsDirectory.uri), partialsPath));

  MustacheContext context =
      new MustacheContext(viewsDirectory, partialsDirectory, fileExtension);

  MustacheViewCache cache = new MustacheViewCache(context);

  return (Angel app) async {
    app.viewGenerator = (String name, [Map data]) async {
      var partialsProvider;
      partialsProvider = (String name) {
        String template = cache.getPartialSync(name, app);
        return render(template, data ?? {}, partial: partialsProvider);
      };

      String viewTemplate = await cache.getView(name, app);
      return await render(viewTemplate, data ?? {}, partial: partialsProvider);
    };
  };
}