// 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:async';

import 'package:dds/dap.dart' hide DapServer;

import '../base/file_system.dart';
import '../base/platform.dart';
import '../debug_adapters/flutter_adapter.dart';
import '../debug_adapters/flutter_adapter_args.dart';
import 'flutter_test_adapter.dart';

/// A DAP server that communicates over a [ByteStreamServerChannel], usually constructed from the processes stdin/stdout streams.
///
/// The server is intended to be single-use. It should live only for the
/// duration of a single debug session in the editor, and terminate when the
/// user stops debugging. If a user starts multiple debug sessions
/// simultaneously it is expected that the editor will start multiple debug
/// adapters.
class DapServer {
  DapServer(
    Stream<List<int>> input,
    StreamSink<List<int>> output, {
    required FileSystem fileSystem,
    required Platform platform,
    this.ipv6 = false,
    this.enableDds = true,
    this.enableAuthCodes = true,
    bool test = false,
    this.logger,
    void Function(Object? e)? onError,
  }) : channel = ByteStreamServerChannel(input, output, logger) {
    adapter = test
        ? FlutterTestDebugAdapter(
            channel,
            fileSystem: fileSystem,
            platform: platform,
            ipv6: ipv6,
            enableDds: enableDds,
            enableAuthCodes: enableAuthCodes,
            logger: logger,
            onError: onError,
          )
        : FlutterDebugAdapter(
            channel,
            fileSystem: fileSystem,
            platform: platform,
            enableDds: enableDds,
            enableAuthCodes: enableAuthCodes,
            logger: logger,
            onError: onError,
          );
  }

  final ByteStreamServerChannel channel;
  late final DartDebugAdapter<FlutterLaunchRequestArguments, FlutterAttachRequestArguments> adapter;
  final bool ipv6;
  final bool enableDds;
  final bool enableAuthCodes;
  final Logger? logger;

  void stop() {
    channel.close();
  }
}
