/*******************************************************************************
 * Copyright (c) 2020 Contributors to the Eclipse Foundation
 *
 * See the NOTICE file(s) distributed with this work for additional
 * information regarding copyright ownership.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/

package org.eclipse.mdm.api.atfxadapter;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;

import org.asam.ods.AoException;
import org.asam.ods.AoSession;
import org.asam.ods.ApplicationElement;
import org.asam.ods.InstanceElement;
import org.asam.ods.InstanceElementIterator;
import org.asam.ods.Relationship;

/**
 * @author akn
 *
 */
public class NameHelper {

	private static final Pattern PATTERN_TESTSTEP_ASAM_PATH = Pattern.compile(
			"\\/\\[Environment\\].+\\/\\[Project\\](.+)\\/\\[StructureLevel\\](.+)\\/\\[Test\\](.+)\\/\\[TestStep\\](.+)");

	private final AoSession aoSession;
	private final String compName;
	private final String attrName;

	private Map<String, String> asamAttrCache = new HashMap<>();

	/**
	 * @param aoSession
	 * @param property
	 * @throws AoException
	 */
	public NameHelper(AoSession aoSession, String compName, String attrName) throws AoException {
		super();
		this.aoSession = aoSession;
		this.compName = compName;
		this.attrName = attrName;
		initCache();

	}

	private void initCache() throws AoException {
		ApplicationElement testStep = this.aoSession.getApplicationStructure().getElementByName("TestStep");

		InstanceElementIterator testStepInstances = testStep.getInstances("*");

		List<InstanceElement> relatedIE = new ArrayList<>();

		for (InstanceElement ie : testStepInstances.nextN(testStepInstances.getCount())) {
			relatedIE.add(ie);
			relatedIE.addAll(getParentIntances(ie));
		}

		int i = 0;

	}

	private List<InstanceElement> getParentIntances(InstanceElement ie) throws AoException {
		List<InstanceElement> returnVal = new ArrayList<>();

		InstanceElementIterator ieIterator = ie.getRelatedInstancesByRelationship(Relationship.FATHER, "*");

		if (ieIterator != null && ieIterator.getCount() > 0) {
			for (InstanceElement ieParent : ieIterator.nextN(ieIterator.getCount())) {
				returnVal.add(ie);
				returnVal.addAll(getParentIntances(ie));
			}
		}

		return returnVal;
	}

}
