import 'dart:async';
import 'package:analyzer/dart/element/element.dart';
import 'package:build/build.dart';
import 'package:build/src/builder/build_step.dart';
import 'package:code_builder/code_builder.dart';
import 'package:dsx/dsx.dart';
import 'package:jael/jael.dart' as jael;
import 'package:path/path.dart' as p;
import 'package:source_gen/source_gen.dart';

class DSXGenerator extends GeneratorForAnnotation<DSX> {
  @override
  FutureOr<String> generateForAnnotatedElement(
      Element element, ConstantReader annotation, BuildStep buildStep) async {
    var asset = buildStep.inputId;
    var template = annotation.peek('template')?.stringValue,
        templateUrl = annotation.peek('templateUrl')?.stringValue;
    Library lib;

    if (template != null) {
      lib = generateForDocument(
          jael.parseDocument(template, sourceUrl: asset.uri), element);
    } else if (templateUrl != null) {
      var id =
          new AssetId(asset.package, p.relative(templateUrl, from: asset.path));
      lib = generateForDocument(
          jael.parseDocument(await buildStep.readAsString(id),
              sourceUrl: asset.uri),
          element);
    } else {
      throw '@DSX() cannot be called without a `template` or `templateUrl`.';
    }

    return lib.accept(new DartEmitter()).toString();
  }

  Library generateForDocument(jael.Document document, ClassElement clazz) {}
}