// 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.dart';
import 'package:meta/meta.dart';

import 'func.dart' show Parameter;
import 'type.dart';
import 'utils.dart';
import 'writer.dart';

/// A simple typedef, Expands to -
///
/// ```dart
/// typedef $name = $returnType Function(
///   $parameter1...,
///   $parameter2...,
///   .
///   .
/// );
/// ```
/// Return/Parameter types can be of for C/Dart signarture depending on [typedefType].
///
/// Note: re-set [name] after resolving name conflicts.
class Typedef {
  String name;
  String dartDoc;
  final Type returnType;
  final TypedefType typedefType;
  final List<Parameter> parameters;

  Typedef({
    @required this.name,
    this.dartDoc,
    @required this.returnType,
    @required this.typedefType,
    List<Parameter> parameters,
  }) : parameters = parameters ?? [];

  /// Returns the [Typedef] dependencies required by this typedef including itself.
  List<Typedef> getDependencies() {
    final dep = <Typedef>[];
    for (final p in parameters) {
      final base = p.type.getBaseType();
      if (base.broadType == BroadType.NativeFunction) {
        dep.addAll(base.nativeFunc.getDependencies());
      }
    }
    dep.add(this);
    return dep;
  }

  String toTypedefString(Writer w) {
    final s = StringBuffer();
    if (dartDoc != null) {
      s.write(makeDartDoc(dartDoc));
    }
    final typedefName = name;
    final paramNamer = UniqueNamer({});
    if (typedefType == TypedefType.C) {
      s.write('typedef $typedefName = ${returnType.getCType(w)} Function(\n');
      for (final p in parameters) {
        final name = p.name.isNotEmpty ? paramNamer.makeUnique(p.name) : p.name;
        s.write('  ${p.type.getCType(w)} ${name},\n');
      }
      s.write(');\n\n');
    } else {
      s.write(
          'typedef $typedefName = ${returnType.getDartType(w)} Function(\n');
      for (final p in parameters) {
        final name = p.name.isNotEmpty ? paramNamer.makeUnique(p.name) : p.name;

        s.write('  ${p.type.getDartType(w)} ${name},\n');
      }
      s.write(');\n\n');
    }

    return s.toString();
  }
}

enum TypedefType { C, Dart }
