from django.db import models
from django.contrib.auth.models import User
import uuid
# Create your models here.
# User.add_to_class('profiles',  models.FileField(upload_to='uploads/', null=True, blank=True, default="../static/dummy.png"))

from django.utils import timezone
import json

class Profiles(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='user_profiles')

    name = models.CharField(max_length=255, null=True)
    phone = models.CharField(max_length=255, null=True)
    email = models.CharField(max_length=255, null=True)
    address = models.CharField(max_length=255, null=True)
    servicename = models.CharField(max_length=255, null=True)
    
    gender = models.CharField(max_length=255, null=True)
    profiles = models.FileField(upload_to='uploads/', null=True, blank=True, default="../static/dummy.png")

    password = models.CharField(max_length=255, null=True)
    gstnumber = models.CharField(max_length=255, null=True)
    pincode = models.CharField(max_length=255, null=True)


    doj = models.DateField(null=True)
    
    gst = models.FileField(upload_to='uploads/', null=True, blank=True)
    companylogo = models.FileField(upload_to='uploads/', null=True, blank=True)
    alteremail = models.CharField(max_length=255, null=True)
    alteremail1 = models.CharField(max_length=255, null=True)
    alteremail2 = models.CharField(max_length=255, null=True)


    pan = models.FileField(upload_to='uploads/', null=True, blank=True)
    role = models.SmallIntegerField(default=0)



    status = models.SmallIntegerField(default=1)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = 'profile'



class Client(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='clients')

    client_name = models.CharField(max_length=255, null=True, blank=True)
    phone = models.CharField(max_length=20, null=True, blank=True)
    email = models.EmailField(max_length=255, null=True, blank=True)
    address = models.TextField(null=True, blank=True)
    aadhar = models.CharField(max_length=50, null=True, blank=True)
    pan = models.CharField(max_length=10, null=True, blank=True)
    doj = models.CharField(max_length=10, null=True, blank=True)

    remarks = models.TextField(null=True, blank=True)

    status = models.SmallIntegerField(default=1)  # 1 = Active, 0 = Inactive
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = 'client'



class Student(models.Model):
    # கோச் அல்லது அட்மின் தகவல்
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='students')
    photo = models.FileField(upload_to='uploads/', null=True, blank=True, default="../static/dummy.png")
    monthly_fees = models.DecimalField(max_digits=10, decimal_places=3, default=0.00)



    # Frontend-ல் உள்ள அதே பெயர்கள்
    studentName = models.CharField(max_length=255, null=True, blank=True)
    parentName = models.CharField(max_length=255, null=True, blank=True)
    mobilenumber = models.CharField(max_length=20, null=True, blank=True)
    age = models.CharField(max_length=10, null=True, blank=True) # Frontend-ல் TextInput என்பதால் CharField
    address = models.TextField(null=True, blank=True)
    
    # Class Type - ["Normal", "Special"] என வரும் டேட்டாவை String-ஆகச் சேமிக்க
    CLASS_TYPE_CHOICES = (
    (1, 'Normal'),
    (2, 'Special'),
    (3, 'Both'),
    )

    classType = models.IntegerField(choices=CLASS_TYPE_CHOICES)
    # Date of Joining
    dateOfJoining = models.CharField(max_length=20, null=True, blank=True)

    # Status & Logistics
    status = models.SmallIntegerField(default=1)  # 1 = Active, 0 = Inactive
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = 'student'



class Otp(models.Model):
    email = models.CharField(max_length=255, null=True)
    status = models.SmallIntegerField(default=1)
    otp = models.CharField(max_length=6, blank=True)
    otp_created_at = models.DateTimeField(blank=True, null=True)

    class Meta:
        db_table = 'otp'
        ordering = ['pk']



class Team(models.Model):
    name         = models.CharField(max_length=100)
    short_name   = models.CharField(max_length=10, blank=True, null=True)   # e.g. "BSC", "RCB"
    logo_emoji   = models.CharField(max_length=10, default="🏏")            # ICC style emoji logo
    logo_color   = models.CharField(max_length=20, default="#1565C0")       # team colour (hex)
    home_ground  = models.CharField(max_length=150, blank=True, null=True)
    captain_name = models.CharField(max_length=100, blank=True, null=True)
    status       = models.IntegerField(default=1)   # 1=Active, 0=Inactive
    created_at   = models.DateTimeField(auto_now_add=True)
    updated_at   = models.DateTimeField(auto_now=True)
 
    class Meta:
        ordering = ['-created_at']



