// Copyright (c) 2014, 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 'dart:async';
import 'dart:convert';

import 'package:pub_semver/pub_semver.dart';

import '../language_version.dart';
import '../package_name.dart';
import '../pubspec.dart';
import '../source.dart';
import '../system_cache.dart';

/// A [Null Object] that represents a source not recognized by pub.
///
/// It provides some default behavior so that pub can work with sources it
/// doesn't recognize.
///
/// [null object]: http://en.wikipedia.org/wiki/Null_Object_pattern
class UnknownSource extends Source {
  @override
  final String name;

  UnknownSource(this.name);

  /// Two unknown sources are the same if their names are the same.
  @override
  bool operator ==(other) => other is UnknownSource && other.name == name;

  @override
  int get hashCode => name.hashCode;

  @override
  PackageRef parseRef(
    String name,
    Object? description, {
    String? containingDir,
    LanguageVersion? languageVersion,
  }) =>
      PackageRef(name, UnknownDescription(description, this));

  @override
  PackageId parseId(String name, Version version, Object? description,
          {String? containingDir}) =>
      PackageId(name, version,
          ResolvedUnknownDescription(UnknownDescription(description, this)));

  @override
  Future<List<PackageId>> doGetVersions(
          PackageRef ref, Duration? maxAge, SystemCache cache) =>
      throw UnsupportedError(
          "Cannot get package versions from unknown source '$name'.");

  @override
  Future<Pubspec> doDescribe(PackageId id, SystemCache cache) =>
      throw UnsupportedError(
          "Cannot describe a package from unknown source '$name'.");

  /// Returns the directory where this package can be found locally.
  @override
  String doGetDirectory(
    PackageId id,
    SystemCache cache, {
    String? relativeFrom,
  }) =>
      throw UnsupportedError(
          "Cannot find a package from an unknown source '$name'.");
}

class UnknownDescription extends Description {
  final Object? description;
  @override
  final UnknownSource source;
  UnknownDescription(this.description, this.source);

  @override
  String format() {
    return json.encode(description);
  }

  @override
  Object? serializeForPubspec({
    required String? containingDir,
    required LanguageVersion languageVersion,
  }) {
    throw UnsupportedError(
        "Cannot serialize a package description from an unknown source '${source.name}'.");
  }

  @override
  operator ==(Object other) =>
      other is UnknownDescription &&
      source.name == other.source.name &&
      json.encode(description) == json.encode(other.description);

  @override
  int get hashCode => Object.hash(source.name, json.encode(description));
}

class ResolvedUnknownDescription extends ResolvedDescription {
  ResolvedUnknownDescription(UnknownDescription description)
      : super(description);

  @override
  Object? serializeForLockfile({required String? containingDir}) {
    throw UnsupportedError(
        "Cannot serialize a package description from an unknown source '${description.source.name}'.");
  }

  @override
  operator ==(Object other) =>
      other is ResolvedUnknownDescription && description == other.description;

  @override
  int get hashCode => description.hashCode;
}
