public static <T extends Satellite> Satellite create(int id, Class<T> type, Planet primary) {

        PropertyManager pm = new PropertyManager("config.properties");
        Random rnd = new Random();
        double satelliteMass = pm.getDoubleProperty("min.Satellite.Mass") + (pm.getDoubleProperty("max.Satellite.Mass") - pm.getDoubleProperty("min.Satellite.Mass")) * rnd.nextDouble();

        if (type.getName().contains("NaturalSatellite")) {
            return new Satellite.Builder()
                    .id(id)
                    .name(NameGenerator.generate())
                    .mass(satelliteMass)
                    .population(rnd.nextInt(pm.getIntProperty("max.Satellite.Population")))
                    .mineralResources(Arrays.asList(MineralResource.values()[rnd.nextInt(MineralResource.values().length)]))
                    .buildNaturalSatellite(primary);
        }
        if (type.getName().contains("ArtificialSatellite")) {
            return new Satellite.Builder()
                    .id(id)
                    .name(NameGenerator.generate())
                    .mass(satelliteMass)
                    .inhabited(rnd.nextBoolean())
                    .electricCharge(rnd.nextInt(2000))
                    .energySource(EnergySource.values()[rnd.nextInt(EnergySource.values().length)])
                    .mineralResources(Arrays.asList(MineralResource.values()[rnd.nextInt(MineralResource.values().length)]))
                    .buildArtificialSatellite(primary);
        }
        return new ArtificialSatellite();
    }