package model;

import java.util.Random;

public class Tile {
    private TerrainType[] terrains;  // 2 terrains maximum par tuile
    private int segmentsForTerrain1;  // Nombre de segments pour le premier terrain
    private static final Random random = new Random();
    private int rotation;

    public Tile() {
        this.terrains = new TerrainType[2];  // Seulement deux terrains
        generateTerrains();
        assignSegments();
        this.rotation = 0;  // Rotation initiale à 0
    }

    // Méthode pour tourner la tuile dans le sens des aiguilles d'une montre
    public void rotateClockwise() {
        rotation = (rotation + 1) % 6;  // Modulo 6 pour garder une rotation entre 0 et 5
    }

    // Méthode pour obtenir la rotation actuelle
    public int getRotation() {
        return rotation;
    }

    // Génère deux terrains aléatoires pour la tuile
    private void generateTerrains() {
        terrains[0] = generateRandomTerrain();
        terrains[1] = generateRandomTerrain();

        // Assure que les deux terrains sont différents
        while (terrains[0] == terrains[1]) {
            terrains[1] = generateRandomTerrain();
        }
    }

    // Assigner le nombre de segments pour chaque terrain avec plus de diversité
    private void assignSegments() {
        // Terrain 1 occupe entre 1 et 5 segments, le reste pour le terrain 2
        this.segmentsForTerrain1 = random.nextInt(5) + 1;
    }

    // Génère un terrain aléatoire avec plus de variété dans les probabilités
    private TerrainType generateRandomTerrain() {
        int rand = random.nextInt(100);

        if (rand < 15) {
            return TerrainType.MER;       // 15% MER
        } else if (rand < 30) {
            return TerrainType.CHAMP;     // 15% CHAMP
        } else if (rand < 50) {
            return TerrainType.PRE;       // 20% PRE
        } else if (rand < 75) {
            return TerrainType.FORET;     // 25% FORET
        } else {
            return TerrainType.MONTAGNE;  // 25% MONTAGNE
        }
    }

    public TerrainType getTerrain(int index) {
        if (index >= 0 && index < 2) {
            return terrains[index];
        }
        return null;
    }

    public int getSegmentsForTerrain(int index) {
        if (index == 0) {
            return segmentsForTerrain1;  // Nombre de segments pour le premier terrain
        } else {
            return 6 - segmentsForTerrain1;  // Le reste pour le second terrain
        }
    }
}
