// 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 'dart:convert';
import 'dart:io' hide Directory;

import 'package:file/file.dart';
import 'package:process/process.dart';

import '../src/common.dart';
import 'test_data/basic_project.dart';
import 'test_driver.dart';
import 'test_utils.dart';

void main() {
  late Directory tempDir;
  late Process daemonProcess;

  setUp(() async {
    tempDir = createResolvedTempDirectorySync('daemon_mode_test.');
  });

  tearDown(() async {
    tryToDelete(tempDir);
    daemonProcess.kill();
  });

  testWithoutContext('device.getDevices', () async {
    final BasicProject project = BasicProject();
    await project.setUpIn(tempDir);

    final String flutterBin = fileSystem.path.join(getFlutterRoot(), 'bin', 'flutter');

    const ProcessManager processManager = LocalProcessManager();
    daemonProcess = await processManager.start(
      <String>[flutterBin, ...getLocalEngineArguments(), '--show-test-device', 'daemon'],
      workingDirectory: tempDir.path,
    );

    final StreamController<String> stdout = StreamController<String>.broadcast();
    transformToLines(daemonProcess.stdout).listen((String line) => stdout.add(line));
    final Stream<Map<String, Object?>?> stream = stdout
      .stream
      .map<Map<String, Object?>?>(parseFlutterResponse)
      .where((Map<String, Object?>? value) => value != null);

    Map<String, Object?> response = (await stream.first)!;
    expect(response['event'], 'daemon.connected');

    // start listening for devices
    daemonProcess.stdin.writeln('[${jsonEncode(<String, dynamic>{
      'id': 1,
      'method': 'device.enable',
    })}]');
    response = (await stream.firstWhere((Map<String, Object?>? json) => json!['id'] == 1))!;
    expect(response['id'], 1);
    expect(response['error'], isNull);

    // [{"event":"device.added","params":{"id":"flutter-tester","name":
    //   "Flutter test device","platform":"flutter-tester","emulator":false}}]
    response = (await stream.first)!;
    expect(response['event'], 'device.added');

    // get the list of all devices
    daemonProcess.stdin.writeln('[${jsonEncode(<String, dynamic>{
      'id': 2,
      'method': 'device.getDevices',
    })}]');
    // Skip other device.added events that may fire (desktop/web devices).
    response = (await stream.firstWhere((Map<String, Object?>? response) => response!['event'] != 'device.added'))!;
    expect(response['id'], 2);
    expect(response['error'], isNull);

    final dynamic result = response['result'];
    expect(result, isList);
    expect(result, isNotEmpty);
  });
}
