from django.db import models

# Create your models here.
from django.db import models
from rest_framework.authtoken.models import Token as DefaultToken

from django.db import models

# core/models.py
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin
from django.db import models


import hashlib
import secrets
from django.db import models

from django.contrib.admin.models import LogEntryManager, ADDITION, CHANGE, DELETION
from django.contrib.contenttypes.models import ContentType
from django.db import models
import json

class AdminLogEntry(models.Model):
    action_time = models.DateTimeField(auto_now_add=True)
    user = models.ForeignKey(
        'app_admin.AdminUser',
        on_delete=models.CASCADE,
        related_name='log_entries'
    )
    content_type = models.ForeignKey(
        ContentType, null=True, blank=True, on_delete=models.SET_NULL
    )
    object_id = models.TextField(null=True, blank=True)
    object_repr = models.CharField(max_length=200)
    action_flag = models.PositiveSmallIntegerField()
    change_message = models.TextField(blank=True)

    class Meta:
        ordering = ['-action_time']

    def __str__(self):
        if self.action_flag == ADDITION:
            return f'{self.user} hat {self.object_repr} hinzugefügt'
        elif self.action_flag == CHANGE:
            return f'{self.user} hat {self.object_repr} geändert'
        elif self.action_flag == DELETION:
            return f'{self.user} hat {self.object_repr} gelöscht'
        return f'{self.user} hat eine Aktion auf {self.object_repr} ausgeführt'



class AdminUserManager(BaseUserManager):
    def create_user(self, email, password=None):
        user = self.model(email=self.normalize_email(email))
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, password=None):
        user = self.create_user(email, password)
        user.is_staff = True
        user.is_superuser = True
        user.save(using=self._db)
        return user

class AdminUser(AbstractBaseUser, PermissionsMixin):
    username  = models.CharField(max_length=50, unique=True)
    email     = models.EmailField(blank=True, null=True, unique=True)
    name      = models.CharField(max_length=100, blank=True)
    is_active = models.BooleanField(default=True)
    is_staff  = models.BooleanField(default=True)

    # Konflikte auflösen
    groups = models.ManyToManyField(
        'auth.Group',
        blank=True,
        related_name='admin_users',  # ← eigener name
    )
    user_permissions = models.ManyToManyField(
        'auth.Permission',
        blank=True,
        related_name='admin_users',  # ← eigener name
    )

    objects = AdminUserManager()
    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['username']


    def __str__(self):
        return self.username  # ← Das muss gesetzt sein!



    class Meta:
        verbose_name = 'Admin User'

class AdminToken(models.Model):
    user = models.OneToOneField(
        'app_admin.AdminUser',
        on_delete=models.CASCADE,
        related_name='auth_token'
    )
    key_hash = models.CharField(max_length=64, unique=True)  # ← nur Hash speichern
    created = models.DateTimeField(auto_now_add=True)
    label = models.CharField(max_length=100, blank=True)     # ← optionale Bezeichnung

    @staticmethod
    def generate_token():
        """Generiert einen neuen Token im Klartext."""
        return secrets.token_hex(32)  # 64 Zeichen langer hex-String

    @staticmethod
    def hash_token(token: str) -> str:
        """Hasht einen Token mit SHA-256."""
        return hashlib.sha256(token.encode()).hexdigest()

    def set_token(self, token: str):
        """Setzt den Hash des Tokens."""
        self.key_hash = self.hash_token(token)

    def verify_token(self, token: str) -> bool:
        """Prüft ob ein Token korrekt ist."""
        return self.key_hash == self.hash_token(token)

    def __str__(self):
        return f'Token für {self.user} ({self.created.strftime("%d.%m.%Y")})'