// Copyright (c) 2019, 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.

// Requirements=nnbd

@JS()
library js_interop_test;

import 'dart:_foreign_helper' as helper show JS;
import 'dart:_interceptors' as interceptors;
import 'dart:_runtime' as dart;
import 'dart:js' show context;

import 'package:expect/expect.dart';
import 'package:js/js.dart';

@JS()
class Console {
  @JS()
  external void log(arg);
}

@JS('console')
external Console get console;

@JS('console.log')
external Function get _log;

@JS('console.log')
external void log(String s);

String dartStaticMethod() => 'hello';

@JS('jsStaticVariable')
external Function? get _jsStaticVariable;

@JS('jsStaticVariable')
external set _jsStaticVariable(Function? f);

@JS('jsStaticVariable')
external void jsStaticVariable(String s);

@JS('jsStaticFunction')
external Function get _jsStaticFunction;

@JS('jsStaticFunction')
external set _jsStaticFunction(Function f);

@JS('jsStaticFunction')
external void jsStaticFunction(String Function() f);

@JS()
class SomeClass {
  external factory SomeClass(String Function() f);
  external set jsFunctionFieldSetter(String Function() f);
  external void Function(String Function() f) get jsFunctionFieldGetter;
  external String jsInstanceMethod(String Function() f);

  external NestedJs get jsNonFunctionField;
}

@JS()
@anonymous
class NestedJs {
  external factory NestedJs({required String Function() constructorArg});
  external String get stringField;
}

@JS('someClass')
external set _someClass(dynamic s);
@JS('someClass')
external SomeClass get someClass;

