// Copyright (c) 2016, 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 js_backend.serialization;

import '../common/backend_api.dart' show
    BackendSerialization;
import '../elements/elements.dart';
import '../serialization/serialization.dart' show
    DeserializerPlugin,
    ObjectDecoder,
    ObjectEncoder,
    SerializerPlugin;
import '../serialization/keys.dart';
import 'js_backend.dart';

const String _BACKEND_DATA_TAG = 'jsBackendData';

class JavaScriptBackendSerialization implements BackendSerialization {
  final JavaScriptBackendSerializer serializer;
  final JavaScriptBackendDeserializer deserializer;

  JavaScriptBackendSerialization(JavaScriptBackend backend)
      : serializer = new JavaScriptBackendSerializer(backend),
        deserializer = new JavaScriptBackendDeserializer(backend);
}

class JavaScriptBackendSerializer implements SerializerPlugin {
  final JavaScriptBackend backend;

  JavaScriptBackendSerializer(this.backend);

  @override
  void onElement(Element element, ObjectEncoder createEncoder(String tag)) {
    // TODO(johnniwinther): Add more data, e.g. js-interop names, native tags,
    // etc.
    String nativeName = backend.nativeData.nativeMemberName[element];
    if (nativeName != null) {
      ObjectEncoder encoder = createEncoder(_BACKEND_DATA_TAG);
      encoder.setString(Key.NAME, nativeName);
    }
  }
}

class JavaScriptBackendDeserializer implements DeserializerPlugin {
  final JavaScriptBackend backend;

  JavaScriptBackendDeserializer(this.backend);

  @override
  void onElement(Element element, ObjectDecoder getDecoder(String tag)) {
    ObjectDecoder decoder = getDecoder(_BACKEND_DATA_TAG);
    if (decoder != null) {
      String nativeName = decoder.getString(Key.NAME);
      backend.nativeData.nativeMemberName[element] = nativeName;
    }
  }
}

