# rocher.py
"""Classe Rocher — obstacle infranchissable pour le jeu Bucheron - NSI Première"""

import pygame
import random
from constantes import *


class Rocher:
    """Obstacle infranchissable sur la carte.

    Le rocher bloque le joueur mais peut être contourné (glissement).
    Il est généré une seule fois et ne change jamais d'état.
    """

    def __init__(self, x: int, y: int):
        self.x     = x
        self.y     = y
        self.rayon = RAYON_ROCHER

        # Variations pour un rendu naturel
        self._var_forme = random.uniform(0.85, 1.18)   # rapport largeur / hauteur
        self._var_angle = random.uniform(0, 360)        # rotation visuelle (polygone)
        self._nb_cotes  = random.randint(6, 9)          # entre 6 et 9 côtés
        self._pts       = self._calculer_points()

    # ── Construction du polygone irrégulier ───────────────────────────
    def _calculer_points(self) -> list:
        """Génère les sommets du polygone rocailleux une seule fois."""
        import math
        pts = []
        for i in range(self._nb_cotes):
            angle = math.radians(self._var_angle + i * 360 / self._nb_cotes)
            # Légère irrégularité du rayon pour chaque sommet
            r = self.rayon * self._var_forme * random.uniform(0.78, 1.10)
            pts.append((self.x + r * math.cos(angle),
                        self.y + r * math.sin(angle) * 0.70))   # aplati verticalement
        return pts

    # ── Dessin ─────────────────────────────────────────────────────────
    def dessiner(self, surface: pygame.Surface) -> None:
        """Dessine le rocher avec relief (ombre, face, reflet)."""
        # Ombre portée décalée vers le bas-droite
        pts_ombre = [(x + 5, y + 5) for x, y in self._pts]
        ombre = pygame.Surface(
            (self.rayon * 3, self.rayon * 3), pygame.SRCALPHA)
        pts_locaux = [(x - self.x + self.rayon * 1.5 + 5,
                       y - self.y + self.rayon * 1.5 + 5)
                      for x, y in self._pts]
        pygame.draw.polygon(ombre, (0, 0, 0, 55), pts_locaux)
        surface.blit(ombre, (self.x - self.rayon * 1.5,
                              self.y - self.rayon * 1.5))

        # Corps principal du rocher
        pygame.draw.polygon(surface, GRIS_ROCHER,       self._pts)
        pygame.draw.polygon(surface, GRIS_ROCHER_FONCE, self._pts, 2)

        # Reflet clair en haut à gauche (source de lumière)
        if len(self._pts) >= 3:
            cx = int(self.x - self.rayon * 0.28)
            cy = int(self.y - self.rayon * 0.30)
            pygame.draw.circle(surface, GRIS_ROCHER_CLAIR, (cx, cy),
                                int(self.rayon * 0.30))

        # Petites veines / fissures
        import math
        for i in range(2):
            angle = math.radians(30 + i * 90 + self._var_angle)
            x1 = int(self.x + math.cos(angle) * self.rayon * 0.15)
            y1 = int(self.y + math.sin(angle) * self.rayon * 0.15 * 0.70)
            x2 = int(self.x + math.cos(angle) * self.rayon * 0.65)
            y2 = int(self.y + math.sin(angle) * self.rayon * 0.65 * 0.70)
            pygame.draw.line(surface, GRIS_ROCHER_FONCE, (x1, y1), (x2, y2), 1)
