package com.example.portfolio3;

// origin: <https://moodle.ruc.dk/course/section.php?id=211877>

import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;

/// foo
public abstract class AbstractGraph implements Graph {

	/// foo
	AbstractGraph() { }

	/// foo
	private HashMap<String, Vertex> vertexMap = new HashMap<>();

	/// foo
	private HashSet<Vertex> vertexSet = new HashSet<>();

	/// foo
	/// @param s  foo
	/// @return   Vertex
	public final Vertex vertex(final String s) {
		if (vertexMap.containsKey(s)) {
			return vertexMap.get(s);
		}
		Vertex v = new Vertex(s);
		vertexMap.put(s, v);
		vertexSet.add(v);

		return v;
	}

	/// foo
	public final void insertEdge(
		final String v, final String u, final int w
	) {
		insertEdge(vertex(v), vertex(u), w);
	}

	/// foo
	public final Collection<Vertex> vertices() {
		return vertexSet;
	}

	/// foo
	/// @param v1  foo
	/// @param v2  foo
	/// @param w   foo
	public abstract void insertEdge(Vertex v1, Vertex v2, int w);

	/// foo
	public abstract Collection<Edge> edges();

	/// foo
	public abstract Collection<Edge> outEdge(Vertex v);

	/// foo
	public abstract Integer getWeight(Vertex v1, Vertex v2);
}