var SynthSequence = require('./synth-sequence');
var CreateSynth = require('./create-synth');
var activeAudioContext = require("./active-audio-context");

function playEvent(midiPitches, midiGracePitches, millisecondsPerMeasure, soundFontUrl, debugCallback) {
	var sequence = new SynthSequence();

	for (var i = 0; i < midiPitches.length; i++) {
		var note = midiPitches[i];
		var trackNum = sequence.addTrack();
		sequence.setInstrument(trackNum, note.instrument);
		if (i === 0 && midiGracePitches) {
			for (var j = 0; j < midiGracePitches.length; j++) {
				var grace = midiGracePitches[j];
				sequence.appendNote(trackNum, grace.pitch, 1 / 64, grace.volume, grace.cents);
			}
		}
		sequence.appendNote(trackNum, note.pitch, note.duration, note.volume, note.cents);
	}

	var ac = activeAudioContext();
	if (ac.state === "suspended") {
		return ac.resume().then(function () {
			return doPlay(sequence, millisecondsPerMeasure, soundFontUrl, debugCallback);
		});
	} else {
		return doPlay(sequence, millisecondsPerMeasure, soundFontUrl, debugCallback);
	}
}

function doPlay(sequence, millisecondsPerMeasure, soundFontUrl, debugCallback) {
	var buffer = new CreateSynth();
	return buffer.init({
		sequence: sequence,
		millisecondsPerMeasure: millisecondsPerMeasure,
		options: { soundFontUrl: soundFontUrl },
		debugCallback: debugCallback,
	}).then(function () {
		return buffer.prime();
	}).then(function () {
		buffer.start();
		return Promise.resolve();
	});
}

module.exports = playEvent;
