from django.db import models
from django.conf import settings

COLORS = ["red", "green", "yellow", "blue"]

class LudoGame(models.Model):
    STATUS_CHOICES = [("waiting","Waiting"),("playing","Playing"),("finished","Finished")]
    
    creator      = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="ludo_created")
    players      = models.ManyToManyField(settings.AUTH_USER_MODEL, through="LudoPlayer", related_name="ludo_games")
    status       = models.CharField(max_length=20, choices=STATUS_CHOICES, default="waiting")
    max_players  = models.IntegerField(default=4)
    stake        = models.IntegerField(default=0)
    winner       = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, on_delete=models.SET_NULL, related_name="ludo_wins")
    
    # Game state
    turn_order   = models.JSONField(default=list)   # [user_id, ...]
    current_idx  = models.IntegerField(default=0)
    dice_value   = models.IntegerField(default=0)
    dice_rolled  = models.BooleanField(default=False)  # has current player rolled?
    consecutive_sixes = models.IntegerField(default=0)
    
    # Board: positions of all tokens
    # tokens[color] = [pos1, pos2, pos3, pos4]
    # pos: -1 = base, 0-56 = main track, 57-62 = home column, 63 = home
    tokens       = models.JSONField(default=dict)
    
    # Color assignments: {user_id: color}
    color_map    = models.JSONField(default=dict)
    
    created_at   = models.DateTimeField(auto_now_add=True)
    updated_at   = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ["-created_at"]

class LudoPlayer(models.Model):
    game     = models.ForeignKey(LudoGame, on_delete=models.CASCADE, related_name="player_states")
    user     = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    color    = models.CharField(max_length=10)
    is_bot   = models.BooleanField(default=False)
    finished = models.BooleanField(default=False)  # all tokens home
    
    class Meta:
        unique_together = [("game","user")]
