'use strict';

const global = require('./global');
let io = global.io;

module.exports = class Station {
	constructor(id, data) {
		this.nsp = io.of('/' + id);
		this.nsp.on('connection', socket => {
			console.info('someone connected');
		});
		this.id = id;
		this.data = data;

		this.playlist = data.playlist;
		this.currentSong = this.playlist[0];
		this.currentSongIndex = data.currentSongIndex;
		this.paused = data.paused;
		this.locked = data.locked;
		this.skipVotes = data.skipVotes;
		this.users = data.users;
		this.displayName = data.displayName;
		this.description = data.description;
		this.timer = undefined;
	}

	skipSong() {
		if (this.playlist.length > 0) {
			if (this.timer !== undefined) this.timer.pause();

			if (this.currentSongIndex+1 < this.playlist.length) this.currentSongIndex++;
			else this.currentSongIndex = 0;

			this.skipVotes = 0;
			this.currentSong = this.playlist[this.currentSongIndex];

			this.timer = new global.Timer(() => {
				console.log("Skip!");
				self.skipSong();
			}, this.currentSong.duration, this.paused);

			nsp.emit("skippedSong", this.currentSong);
		}
	}

	toggleVoteSkip(userId) {
		if (this.skipVotes.indexOf(userId) === -1) this.skipVotes.push(userId);
		else this.skipVotes = this.skipVotes.splice(this.skipVotes.indexOf(userId), 1);

		// TODO: Calculate if enough people voted to skip
		nsp.emit("voteSkip", this.skipVotes);
	}

	retrievePlaylist() {
		// TODO: get the Playlist for this station using db
	}

	pause() {
		if (!this.paused) {
			this.paused = true;
			this.timer.pause();
			nsp.emit("pause");
		}
	}

	unPause() {
		if (this.paused) {
			this.paused = false;
			this.timer.resume();
			nsp.emit("unpause");
		}
	}

	isPaused() {
		return this.paused;
	}

	getCurrentSong() {
		return this.currentSong;
	}

	lock() {
		if (!this.locked) {
			this.locked = true;
			nsp.emit("lock");
		}
	}

	unlock() {
		if (this.locked) {
			this.locked = false;
			nsp.emit("unlocked");
		}
	}

	isLocked() {
		return this.locked;
	}

	updateDisplayName(newDisplayName) {
		// TODO: Update db
		this.displayName = newDisplayName;
		nsp.emit("updateDisplayName", newDisplayName);
	}

	updateDescription(newDescription) {
		// TODO: Update db
		this.description = newDescription;
		nsp.emit("updateDescription", newDescription);
	}

	getId() {
		return this.id;
	}

	getDisplayName() {
		return this.displayName;
	}

	getDescription() {
		return this.description;
	}

	addUser(user) {
		this.users.add(user);
		nsp.emit("updateUsers", this.users);
	}

	removeUser(user) {
		this.users.splice(this.users.indexOf(user), 1);
		nsp.emit("updateUsers", this.users);
	}

	getUsers() {
		return this.users;
	}

}