package nl.andrewlalis.crystalkeep.model;

import lombok.Getter;
import lombok.Setter;

import java.util.HashSet;
import java.util.Objects;
import java.util.Set;

@Getter
public class Cluster implements Comparable<Cluster> {
	@Setter
	private String name;
	private final Set<Shard> shards;
	private final Set<Cluster> clusters;
	@Setter
	private Cluster parent;

	public Cluster(String name, Set<Shard> shards, Set<Cluster> clusters, Cluster parent) {
		this.name = name;
		this.shards = shards;
		this.clusters = clusters;
		this.parent = parent;
	}

	public Cluster(String name) {
		this(name, new HashSet<>(), new HashSet<>(), null);
	}

	public void addShard(Shard shard) {
		this.shards.add(shard);
		shard.setCluster(this);
	}

	public void addCluster(Cluster cluster) {
		this.clusters.add(cluster);
		cluster.setParent(this);
	}

	@Override
	public int compareTo(Cluster o) {
		return this.getName().compareTo(o.getName());
	}

	@Override
	public boolean equals(Object o) {
		if (this == o) return true;
		if (o == null || getClass() != o.getClass()) return false;
		Cluster cluster = (Cluster) o;
		return getName().equals(cluster.getName()) && Objects.equals(getParent(), cluster.getParent());
	}

	@Override
	public int hashCode() {
		return Objects.hash(getName(), getParent());
	}

	@Override
	public String toString() {
		StringBuilder sb = new StringBuilder();
		sb.append("Cluster: name=\"").append(this.getName()).append("\"\nShards:\n");
		for (Shard s : this.getShards()) {
			sb.append('\t').append(s.toString()).append('\n');
		}
		sb.append("Nested clusters:\n");
		for (Cluster c : this.getClusters()) {
			sb.append('\n').append(c.toString()).append('\n');
		}
		return sb.toString();
	}
}