/*******************************************************************************
 * Copyright (c) 2012, 2018 Willink Transformations and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v20.html
 *
 * Contributors:
 *     E.D.Willink - initial API and implementation
 *******************************************************************************/
package org.eclipse.qvtd.doc.bigmde2016.tests;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.qvtd.doc.bigmde2016.tests.qvtc.Families.FamiliesFactory;
import org.eclipse.qvtd.doc.bigmde2016.tests.qvtc.Families.Family;
import org.eclipse.qvtd.doc.bigmde2016.tests.qvtc.Families.Member;

public class FamiliesGenerator
{ 
    public static @NonNull List<@NonNull ? extends EObject> createFamiliesModel(int nFamilies, int nMembersPerFamily) {
    	ThreadLocalRandom random = ThreadLocalRandom.current();
		List<Family> families = new ArrayList<Family>(nFamilies);
		List<Member> sons = new ArrayList<Member>();
		List<Member> daughters = new ArrayList<Member>();
		int membersToGo = nFamilies * (nMembersPerFamily-2);
		for (int f = 0; f < nFamilies; f++) {
			Family family = FamiliesFactory.eINSTANCE.createFamily();
			families.add(family);
			family.setLastName("family" + f);
			int familiesToGo = nFamilies-f;
			Member father = FamiliesFactory.eINSTANCE.createMember();
			father.setFirstName("father" + f);
			family.setFather(father);
			Member mother = FamiliesFactory.eINSTANCE.createMember();
			mother.setFirstName("mother" + f);
			family.setMother(mother);
			int nMembers = familiesToGo <= 1 ? membersToGo : (2 * random.nextInt(membersToGo+1) / familiesToGo);
			for (int m = 0; m < nMembers; m++) {
				Member member = FamiliesFactory.eINSTANCE.createMember();
				if (random.nextBoolean()) {
					family.getSons().add(member);
				}
				else {
					family.getDaughters().add(member);
				}
				member.setFirstName("member" + --membersToGo);
			}
//			int fatherIndex = random.nextInt(-10, sons.size());
//			if (fatherIndex >= 0) {
//				family.setFather(sons.get(fatherIndex));
//			}
//			int motherIndex = random.nextInt(-10, daughters.size());
//			if (motherIndex >= 0) {
//				family.setMother(daughters.get(motherIndex));
//			}
			sons.addAll(family.getSons());
			daughters.addAll(family.getDaughters());
		}
		assert 2*families.size() + sons.size() + daughters.size() == nFamilies * nMembersPerFamily;
		return families;
	}

	public static void garbageCollect() throws InterruptedException {
		for (int y = 0; y < 5; y++) {
			System.gc();
			Thread.sleep(100);
		}
	}
}