class Player(models.Model):
 
    ROLE_CHOICES = [
        ('BAT',  'Batsman'),
        ('BOWL', 'Bowler'),
        ('ALL',  'All-Rounder'),
        ('WK',   'Wicket Keeper'),
    ]
 
    team         = models.ForeignKey(
                       'Team',                     # Team model ForeignKey
                       on_delete=models.CASCADE,   # team delete ஆனா players-உம் delete ஆகும்
                       related_name='players',
                   )
    name         = models.CharField(max_length=150)
    player_id    = models.CharField(max_length=20, blank=True, null=True)   # Jersey # or Player code
    role         = models.CharField(max_length=10, choices=ROLE_CHOICES, default='BAT')
    status       = models.IntegerField(default=1)    # 1=Active, 0=Inactive
    created_at   = models.DateTimeField(auto_now_add=True)
    updated_at   = models.DateTimeField(auto_now=True)
 
    class Meta:
        ordering = ['name']


class Match(models.Model):
 
    STATUS_CHOICES = [
        ('upcoming',  'Upcoming'),
        ('live',      'Live'),
        ('completed', 'Completed'),
        ('cancelled', 'Cancelled'),
    ]
 
    TOSS_CHOICE = [
        ('bat',  'Bat'),
        ('bowl', 'Bowl'),
    ]
 
    # ── Teams ──────────────────────────────────
    team_a          = models.ForeignKey('Team', related_name='matches_as_a', on_delete=models.CASCADE)
    team_b          = models.ForeignKey('Team', related_name='matches_as_b', on_delete=models.CASCADE)
 
    # ── Toss ──────────────────────────────────
    toss_winner     = models.ForeignKey('Team', related_name='toss_wins',    on_delete=models.SET_NULL, null=True, blank=True)
    toss_choice     = models.CharField(max_length=10, choices=TOSS_CHOICE,  blank=True, null=True)
 
    # ── Batting / Bowling ──────────────────────
    batting_team    = models.ForeignKey('Team', related_name='batting_matches', on_delete=models.SET_NULL, null=True, blank=True)
    bowling_team    = models.ForeignKey('Team', related_name='bowling_matches', on_delete=models.SET_NULL, null=True, blank=True)
 
    # ── Opening players ────────────────────────
    striker         = models.ForeignKey('Player', related_name='striker_matches',     on_delete=models.SET_NULL, null=True, blank=True)
    non_striker     = models.ForeignKey('Player', related_name='non_striker_matches', on_delete=models.SET_NULL, null=True, blank=True)
    bowler          = models.ForeignKey('Player', related_name='bowler_matches',      on_delete=models.SET_NULL, null=True, blank=True)
 
    # ── Match settings ─────────────────────────
    overs           = models.IntegerField(default=10)
    venue           = models.CharField(max_length=200, blank=True, null=True)
    match_date      = models.DateField(default=timezone.now)
 
    # ── Status ─────────────────────────────────
    status          = models.CharField(max_length=20, choices=STATUS_CHOICES, default='upcoming')
 
    # ── Live score (updated during match) ──────
    team_a_runs     = models.IntegerField(default=0)
    team_a_wickets  = models.IntegerField(default=0)
    team_a_balls    = models.IntegerField(default=0)
    team_b_runs     = models.IntegerField(default=0)
    team_b_wickets  = models.IntegerField(default=0)
    team_b_balls    = models.IntegerField(default=0)

    match_date = models.DateField(default=timezone.now)
    match_time = models.TimeField(null=True, blank=True)   # ← இந்த line மட்டும் add பண்ணுங்க
 
    created_at      = models.DateTimeField(auto_now_add=True)
    updated_at      = models.DateTimeField(auto_now=True)
 
    class Meta:
        ordering = ['-created_at']
 


