//
// Verify that all assigned configuration parameters are valid.
//
BOOL ManagerList::InvalidSetup( BOOL &invalidSpecOK )
{
	int		m, w;
	Manager	*mgr;
	Worker	*wkr;
	BOOL	nonidle_worker_with_targets = FALSE;
	BOOL	all_workers_idle = TRUE;

	// Verify that at least one spec was assigned, even if Idle.
	if ( !GetMaxAccessSpecCount() )
	{
		ErrorMessage( "You must assign at least one access specification "
			"to a worker." );
		return TRUE;
	}

	// We need to loop through all workers of all managers to verify
	// their assigned specs are valid.
	for ( m = 0; m < ManagerCount(); m++ )
	{
		mgr = GetManager( m );
		if ( mgr->InvalidSetup( invalidSpecOK ) ) {
			return TRUE;
		}

		// Verify that at least one worker has targets assigned with a
		// non-idle spec or all specs are idle.
		for ( w = 0; w < mgr->WorkerCount(); w++ )
		{
			wkr = mgr->GetWorker( w );

			// Keep track if all workers have only the idle spec.
			if ( wkr->AccessSpecCount() != wkr->IdleAccessSpecCount() )
			{
				all_workers_idle = FALSE;

				// Keep track if any non-idle worker has targets.
				if ( wkr->TargetCount() )
					nonidle_worker_with_targets = TRUE;
			}
		}
	}

	// Verify that at least one worker has targets assigned with a
	// non-idle spec or all specs are idle.
	if ( !all_workers_idle && !nonidle_worker_with_targets )
	{
		ErrorMessage( "If no worker has targets selected, then all workers "
			"must have the idle spec assigned." );
		return TRUE;
	}

	return FALSE;
}