import uuid
from django.db import models
from django.db import transaction
from django.core.exceptions import ValidationError
import logging

logger = logging.getLogger(__name__)

class Balance(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    user_id = models.UUIDField()
    stamp_id = models.UUIDField()
    
    # Time-related fields (all as floats)
    work_time = models.FloatField(default=0.0)
    flex_time = models.FloatField(default=0.0)
    over_time = models.FloatField(default=0.0)
    work_time_bank = models.FloatField(default=0.0)
    additional_work = models.FloatField(default=0.0)
    paid_leave = models.FloatField(default=0.0)
    holiday = models.FloatField(default=0.0)
    sick_leave = models.FloatField(default=0.0)
    parental_leave = models.FloatField(default=0.0)
    travel_time = models.FloatField(default=0.0)
    training_leave = models.FloatField(default=0.0)
    unpaid_leave = models.FloatField(default=0.0)
    working_time_reducation = models.FloatField(default=0.0)
    remote_work_time = models.FloatField(default=0.0)
    standby_duty = models.FloatField(default=0.0)
    
    # Timestamps
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = 'balances'
        indexes = [
            models.Index(fields=['user_id']),
            models.Index(fields=['stamp_id']),
        ]

    def save(self, *args, **kwargs):
        try:
            with transaction.atomic():
                super().save(*args, **kwargs)
        except Exception as e:
            logger.error(f"Error saving balance record: {str(e)}")
            raise ValidationError(f"Failed to save balance record: {str(e)}")

    def __str__(self):
        return f"Balance for User {self.user_id} - Stamp {self.stamp_id}" 