/*global GlobalWarningManager: false*/

/**
 * Callback template
 * @param the overall construction being calculated.
 * @param the current (sub)construction being calculated.
 * @param the calculator object.
 * @param an object of argument to the callback function.
 */
function cb_template(construction, current_construction, calculator, args) { }

/**
 * Returns the value.
 */
function cb_retval(construction, current_construction, calculator, args)
{
	return args.value;
}

function cb_min_of_rows(construction, current_construction, calculator, args)
{
	var min_lifetime = Infinity;
	
	var subconstructions = construction.get_subconstructions();
	
	for (var i = 0; i < args.rows.length; i++) {
		if (args.rows[i] > subconstructions.length || args.rows[i] < 0)
			throw "Illegal argument to cb_min_of_rows: Row " + args.rows[i] + " does not exist.";
		var a_construction = (args.rows[i] == 0) ? construction : subconstructions[args.rows[i]-1];
		
		var lifetime = calculator.calculate_lifetime_real(a_construction);
		// Only add the correction if it is not the construction itself
		if (i != 0) {
			lifetime += a_construction.get_lifetime_correction();
		}
		
		min_lifetime = Math.min(min_lifetime, lifetime);
	}
	
	if (min_lifetime == 0 && args.message_on_zero != undefined) {
		cb_add_warning(construction, current_construction, calculator,
			{ message: args.message_on_zero } );
	}
	
	return min_lifetime;
}

function cb_min_of_rows_not_zero(construction, current_construction, calculator, args)
{
	var min_lifetime = Infinity;
	
	var subconstructions = construction.get_subconstructions();
	
	for (var i = 0; i < args.rows.length; i++) {
		if (args.rows[i] > subconstructions.length || args.rows[i] < 0)
			throw "Illegal argument to cb_min_of_rows: Row " + args.rows[i] + " does not exist.";
		var a_construction = (args.rows[i] == 0) ? construction : subconstructions[args.rows[i]-1];
		
		var lifetime = calculator.calculate_lifetime_real(a_construction) +
						a_construction.get_lifetime_correction();
		if (lifetime !== 0 && lifetime != undefined)
			min_lifetime = Math.min(min_lifetime, lifetime);
	}
	
	return min_lifetime;
}

function cb_add_warning(construction, current_construction, calculator, args)
{
	GlobalWarningManager.add_warning_for(construction.get_group().get_id(), construction.get_id(), args.message);
	return undefined;
}

function cb_numfloors(construction, current_construction, calculator, args)
{
	// If the work cost in one of the subconstructions is 0 the warning should be displayed.
	var should_display_error = false;
	var subconstructions = construction.get_subconstructions();
	for (var i = 0; i < subconstructions.length; i++) {
		if (subconstructions[i].get_work_cost() == 0) {
			should_display_error = true;
			break;
		}
	}
	
	if (should_display_error) {
		cb_add_warning(construction, current_construction, calculator, {
			"message": "Har du husket at tilføje stillads omkostninger?"
		});
	}
	return undefined;
}

function cb_maintaiance_percent_from_subconelement(construction, current_construction, calculator, args)
{
    var subcons = construction.get_subconstructions();
    var subcon = subcons[args.subconstruction];
    if (subcon == undefined) return undefined;
    
    // Dette er ikke særligt pænt, men vi har ikke andne mulighed med nuværende design...
    current_construction.get_data_facts().std_maintainance_percent = args.percents[subcon.get_active_element_id()];
    
    return undefined;
}

