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

import 'package:fidl/fidl.dart';
import 'package:fidl_fuchsia_ledger/fidl.dart' as ledger;

import 'conflict_resolver.dart';

/// Class that resolves conflicts occuring on Ledger pages.
/// Assumes that all the Ledger pages are managed by Sledge.
class ConflictResolverFactory extends ledger.ConflictResolverFactory {
  // If setup has not started, [_setUpCompleted] is null.
  // Otherwise, [_setUpCompleted] contains whether the conflict resolver
  // factory as been succesfully set.
  static Completer<bool> _setUpCompleted;
  static final ledger.ConflictResolverFactoryBinding _factoryBinding =
      ledger.ConflictResolverFactoryBinding();

  final ledger.ConflictResolverBinding _conflictResolverBinding =
      ledger.ConflictResolverBinding();
  // The conflict resolver that resolves conflicts for all the pages.
  final ConflictResolver _conflictResolver = ConflictResolver();

  ConflictResolverFactory._internal();

  /// Registers a conflict resolver with [ledgerInstance].
  /// Returns whether the conflict resolver was succesfully registered.
  static Future<bool> setUpConflictResolver(ledger.Ledger ledgerInstance) {
    if (_setUpCompleted != null) {
      return _setUpCompleted.future;
    }
    _setUpCompleted = Completer<bool>();
    final wrapper =
        _factoryBinding.wrap(ConflictResolverFactory._internal());
    ledgerInstance.setConflictResolverFactory(wrapper, (ledger.Status status) {
      if (status != ledger.Status.ok) {
        throw Exception(
            'Sledge failed to SetConflictResolverFactory (status: $status).');
        _setUpCompleted.complete(false);
      } else {
        _setUpCompleted.complete(true);
      }
    });
    return _setUpCompleted.future;
  }

  @override
  void getPolicy(
      ledger.PageId pageId, void callback(ledger.MergePolicy policy)) {
    callback(ledger.MergePolicy.automaticWithFallback);
  }

  @override
  void newConflictResolver(ledger.PageId pageId,
      InterfaceRequest<ledger.ConflictResolver> resolver) {
    // TODO: check that [pageId] is a page managed by Sledge.
    _conflictResolverBinding.bind(_conflictResolver, resolver);
  }
}
