// 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.

// @dart = 2.9

import 'dart:ffi';

import 'package:ffi/ffi.dart';

import 'calloc.dart';
import 'coordinate.dart';
import 'dylib_utils.dart';

typedef NativeCoordinateOp = Pointer<Coordinate> Function(Pointer<Coordinate>);

typedef CoordinateTrice = Pointer<Coordinate> Function(
    Pointer<NativeFunction<NativeCoordinateOp>>, Pointer<Coordinate>);

typedef BinaryOp = int Function(int, int);
typedef NativeIntptrBinOp = IntPtr Function(IntPtr, IntPtr);
typedef NativeIntptrBinOpLookup = Pointer<NativeFunction<NativeIntptrBinOp>>
    Function();

typedef NativeApplyTo42And74Type = IntPtr Function(
    Pointer<NativeFunction<NativeIntptrBinOp>>);

typedef ApplyTo42And74Type = int Function(
    Pointer<NativeFunction<NativeIntptrBinOp>>);

int myPlus(int a, int b) {
  print("myPlus");
  print(a);
  print(b);
  return a + b;
}

main() {
  print('start main');

  DynamicLibrary ffiTestFunctions =
      dlopenPlatformSpecific("ffi_test_functions");

  {
    // Pass a c pointer to a c function as an argument to a c function.
    Pointer<NativeFunction<NativeCoordinateOp>> transposeCoordinatePointer =
        ffiTestFunctions.lookup("TransposeCoordinate");
    Pointer<NativeFunction<CoordinateTrice>> p2 =
        ffiTestFunctions.lookup("CoordinateUnOpTrice");
    CoordinateTrice coordinateUnOpTrice = p2.asFunction();
    final c1 = calloc<Coordinate>()
      ..ref.x = 10.0
      ..ref.y = 20.0;
    c1.ref.next = c1;
    Coordinate result = coordinateUnOpTrice(transposeCoordinatePointer, c1).ref;
    print(result.runtimeType);
    print(result.x);
    print(result.y);
    calloc.free(c1);
  }

  {
    // Return a c pointer to a c function from a c function.
    Pointer<NativeFunction<NativeIntptrBinOpLookup>> p14 =
        ffiTestFunctions.lookup("IntptrAdditionClosure");
    NativeIntptrBinOpLookup intptrAdditionClosure = p14.asFunction();

    Pointer<NativeFunction<NativeIntptrBinOp>> intptrAdditionPointer =
        intptrAdditionClosure();
    BinaryOp intptrAddition = intptrAdditionPointer.asFunction();
    print(intptrAddition(10, 27));
  }

  {
    Pointer<NativeFunction<NativeIntptrBinOp>> pointer =
        Pointer.fromFunction(myPlus, 0);
    print(pointer);

    Pointer<NativeFunction<NativeApplyTo42And74Type>> p17 =
        ffiTestFunctions.lookup("ApplyTo42And74");
    ApplyTo42And74Type applyTo42And74 = p17.asFunction();

    int result = applyTo42And74(pointer);
    print(result);
  }

  print("end main");
}