void main() {
  Function(String) jsFunc = helper.JS('', '(x) => {}');
  Expect.equals(dart.assertInterop(jsFunc), jsFunc);

  Expect.equals(dart.assertInterop(_log), _log);
  Expect.equals(dart.assertInterop(console.log), console.log);
  Expect.throws(() => dart.assertInterop(dartStaticMethod));

  Expect.isNull(_jsStaticVariable);
  _jsStaticVariable = jsFunc;
  Expect.isNotNull(_jsStaticVariable);
  Expect.equals(dart.assertInterop(_jsStaticVariable), _jsStaticVariable);

  final dynamic wrappedDartStaticMethod = allowInterop(dartStaticMethod);

  final Function localNonNullLegacy = () => 'hello';
  final String Function() localNonNull = () => 'hello';
  final Function? localNullableLegacy = () => 'hello';
  final String Function()? localNullable = () => 'hello';

  // Assignment to JS static field.
  Expect.throws(() {
    _jsStaticVariable = () => 'hello';
  });
  Expect.throws(() {
    _jsStaticVariable = dartStaticMethod;
  });
  Expect.throws(() {
    _jsStaticVariable = localNonNullLegacy;
  });
  Expect.throws(() {
    _jsStaticVariable = localNonNull;
  });
  Expect.throws(() {
    _jsStaticVariable = localNullableLegacy!;
  });
  Expect.throws(() {
    _jsStaticVariable = localNullable!;
  });
  _jsStaticVariable = allowInterop(dartStaticMethod);
  _jsStaticVariable = wrappedDartStaticMethod;

  // Argument to static JS function.
  Function(Function(String), String) jsFunc2 = helper.JS('', '(f) => f()');
  _jsStaticFunction = jsFunc2;
  Expect.throws(() {
    jsStaticFunction(() => 'hello');
  });
  Expect.throws(() {
    jsStaticFunction(dartStaticMethod);
  });
  Expect.throws(() {
    jsStaticFunction(localNonNullLegacy as String Function());
  });
  Expect.throws(() {
    jsStaticFunction(localNonNull);
  });
  Expect.throws(() {
    jsStaticFunction(localNullableLegacy as String Function());
  });
  Expect.throws(() {
    jsStaticFunction(localNullable!);
  });
  jsStaticFunction(allowInterop(() => 'hello'));
  jsStaticFunction(wrappedDartStaticMethod);

  // Argument to torn off static JS function
  dynamic method = jsStaticFunction;
  Expect.throws(() {
    method(() => 'hello');
  });
  Expect.throws(() {
    method(dartStaticMethod);
  });
  Expect.throws(() {
    method(localNonNullLegacy);
  });
  Expect.throws(() {
    method(localNonNull);
  });
  Expect.throws(() {
    method(localNullableLegacy!);
  });
  Expect.throws(() {
    method(localNullable!);
  });
  method(allowInterop(() => 'hello'));
  method(wrappedDartStaticMethod);

  // Assignment to instance field.
  _someClass = helper.JS(
      '',
      '{"jsInstanceMethod": function(f) {return f();}, '
          '"jsNonFunctionField": {"stringField":"hello js"}, '
          '"jsFunctionFieldGetter": function(f) {return f();}}');
  Expect.throws((() {
    someClass.jsFunctionFieldSetter = () => 'hello';
  }));
  Expect.throws((() {
    someClass.jsFunctionFieldSetter = dartStaticMethod;
  }));
  Expect.throws((() {
    someClass.jsFunctionFieldSetter = localNonNullLegacy as String Function();
  }));
  Expect.throws((() {
    someClass.jsFunctionFieldSetter = localNonNull;
  }));
  Expect.throws((() {
    someClass.jsFunctionFieldSetter = localNullableLegacy as String Function();
  }));
  Expect.throws((() {
    someClass.jsFunctionFieldSetter = localNullable!;
  }));
  someClass.jsFunctionFieldSetter = allowInterop(() => 'hello');
  someClass.jsFunctionFieldSetter = wrappedDartStaticMethod;

  // Argument to instance method.
  Expect.throws(() {
    someClass.jsInstanceMethod(() => 'hello');
  });
  Expect.throws(() {
    someClass.jsInstanceMethod(dartStaticMethod);
  });
  Expect.throws(() {
    someClass.jsInstanceMethod(localNonNullLegacy as String Function());
  });
  Expect.throws(() {
    someClass.jsInstanceMethod(localNonNull);
  });
  Expect.throws(() {
    someClass.jsInstanceMethod(localNullableLegacy as String Function());
  });
  Expect.throws(() {
    someClass.jsInstanceMethod(localNullable!);
  });
  someClass.jsInstanceMethod(allowInterop(() => 'hello'));
  someClass.jsInstanceMethod(wrappedDartStaticMethod);

  // Argument to  constructor.
  context.callMethod('eval', ['function SomeClass(a) { a(); }']);
  Expect.throws(() {
    SomeClass(() => 'hello');
  });
  Expect.throws(() {
    SomeClass(dartStaticMethod);
  });
  Expect.throws(() {
    SomeClass(localNonNullLegacy as String Function());
  });
  Expect.throws(() {
    SomeClass(localNonNull);
  });
  Expect.throws(() {
    SomeClass(localNullableLegacy as String Function());
  });
  Expect.throws(() {
    SomeClass(localNullable!);
  });
  SomeClass(allowInterop(() => 'hello'));
  SomeClass(wrappedDartStaticMethod);

  // Argument to anonymous constructor.
  Expect.throws(() {
    NestedJs(constructorArg: () => 'hello');
  });
  Expect.throws(() {
    NestedJs(constructorArg: dartStaticMethod);
  });
  Expect.throws(() {
    NestedJs(constructorArg: localNonNullLegacy as String Function());
  });
  Expect.throws(() {
    NestedJs(constructorArg: localNonNull);
  });
  Expect.throws(() {
    NestedJs(constructorArg: localNullableLegacy as String Function());
  });
  Expect.throws(() {
    NestedJs(constructorArg: localNullable!);
  });
  NestedJs(constructorArg: allowInterop(() => 'hello'));
  NestedJs(constructorArg: wrappedDartStaticMethod);

  // Argument to torn off instance method.
  method = someClass.jsInstanceMethod;
  Expect.throws(() {
    method(() => 'hello');
  });
  Expect.throws(() {
    method(dartStaticMethod);
  });
  Expect.throws(() {
    method(localNonNullLegacy);
  });
  Expect.throws(() {
    method(localNonNull);
  });
  Expect.throws(() {
    method(localNullableLegacy!);
  });
  Expect.throws(() {
    method(localNullable!);
  });
  method(allowInterop(() => 'hello'));
  method(wrappedDartStaticMethod);

  // Function typed getter
  Expect.throws(() {
    someClass.jsFunctionFieldGetter(() => 'hello');
  });
  Expect.throws(() {
    someClass.jsFunctionFieldGetter(dartStaticMethod);
  });
  Expect.throws(() {
    someClass.jsFunctionFieldGetter(localNonNullLegacy as String Function());
  });
  Expect.throws(() {
    someClass.jsFunctionFieldGetter(localNonNull);
  });
  Expect.throws(() {
    someClass.jsFunctionFieldGetter(localNullableLegacy as String Function());
  });
  Expect.throws(() {
    someClass.jsFunctionFieldGetter(localNullable!);
  });
  someClass.jsFunctionFieldGetter(allowInterop(() => 'hello'));
  someClass.jsFunctionFieldGetter(wrappedDartStaticMethod);

  // Stored Function typed getter
  method = someClass.jsFunctionFieldGetter;
  // We lose safety after calling a getter that returns a function, which takes
  // a function as an argument. Since this can be modeled with a method, instead
  // of a getter returning a function, we don't expect this is a pattern likely
  // to show up in real code.
  //Expect.throws(() {
  //  method(() => 'hello');
  //});
  //Expect.throws(() {
  //  method(dartStaticMethod);
  //});
  //Expect.throws(() {
  //  method(localNonNullLegacy);
  //});
  //Expect.throws(() {
  //  method(localNonNull);
  //});
  //Expect.throws(() {
  //  method(localNullableLegacy as String Function());
  //});
  //Expect.throws(() {
  //  method(localNullable!);
  //});
  method(allowInterop(() => 'hello'));
  method(wrappedDartStaticMethod);

  // Non-function fields
  Expect.equals('hello js', someClass.jsNonFunctionField.stringField,
      'Does not wrap access to a field');

  // No such method errors from interop calls.
  // The current behavior is that DDC does not treat these errors from the
  // JavaScript side as a LegacyJavaScriptObject.
  Expect.throwsNoSuchMethodError(
      () => context.callMethod('eval', ['self.foo()']));
  Expect.throws<interceptors.JSNoSuchMethodError>(
      () => context.callMethod('eval', ['self.foo()']));
  var error = Expect.throws(() => context.callMethod('eval', ['self.foo()']));
  Expect.notType<interceptors.LegacyJavaScriptObject>(error);
  Expect.notEquals(interceptors.LegacyJavaScriptObject, error.runtimeType);
  Expect.throwsNoSuchMethodError(
      () => context.callMethod('eval', ['self.foo.bar()']));
  Expect.throws<interceptors.JSNoSuchMethodError>(
      () => context.callMethod('eval', ['self.foo.bar()']));
  error = Expect.throws(() => context.callMethod('eval', ['self.foo.bar()']));
  Expect.notType<interceptors.LegacyJavaScriptObject>(error);
  Expect.notEquals(interceptors.LegacyJavaScriptObject, error.runtimeType);
}
