package com.spaceshipproject;

/**
 * Calcule la taille effective d'un spaceship en fonction de son niveau.
 *
 * Regle :
 *   - level 1 = taille de creation
 *   - chaque level-up alterne +1 sur x puis +1 sur z (x en premier)
 *   - tous les 4 level-ups : +1 sur y
 *   - les valeurs sont plafonnees a la taille maximale configuree.
 */
public final class ShipSizing {

    private ShipSizing() {}

    /** Renvoie [sizeX, sizeY, sizeZ] pour le niveau donne. */
    public static int[] sizeForLevel(ConfigManager cfg, int level) {
        if (level < 1) level = 1;
        int additions = level - 1;
        int xAdds = (additions + 1) / 2; // ceil(additions / 2)
        int zAdds = additions / 2;
        int yAdds = additions / 4;

        int sx = clamp(cfg.defaultSizeX() + xAdds, cfg.defaultSizeX(), cfg.maxSizeX());
        int sy = clamp(cfg.defaultSizeY() + yAdds, cfg.defaultSizeY(), cfg.maxSizeY());
        int sz = clamp(cfg.defaultSizeZ() + zAdds, cfg.defaultSizeZ(), cfg.maxSizeZ());
        return new int[]{sx, sy, sz};
    }

    /** Niveau a partir duquel toutes les dimensions atteignent leur max. */
    public static int maxUsefulLevel(ConfigManager cfg) {
        int xLevels = (cfg.maxSizeX() - cfg.defaultSizeX()) * 2;        // x = ceil(adds/2)
        int zLevels = (cfg.maxSizeZ() - cfg.defaultSizeZ()) * 2 + 1;    // z = floor(adds/2)
        int yLevels = (cfg.maxSizeY() - cfg.defaultSizeY()) * 4;
        return 1 + Math.max(Math.max(xLevels, zLevels), yLevels);
    }

    private static int clamp(int v, int min, int max) { return Math.max(min, Math.min(max, v)); }
}
