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

import 'package:ffigen/src/code_generator/typedef.dart';

import 'binding.dart';
import 'binding_string.dart';
import 'type.dart';
import 'utils.dart';
import 'writer.dart';

/// A binding to a global variable
///
/// For a C global variable -
/// ```c
/// int a;
/// ```
/// The generated dart code is -
/// ```dart
/// final int a = _dylib.lookup<ffi.Int32>('a').value;
/// ```
class Global extends LookUpBinding {
  final Type type;

  Global({
    String? usr,
    String? originalName,
    required String name,
    required this.type,
    String? dartDoc,
  }) : super(
          usr: usr,
          originalName: originalName,
          name: name,
          dartDoc: dartDoc,
        );

  List<Typedef>? _typedefDependencies;
  @override
  List<Typedef> getTypedefDependencies(Writer w) {
    if (_typedefDependencies == null) {
      _typedefDependencies = <Typedef>[];

      // Add typedef's required by the variable's type.
      final valueType = type.getBaseType();
      if (valueType.broadType == BroadType.NativeFunction) {
        _typedefDependencies!.addAll(valueType.nativeFunc!.getDependencies());
      }
    }
    return _typedefDependencies!;
  }

  @override
  BindingString toBindingString(Writer w) {
    final s = StringBuffer();
    final globalVarName = name;
    if (dartDoc != null) {
      s.write(makeDartDoc(dartDoc!));
    }
    final pointerName = w.wrapperLevelUniqueNamer.makeUnique('_$globalVarName');
    final dartType = type.getDartType(w);
    final cType = type.getCType(w);
    final refOrValue = type.broadType == BroadType.Struct ? 'ref' : 'value';

    s.write(
        "late final ${w.ffiLibraryPrefix}.Pointer<$dartType> $pointerName = ${w.dylibIdentifier}.lookup<$cType>('$originalName');\n\n");
    s.write('$dartType get $globalVarName => $pointerName.$refOrValue;\n\n');
    if (type.broadType != BroadType.Struct) {
      s.write(
          'set $globalVarName($dartType value) => $pointerName.value = value;\n\n');
    }

    return BindingString(type: BindingStringType.global, string: s.toString());
  }
}
