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

import 'package:yaml/yaml.dart';

import 'action.dart';
import 'conductor.dart';
import 'syllabus.dart';
import 'syllabus_parser.dart';

/// A builder for assembling a [Conductor]. Abstracts away details surrounding
/// the [Roster] and [Syllabus].
class ConductorBuilder {
  final Roster _roster = new Roster();
  final File _syllabusFile;

  /// Constructs a builder with a [Syllabus] at the specified [File].
  ConductorBuilder(this._syllabusFile);

  /// Adds a [Blueprint] to be used by the [Conductor].
  void addBlueprint(Blueprint blueprint) => _roster.add(blueprint);

  /// Builds the [Conductor].
  Future<Conductor> build() {
    Completer<Conductor> completer = new Completer<Conductor>();

    _syllabusFile.readAsString().then((String config) {
      final Syllabus syllabus = SyllabusParser.parse(loadYamlDocuments(config));
      completer.complete(new Conductor(syllabus, _roster));
    });

    return completer.future;
  }
}
