from datetime import datetime
from ..extensions import db
from .base import BaseModel


class CookieConsent(BaseModel):
    """Cookie consent tracking for GDPR/Privacy compliance"""
    __tablename__ = 'cookie_consents'

    # Core consent data
    consent_type = db.Column(db.String(20), nullable=False)  # 'all' or 'necessary'
    consent_date = db.Column(db.DateTime, default=datetime.utcnow, nullable=False, index=True)
    
    # Tracking identifiers
    ip_address = db.Column(db.String(45), nullable=True)  # IPv6 max length
    user_agent = db.Column(db.Text, nullable=True)
    browser_fingerprint = db.Column(db.String(64), nullable=True, index=True)  # SHA-256 hash
    session_id = db.Column(db.String(255), nullable=True, index=True)
    
    # Page context
    referrer_url = db.Column(db.String(500), nullable=True)
    page_url = db.Column(db.String(500), nullable=True)
    
    # User linkage (null for anonymous users)
    user_id = db.Column(db.Integer, db.ForeignKey('users.id', ondelete='SET NULL'), nullable=True, index=True)
    
    # Compliance tracking
    consent_version = db.Column(db.String(10), default='1.0', nullable=False)  # Track policy version
    country_code = db.Column(db.String(2), nullable=True)  # ISO country code from IP
    
    # Status tracking
    updated_at = db.Column(db.DateTime, nullable=True)
    is_revoked = db.Column(db.Boolean, default=False, nullable=False, index=True)
    revoked_at = db.Column(db.DateTime, nullable=True)

    # Relationship
    user = db.relationship('User', backref='cookie_consents', lazy=True)

    def __repr__(self):
        return f'<CookieConsent {self.consent_type} - {self.consent_date}>'

    def to_dict(self):
        """Serialize consent record for API responses"""
        return {
            'id': self.id,
            'consent_type': self.consent_type,
            'consent_date': self.consent_date.isoformat() if self.consent_date else None,
            'user_id': self.user_id,
            'consent_version': self.consent_version,
            'country_code': self.country_code,
            'is_revoked': self.is_revoked,
            'revoked_at': self.revoked_at.isoformat() if self.revoked_at else None
        }

    @classmethod
    def get_user_consent(cls, user_id):
        """Get latest non-revoked consent for a user"""
        return cls.query.filter_by(
            user_id=user_id,
            is_revoked=False
        ).order_by(cls.consent_date.desc()).first()

    @classmethod
    def get_anonymous_consent(cls, browser_fingerprint):
        """Get latest non-revoked consent for anonymous user by fingerprint"""
        if not browser_fingerprint:
            return None
        return cls.query.filter_by(
            browser_fingerprint=browser_fingerprint,
            is_revoked=False,
            user_id=None
        ).order_by(cls.consent_date.desc()).first()

    def revoke(self):
        """Revoke this consent"""
        self.is_revoked = True
        self.revoked_at = datetime.utcnow()
        db.session.commit()
