import hashlib

from django.contrib.auth.models import User
from django.db import models


class UserActivityLog(models.Model):
    """Model to log user activities."""

    ACTION_CHOICES = [
        ("upload", "Upload"),
        ("download", "Download"),
    ]

    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="activity_logs")
    action = models.CharField(max_length=10, choices=ACTION_CHOICES)
    name = models.CharField(max_length=255)
    input_file_hash = models.CharField(max_length=64, blank=True, null=True)
    output_file_hash = models.CharField(max_length=64, blank=True, null=True)
    timestamp = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"{self.user.username} - {self.action} - {self.name} ({self.timestamp})"

    @staticmethod
    def generate_file_hash(file_obj: object) -> str:
        """Generate SHA-256 hash for a file-like object."""
        hasher = hashlib.sha256()

        if hasattr(file_obj, "chunks"):
            for chunk in file_obj.chunks():
                hasher.update(chunk)
        elif isinstance(file_obj, str):
            hasher.update(file_obj.encode("utf-8"))

        elif isinstance(file_obj, list):
            hasher.update(str(file_obj).encode("utf-8"))

        else:
            raise TypeError("generate_file_hash() expected a file, BytesIO, string, or list.")

        return hasher.hexdigest()