class LiveScore(models.Model):
    """One LiveScore per match. Tracks current innings state."""
    match          = models.OneToOneField('Match', on_delete=models.CASCADE, related_name='live_score')
    innings        = models.IntegerField(default=1)

    # Current innings totals
    runs           = models.IntegerField(default=0)
    wickets        = models.IntegerField(default=0)
    balls          = models.IntegerField(default=0)
    extras         = models.IntegerField(default=0)

    # Innings 1 saved totals (used in innings 2 for target)
    innings1_runs    = models.IntegerField(default=0)
    innings1_wickets = models.IntegerField(default=0)
    innings1_balls   = models.IntegerField(default=0)
    target           = models.IntegerField(default=0)

    # This-over ball list stored as JSON string e.g. '["•","1","W","4"]'
    this_over_list = models.TextField(default="[]")

    updated_at = models.DateTimeField(auto_now=True)

    def this_over_json(self):
        try:    return json.loads(self.this_over_list)
        except: return []

    def add_to_this_over(self, ball):
        over = self.this_over_json()
        over.append(ball)
        if len(over) > 6:
            over = over[-6:]  # keep last 6
        self.this_over_list = json.dumps(over)

    def overs_str(self):
        return f"{self.balls // 6}.{self.balls % 6}"

    def __str__(self):
        return f"LiveScore Match#{self.match_id} — {self.runs}/{self.wickets}"


class BatsmanScore(models.Model):
    """Per-batsman score in a live match."""
    live      = models.ForeignKey(LiveScore, on_delete=models.CASCADE, related_name='batsmanscores')
    player    = models.ForeignKey('Player', on_delete=models.CASCADE)
    innings   = models.IntegerField(default=1)
    runs      = models.IntegerField(default=0)
    balls     = models.IntegerField(default=0)
    fours     = models.IntegerField(default=0)
    sixes     = models.IntegerField(default=0)
    is_out    = models.BooleanField(default=False)
    dismissal = models.CharField(max_length=100, blank=True, null=True)

    @property
    def strike_rate(self):
        if self.balls == 0: return 0.0
        return round((self.runs / self.balls) * 100, 1)

    class Meta:
        unique_together = ("live", "player", "innings")

    def __str__(self):
        return f"{self.player.name}: {self.runs}({self.balls})"


class BowlerFigure(models.Model):
    """Per-bowler figures in a live match."""
    live     = models.ForeignKey(LiveScore, on_delete=models.CASCADE, related_name='bowlerfigures')
    player   = models.ForeignKey('Player', on_delete=models.CASCADE)
    innings  = models.IntegerField(default=1)
    overs    = models.CharField(max_length=10, default="0.0")
    balls    = models.IntegerField(default=0)
    maidens  = models.IntegerField(default=0)
    runs     = models.IntegerField(default=0)
    wickets  = models.IntegerField(default=0)

    @property
    def economy(self):
        try:
            o = float(self.overs)
            return round(self.runs / o, 1) if o > 0 else 0.0
        except: return 0.0

    class Meta:
        unique_together = ("live", "player", "innings")

    def __str__(self):
        return f"{self.player.name}: {self.overs}-{self.maidens}-{self.runs}-{self.wickets}"
    


















def recording_path(instance, filename):
    return f"recordings/match_{instance.match_id}/{filename}"


class MatchStream(models.Model):
    """Tracks live stream state and recording file for each match."""
    STATUS = [
        ("idle",      "Not started"),
        ("live",      "Live now"),
        ("ended",     "Ended"),
    ]

    match        = models.OneToOneField("Match", on_delete=models.CASCADE, related_name="stream")
    stream_key   = models.CharField(max_length=64, unique=True)        # RTMP stream key
    hls_url      = models.CharField(max_length=200, blank=True)        # /hls/<key>/index.m3u8
    recording    = models.FileField(upload_to=recording_path, blank=True, null=True)
    recording_url = models.CharField(max_length=300, blank=True, null=True)

    status       = models.CharField(max_length=10, choices=STATUS, default="idle")
    viewer_count = models.PositiveIntegerField(default=0)
    started_at   = models.DateTimeField(null=True, blank=True)
    ended_at     = models.DateTimeField(null=True, blank=True)
    created_at   = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"Stream for Match {self.match_id} — {self.status}"

    def get_hls_url(self):
        return f"/hls/{self.stream_key}/index.m3u8"

    def get_recording_url(self):
        if self.recording:
            return f"/api/stream/recording/{self.match_id}/"
        return None
