from django.db import models
from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _
import uuid
from django.utils import timezone

# Create your models here.

class liuyao(models.Model):
    def validateYao(value):
        if value not in ('1', '111', '0', '000'):
            raise ValidationError("This field value must be '0', '000', '1', or '111' only.")
            
    ANALYSIS_STATUS_CHOICES = [
        ('pending', '处理中'),
        ('completed', '已完成'),
        ('error', '错误'),
    ]

    REPORT_STATUS_CHOICES = [
        ('pending', '待处理'),
        ('resolved', '已解决'),
        ('dismissed', '已忽略'),
    ]
    
    REPORT_CATEGORY_CHOICES = [
        ('inappropriate_content', '内容不当'),
        ('inaccurate_analysis', '分析不准确'),
        ('offensive_language', '语言冒犯'),
        ('technical_error', '技术错误'),
        ('other', '其他'),
    ]

    # String field
    qdate = models.DateTimeField()
    user = models.ForeignKey("main.User", verbose_name=_("User"), on_delete=models.SET_NULL, null=True, blank=True)
    ori_user = models.IntegerField(null=True, blank=True, help_text='Original user ID before deletion')
    uuid = models.UUIDField(default=uuid.uuid4, editable=False)
    question = models.CharField(max_length=255)
    y1 = models.CharField(max_length=3, validators=[validateYao])
    y2 = models.CharField(max_length=3, validators=[validateYao])
    y3 = models.CharField(max_length=3, validators=[validateYao])
    y4 = models.CharField(max_length=3, validators=[validateYao])
    y5 = models.CharField(max_length=3, validators=[validateYao])
    y6 = models.CharField(max_length=3, validators=[validateYao])
    reading = models.TextField(null=True,blank=True)
    feedback = models.TextField(null=True,blank=True)
    data = models.JSONField(null=True,blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    last_modified_at = models.DateTimeField(auto_now=True)
    
    # AI analysis fields
    ai_analysis = models.JSONField(null=True, blank=True, verbose_name='六爻AI分析结果')
    analysis_timestamp = models.DateTimeField(null=True, blank=True, verbose_name='分析时间')
    analysis_status = models.CharField(max_length=20, choices=ANALYSIS_STATUS_CHOICES, null=True, blank=True, verbose_name='分析状态')
    
    # AI analysis reporting fields
    analysis_reported = models.BooleanField(default=False, verbose_name='六爻分析已举报')
    report_category = models.CharField(max_length=30, choices=REPORT_CATEGORY_CHOICES, null=True, blank=True, verbose_name='六爻分析举报类别')
    report_message = models.TextField(null=True, blank=True, verbose_name='六爻分析举报留言', max_length=1000)
    report_timestamp = models.DateTimeField(null=True, blank=True, verbose_name='六爻分析举报时间')
    report_status = models.CharField(max_length=20, choices=REPORT_STATUS_CHOICES, null=True, blank=True, verbose_name='分析举报状态')
    report_admin_notes = models.TextField(null=True, blank=True, verbose_name='六爻分析举报管理员备注')
    report_resolved_by = models.ForeignKey('main.User', on_delete=models.SET_NULL, null=True, blank=True, related_name='resolved_liuyao_reports', verbose_name='六爻分析举报处理人')
    report_resolved_at = models.DateTimeField(null=True, blank=True, verbose_name='六爻分析举报处理时间')
    report_resolution_email_sent = models.BooleanField(default=False, verbose_name='六爻分析举报解决邮件已发送')
    
    # Track temporary user creation
    created_by_temp_user = models.BooleanField(
        default=False,
        verbose_name='临时用户创建',
        help_text='标识此记录是由临时用户创建'
    )

    def __str__(self):
        return self.question

    @classmethod
    def updateToUserWithUUID(cls, user, uuid):
        cls.objects.filter(uuid=uuid, user_id__isnull=True).update(user_id=user.id)
        
    def request_analysis(self):
        """Mark this LiuYao chart for AI analysis."""
        self.analysis_status = 'pending'
        self.save(update_fields=['analysis_status'])
        
    def update_analysis_status(self, status, result=None):
        """
        Update the analysis status and result.
        
        Args:
            status (str): The analysis status (pending, completed, error)
            result (dict): Optional analysis result dict to store
        """
        self.analysis_status = status
        if result:
            self.ai_analysis = result
            self.analysis_timestamp = timezone.now()
            
        fields_to_update = ['analysis_status']
        if result:
            fields_to_update.extend(['ai_analysis', 'analysis_timestamp'])
            
        self.save(update_fields=fields_to_update)
    
    def can_report_analysis(self):
        """Check if LiuYao analysis can be reported."""
        # Can report if analysis exists and is completed
        if not (self.ai_analysis and self.analysis_status == 'completed'):
            return False
        
        # If not reported yet, can report
        if not self.analysis_reported:
            return True
        
        # If already reported, check if it's resolved or dismissed (can report again)
        if self.report_status in ['resolved', 'dismissed']:
            return True
        
        # If pending, cannot report again
        return False
    
    def report_analysis(self, category, user_message=None, reported_by=None):
        """Report LiuYao analysis as inappropriate."""
        if not self.can_report_analysis():
            return False
        
        # Clear previous report data when re-reporting
        if self.analysis_reported and self.report_status in ['resolved', 'dismissed']:
            self.report_admin_notes = None
            self.report_resolved_by = None
            self.report_resolved_at = None
            
        self.analysis_reported = True
        self.report_category = category
        self.report_message = user_message
        self.report_timestamp = timezone.now()
        self.report_status = 'pending'
        self.report_resolution_email_sent = False  # Reset email flag for new report
        self.save(update_fields=[
            'analysis_reported', 'report_category', 'report_message', 
            'report_timestamp', 'report_status', 'report_resolution_email_sent',
            'report_admin_notes', 'report_resolved_by', 'report_resolved_at'
        ])
        return True
    
    def reset_analysis(self):
        """Reset LiuYao analysis and clear reporting status."""
        self.ai_analysis = None
        self.analysis_timestamp = None
        self.analysis_status = None
        self.analysis_reported = False
        self.report_category = None
        self.report_message = None
        self.report_timestamp = None
        self.report_status = None
        self.report_admin_notes = None
        self.report_resolved_by = None
        self.report_resolved_at = None
        self.report_resolution_email_sent = False
        self.save(update_fields=[
            'ai_analysis', 'analysis_timestamp', 'analysis_status',
            'analysis_reported', 'report_category', 'report_message', 
            'report_timestamp', 'report_status', 'report_admin_notes',
            'report_resolved_by', 'report_resolved_at',
            'report_resolution_email_sent'
        ])
