wx.chart.markings = wx.chart.markings || {};

/* BarData Implementations */

wx.chart.markings.BarData = function(left, markings, right) {
	this.left = left;
	this.markings = markings;
	this.right = right;
};

wx.chart.markings.BarData.prototype.getLabel = function() {
	return this.left;
};

wx.chart.markings.BarData.prototype.getMarkings = function() {
	return this.markings;
};

wx.chart.markings.BarData.prototype.getExtra = function() {
	return this.right;
};

wx.chart.markings.BarData.prototype.getChildren = function () {
	return [];
};

wx.chart.markings.BuffBarData = function(data) {
	this.data = data;
	
	// init global combat log
	this.renderer = new wol.cl.Renderer(combatLog);
	
	// merge data
	this.mergeLog();
	this.renderer = new wol.cl.Renderer(combatLog);
};

wx.chart.markings.BuffBarData.query = function(actorId, spellId, isSource, callback) {
	var req = $.extend({}, report.timeInfo);
	req.actorId = actorId;
	req.spellId = spellId;
	req.isSource = isSource;
	
	$.getJSON('/reports/' + report.sid + '/d/aura/', req, 
			function(data) { 
				callback(new wx.chart.markings.BuffBarData(data)); 
			});
};

/* Merge actors & events from json response into main log */
wx.chart.markings.BuffBarData.prototype.mergeLog = function() {
	var data = this.data;
	
	for (var i = 0; i < data.combatLog.length; i++) {
		var row = data.combatLog[i];
		combatLog.entries[row[0]] = row;
	}
	for (i = 0; i < data.actors.length; i++) {
		var a = data.actors[i];
		combatLog.actors[a.id] = a;
		combatLog.uids[a.uid] = a;
	}
	for (i = 0; i < data.flaggedActors.length; i++) {
		var fa = data.flaggedActors[i];
		combatLog.flaggedActors[fa.id] = fa;
	}
	for (i = 0; i < data.events.length; i++) {
		var e = data.events[i];
		combatLog.events[e.id] = e;
	}
	for (i = 0; i < data.spells.length; i++) {
		var s = data.spells[i];
		combatLog.spells[s.id] = s;
	}
	
};

/* Label left */
wx.chart.markings.BuffBarData.prototype.getLabel = function() {
	var spell = this.renderer.fs(combatLog.spells[this.data.buffUptime.spellId]);
	var actor = this.renderer.formatActor(combatLog.uids[this.data.buffUptime.actorId]);
	
	if (this.data.buffUptime.isSource)
		return actor + "'s " + spell;
	else
		return spell + " on " + actor;
};

/* Markings */
wx.chart.markings.BuffBarData.prototype.getMarkings = function() {
	if (!this.markings) {
		/* Summed marking */
		
		var markings = [];
		
		for (var i = 0; i < this.data.buffUptime.rows.length; i++) {
			var ms = this.getSubMarkings(this.data.buffUptime.rows[i]);
			for (var j = 0; j < ms.length; j++) {
				markings.push(ms[j]);
			}
		}
		
		this.markings = markings;
	}
	
	return this.markings;
};

/* Right label */
wx.chart.markings.BuffBarData.prototype.getExtra = function() {
	return (this.data.buffUptime.uptime / 1000.0).toFixed(1);
};

/* Child bars */
wx.chart.markings.BuffBarData.prototype.getChildren = function() {
	var bars = [];
	
	for (var i = 0; i < this.data.buffUptime.rows.length; i++) {
		var row = this.data.buffUptime.rows[i];
		var label = this.renderer.formatActor(combatLog.actors[row.actorId]);
		var data = (row.uptime / 1000.0).toFixed(1);
		var markings = this.getSubMarkings(row);
		
		bars.push(new wx.chart.markings.BarData(label, markings, data));
	}
	
	return bars;
};

wx.chart.markings.BuffBarData.prototype.getSubMarkings = function(row) {
	var rows = row.rows;
	var stack = 0;
	var markings = [];
	var prevLine = null;
	
	for (var i = 0; i < rows.length; i++) {
		var line = combatLog.entries[rows[i]];
		var event = combatLog.events[line[4]];
		var currentStack = 0;
		
		switch (event.subType) {
		case 1:
			currentStack = 1;
			break;
		case 2:
		case 4:
			currentStack = event.amount;
			break;
		case 6:
			currentStack = stack > 0 ? stack : 1;
			break;
		}
		
		// console.log(event.type, event.subType, currentStack, event);
		
		if (currentStack != stack && stack > 0) {
			// draw segment, from last stack to currentStack
			// label with Lifebloom(stack), time - time
			var spellName = this.renderer.fs(combatLog.spells[this.data.buffUptime.spellId]);
			
			var marking = {
				// label data
				startLine: prevLine[0],
				endLine: line[0],
				
				// flot style marking data
				xaxis: { from: report.startTime + prevLine[1], to: report.startTime + line[1] },
				color: "rgba(0, 255, 0, " + (stack / 5) + ")",
				
				// time for sorting
				time: prevLine[1],
				
				spellName: spellName,
				stack: stack,
				isSource: this.data.buffUptime.isSource,
				actorName: this.renderer.formatActor(combatLog.actors[row.actorId]),
				
				lineWidth: 1
			};
			
			marking.renderer = wx.chart.markings.BuffBarData.getMarkingRenderer(marking);
			markings.push(marking);
		}
		
		stack = currentStack;
		prevLine = line;
	}
	
	return markings;
};

wx.chart.markings.BuffBarData.renderMarking = function(obj) {
	if (obj.isSource)
		return obj.spellName + " (" + obj.stack + ") on " + obj.actorName;
	else
		return obj.actorName + "'s " + obj.spellName + " (" + obj.stack + ")";
};

wx.chart.markings.BuffBarData.getMarkingRenderer = function(obj) {
	return function() {
		return wx.chart.markings.BuffBarData.renderMarking(obj);
	};
}
