/*
 * @author lsy
 * @date   2019-09-02
 **/
import 'package:analyzer/dart/element/element.dart';
import 'package:build/src/builder/build_step.dart';
import 'package:gmalpha_flutter/Annotations/anno/RouterCenter.dart';
import 'package:source_gen/source_gen.dart';

import '../RouterCenterRestore.dart';

class RouterCenterGenerator extends GeneratorForAnnotation<RouterCenter> {
  @override
  generateForAnnotatedElement(
      Element element, ConstantReader annotation, BuildStep buildStep) {
    StringBuffer buffer = new StringBuffer();
    StringBuffer importBuffer = new StringBuffer();
    StringBuffer annoBuffer = new StringBuffer();
    StringBuffer funBuffer = new StringBuffer();
    RouterCenterRestore().buildMap.forEach((f, s) {
      if (s.four) {
        buffer.write("map.putIfAbsent(\"${f}\", ()=>${s.second}());\n");
      }
      annoBuffer.write("//${s.second} is resign : ${s.four} \n");
      importBuffer.write("${s.first}${s.second}.dart\";\n");
      importBuffer.write("${s.first}${s.third}.dart\";\n");
      funBuffer.write("""
        ${s.third} find${s.third}(){
          if(map[\"${f}\"]==null){
            return null;
          }
          return map[\"${f}\"] as ${s.third};
        }
      """);
    });

    var pathSegments = buildStep.inputId.pathSegments;
    StringBuffer pathBuffer = new StringBuffer();
    for (int i = 0; i < pathSegments.length; i++) {
      if (pathSegments[i] != "lib" && i != pathSegments.length - 1) {
        pathBuffer.write(pathSegments[i] + "/");
      }
    }
    String sufPath = pathBuffer.toString();

    return """
    ${annoBuffer.toString()}
    ${importBuffer.toString()}
    import "${"package:${buildStep.inputId.package}/${sufPath}RouterCenterRestore.dart"}";
    import "${"package:${buildStep.inputId.package}/${sufPath}RouterBaser.dart"}";
      class RouterCenterImpl {
         
        Map<String,RouterBaser> map;
        
        factory RouterCenterImpl() => _sharedInstance();

        static RouterCenterImpl _instance;

        RouterCenterImpl._() {
          if (map == null) {
            map = new Map();
            init();
          } else {
            throw Exception("too many RouterCenter instance!!!  fix it ");
          }
        }

        static RouterCenterImpl _sharedInstance(){
          if (_instance == null) {
            _instance = RouterCenterImpl._();
          }
          return _instance;
        }

        void init(){
          ${buffer.toString()}
        }
        
        RouterBaser getModel(String modelName){
          return map[modelName];
        }
        
        ${funBuffer.toString()}
        
        
      }
      """;
  }
}