// Copyright 2013 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.

// Example script to illustrate how to use the mdns package to discover services
// on the local network.

// ignore_for_file: avoid_print

import 'package:multicast_dns/multicast_dns.dart';

Future<void> main(List<String> args) async {
  if (args.isEmpty) {
    print('''
Please provide the name of a service as argument.

For example:
  dart mdns_sd.dart [--verbose] _workstation._tcp.local''');
    return;
  }

  final bool verbose = args.contains('--verbose') || args.contains('-v');
  final String name = args.last;
  final MDnsClient client = MDnsClient();
  await client.start();

  await for (final PtrResourceRecord ptr in client
      .lookup<PtrResourceRecord>(ResourceRecordQuery.serverPointer(name))) {
    if (verbose) {
      print(ptr);
    }
    await for (final SrvResourceRecord srv in client.lookup<SrvResourceRecord>(
        ResourceRecordQuery.service(ptr.domainName))) {
      if (verbose) {
        print(srv);
      }
      if (verbose) {
        await client
            .lookup<TxtResourceRecord>(ResourceRecordQuery.text(ptr.domainName))
            .forEach(print);
      }
      await for (final IPAddressResourceRecord ip
          in client.lookup<IPAddressResourceRecord>(
              ResourceRecordQuery.addressIPv4(srv.target))) {
        if (verbose) {
          print(ip);
        }
        print('Service instance found at '
            '${srv.target}:${srv.port} with ${ip.address}.');
      }
      await for (final IPAddressResourceRecord ip
          in client.lookup<IPAddressResourceRecord>(
              ResourceRecordQuery.addressIPv6(srv.target))) {
        if (verbose) {
          print(ip);
        }
        print('Service instance found at '
            '${srv.target}:${srv.port} with ${ip.address}.');
      }
    }
  }
  client.stop();
}
