// Copyright 2018 The Fuchsia 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 'package:logging/logging.dart';
import 'package:meta/meta.dart';
import 'package:fidl_fuchsia_logger/fidl_async.dart' as fidl_logger;
import 'package:fuchsia_services/services.dart';
import 'package:zircon/zircon.dart' as zircon;

import '_log_message.dart';
import '_log_writer.dart';

/// A concrete implementation of [LogWriter] which sends logs to
/// the fuchsia system logger. This log writer will buffer logs until
/// a connection has been established at which time it will send all
/// the buffered logs.
class FuchsiaLogWriter extends LogWriter {
  zircon.Socket _socket;

  /// Constructor
  FuchsiaLogWriter({@required Logger logger})
      : assert(logger != null),
        super(
          logger: logger,
          shouldBufferLogs: true,
        ) {
    _connectToSysLogger();
  }

  void _connectToSysLogger() {
    final proxy = fidl_logger.LogSinkProxy();
    StartupContext.fromStartupInfo().incoming.connectToService(proxy);

    final socketPair = zircon.SocketPair(zircon.Socket.DATAGRAM);
    proxy.connect(socketPair.second).then((_) {
      _socket = socketPair.first;
      startListening(onMessage);
    });
  }

  @override
  void onMessage(LogMessage message) => _socket.write(message.toBytes());
}
