import uuid
from pathlib import Path
from django.conf import settings
from django.core.validators import FileExtensionValidator
from django.db import models
from django.utils import timezone

def private_path(instance, filename):
 ext=Path(filename).suffix.lower()
 return f'client/{instance.client_id}/{instance.tax_year}/{uuid.uuid4().hex}{ext}'
class ClientProfile(models.Model):
 user=models.OneToOneField(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,related_name='tax_profile')
 phone=models.CharField(max_length=32,blank=True)
 created_at=models.DateTimeField(auto_now_add=True)
 def __str__(self): return self.user.get_full_name() or self.user.username
class TaxCase(models.Model):
 STATES=[('requested','Documents requested'),('receiving','Receiving documents'),('preparing','In preparation'),('review','Under review'),('signing','Awaiting signature'),('filed','Filed')]
 client=models.ForeignKey(ClientProfile,on_delete=models.PROTECT,related_name='cases')
 year=models.PositiveSmallIntegerField()
 status=models.CharField(max_length=16,choices=STATES,default='requested')
 created_at=models.DateTimeField(auto_now_add=True)
 updated_at=models.DateTimeField(auto_now=True)
 class Meta:
  constraints=[models.UniqueConstraint(fields=['client','year'],name='unique_client_tax_year')]
 def __str__(self): return f'{self.client} | {self.year}'
class ChecklistItem(models.Model):
 case=models.ForeignKey(TaxCase,on_delete=models.CASCADE,related_name='checklist')
 label=models.CharField(max_length=120)
 received=models.BooleanField(default=False)
 class Meta: ordering=['id']
class TaxDocument(models.Model):
 KINDS=[('w2','W-2'),('1099','1099'),('identity','Identity'),('expense','Expense'),('other','Other')]
 client=models.ForeignKey(ClientProfile,on_delete=models.PROTECT,related_name='documents')
 case=models.ForeignKey(TaxCase,on_delete=models.PROTECT,related_name='documents')
 kind=models.CharField(max_length=16,choices=KINDS,default='other')
 original_filename=models.CharField(max_length=255)
 file=models.FileField(upload_to=private_path,validators=[FileExtensionValidator(['pdf'])])
 size=models.PositiveIntegerField()
 sha256=models.CharField(max_length=64)
 scan_status=models.CharField(max_length=16,choices=[('pending','Pending'),('clean','Clean'),('blocked','Blocked')],default='pending')
 uploaded_at=models.DateTimeField(auto_now_add=True)
 def __str__(self): return f'{self.kind} | {self.client} | {self.case.year}'
class ActivityLog(models.Model):
 actor=models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.SET_NULL,null=True,blank=True)
 action=models.CharField(max_length=60)
 case=models.ForeignKey(TaxCase,on_delete=models.SET_NULL,null=True,blank=True)
 document=models.ForeignKey(TaxDocument,on_delete=models.SET_NULL,null=True,blank=True)
 timestamp=models.DateTimeField(default=timezone.now)
 ip=models.GenericIPAddressField(null=True,blank=True)
 class Meta: ordering=['-timestamp']
class ReturnPackage(models.Model):
 # Schema placeholder for Phase 2; no routes to upload or publish returns yet.
 case=models.ForeignKey(TaxCase,on_delete=models.PROTECT,related_name='returns')
 version=models.PositiveSmallIntegerField(default=1)
 status=models.CharField(max_length=16,choices=[('draft','Draft'),('published','Published'),('signed','Signed')],default='draft')
 signature_provider_reference=models.CharField(max_length=200,blank=True)
 created_at=models.DateTimeField(auto_now_add=True)
