// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'dart:collection';

/// Parsing the output of "dart pub deps --json"
///
/// expected structure: {"name": "package name", "source": "hosted", "dependencies": [...]}
class DartDependencyPackage {
  DartDependencyPackage({
    required this.name,
    required this.version,
    required this.source,
    required this.dependencies,
  });

  factory DartDependencyPackage.fromHashMap(dynamic packageInfo) {
    String name = '';
    String version = '';
    String source = '';
    List<dynamic> dependencies = <dynamic>[];

    if (packageInfo is LinkedHashMap) {
      final LinkedHashMap<String, dynamic> info = packageInfo as LinkedHashMap<String, dynamic>;
      if (info.containsKey('name')) {
        name = info['name'] as String;
      }
      if (info.containsKey('version')) {
        version = info['version'] as String;
      }
      if (info.containsKey('source')) {
        source = info['source'] as String;
      }
      if (info.containsKey('dependencies')) {
        dependencies = info['dependencies'] as List<dynamic>;
      }
    }
    return DartDependencyPackage(
      name: name,
      version: version,
      source: source,
      dependencies: dependencies.map((dynamic e) => e.toString()).toList(),
    );
  }

  final String name;
  final String version;
  final String source;
  final List<String> dependencies;

}

class DartPubJson {
  DartPubJson(this._json);
  final LinkedHashMap<String, dynamic> _json;
  final List<DartDependencyPackage> _packages = <DartDependencyPackage>[];

  List<DartDependencyPackage> get packages {
    if (_packages.isNotEmpty) {
      return _packages;
    }
    if (_json.containsKey('packages')) {
      final List<dynamic> packagesInfo = _json['packages'] as List<dynamic>;
      for (final dynamic info in packagesInfo) {
        _packages.add(DartDependencyPackage.fromHashMap(info));
      }
    }
    return _packages;
  }
}