"""
Database models for cronjob execution tracking.
"""

from django.db import models
from django.utils import timezone
from datetime import timedelta


class CronExecution(models.Model):
    """Tracks cronjob execution history."""
    
    task_code = models.CharField(max_length=50, db_index=True, help_text="Unique task code")
    task_name = models.CharField(max_length=100, db_index=True, help_text="Human-readable task name")
    started = models.DateTimeField(auto_now_add=True, db_index=True)
    ended = models.DateTimeField(null=True, blank=True)
    completed = models.BooleanField(default=False, db_index=True)
    success = models.BooleanField(default=False)
    message = models.TextField(blank=True)
    error_code = models.CharField(max_length=50, blank=True)
    execution_date = models.DateField(db_index=True, help_text="Date for which the task was executed")
    retry_count = models.IntegerField(default=0)
    pid = models.IntegerField(null=True, blank=True, help_text="Process ID for timeout handling")
    
    class Meta:
        db_table = 'cron_execution'
        indexes = [
            models.Index(fields=['task_code', 'execution_date']),
            models.Index(fields=['task_code', 'success', 'execution_date']),
            models.Index(fields=['completed']),
            models.Index(fields=['started']),
        ]
        ordering = ['-started']
        verbose_name = 'Cron Execution'
        verbose_name_plural = 'Cron Executions'
    
    def __str__(self):
        status = "✓" if self.success else "✗" if self.completed else "→"
        return f"{status} {self.task_name} ({self.task_code}) - {self.execution_date}"
    
    @property
    def duration(self):
        """Calculate execution duration in seconds."""
        if self.ended and self.started:
            return (self.ended - self.started).total_seconds()
        if not self.completed:
            return (timezone.now() - self.started).total_seconds()
        return None
    
    def mark_completed(self, success=True, message='', error_code=''):
        """Mark execution as completed."""
        self.completed = True
        self.success = success
        self.ended = timezone.now()
        # Always update message and error_code, even if empty string
        self.message = message
        self.error_code = error_code
        self.save(update_fields=['completed', 'success', 'ended', 'message', 'error_code'])
    
    def mark_failed(self, message='', error_code=''):
        """Mark execution as failed."""
        self.mark_completed(success=False, message=message, error_code=error_code)
    
    def increment_retry(self):
        """Increment retry count."""
        self.retry_count += 1
        self.save(update_fields=['retry_count'])
