import {ChangeListShareInfo} from './SharingAdaptor';
import {ChangeError, ChangeRecord, ChangeRecordIterator} from './ChangeModel';
import {Subject} from 'rxjs/Subject';

/**
 * Created by Papa on 1/1/2016.
 */

export interface SharedChangeList {

	shareInfo: ChangeListShareInfo;

	loadFromRecord( changeRecord: ChangeRecord ): Promise<ChangeRecordIterator>;
	addChanges( changeRecords: ChangeRecord[] ): Promise<void>;
	errorSubject(): Subject<ChangeError>;
	changesAddedRemotelySubject(): Subject<ChangeRecordIterator>;

}

export class ArrayChangeRecordIterator implements ChangeRecordIterator {

	length: number;

	constructor(
		private changeRecords: ChangeRecord[],
		private nextIndex = 0
	) {
		this.length = changeRecords.length;
	}

	next(): ChangeRecord {
		if (!this.hasNext()) {
			throw 'No more change records found';
		}
		let nextValue = this.changeRecords[this.nextIndex];
		this.nextIndex++;

		return nextValue;
	}

	hasNext(): boolean {
		return this.nextIndex < this.length;
	}

}