"""Suppression logique : statut + date_suppression (pas de DELETE en base)."""
from datetime import datetime

from sqlalchemy import Column, DateTime, String
from sqlalchemy.ext.declarative import declared_attr

STATUT_ACTIF = "actif"
STATUT_SUPPRIME = "supprime"


class SoftDeleteMixin:
    """Mixin pour archiver les enregistrements au lieu de les effacer."""

    @declared_attr
    def statut(cls):
        return Column(String(20), default=STATUT_ACTIF, nullable=False, index=True)

    @declared_attr
    def date_suppression(cls):
        return Column(DateTime, nullable=True)

    @property
    def est_supprime(self) -> bool:
        return self.statut == STATUT_SUPPRIME

    @property
    def est_actif_enregistrement(self) -> bool:
        return self.statut == STATUT_ACTIF

    def marquer_supprime(self) -> None:
        self.statut = STATUT_SUPPRIME
        self.date_suppression = datetime.utcnow()

    def restaurer(self) -> None:
        self.statut = STATUT_ACTIF
        self.date_suppression = None

    @classmethod
    def query_actifs(cls):
        return cls.query.filter(cls.statut == STATUT_ACTIF)

    @classmethod
    def query_archives(cls):
        return cls.query.filter(cls.statut == STATUT_SUPPRIME)
