from flask_sqlalchemy import SQLAlchemy
from werkzeug.security import generate_password_hash, check_password_hash
from datetime import datetime, timezone
from .db import db

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)
    password_hash = db.Column(db.String(255), nullable=False)
    is_active = db.Column(db.Boolean, default=True)
    created_at = db.Column(db.DateTime, default=lambda: datetime.now(timezone.utc))
    updated_at = db.Column(db.DateTime, default=lambda: datetime.now(timezone.utc), onupdate=lambda: datetime.now(timezone.utc))
    
    # 구독 서비스 관련 관계
    profile = db.relationship('UserProfile', back_populates='user', uselist=False)
    subscriptions = db.relationship('Subscription', back_populates='user')
    payments = db.relationship('Payment', back_populates='user')
    content_access = db.relationship('UserContentAccess', back_populates='user')

    def set_password(self, password):
        """비밀번호 설정 - werkzeug 해시 사용"""
        self.password_hash = generate_password_hash(password)

    def check_password(self, password):
        """비밀번호 검증 - werkzeug 해시 사용"""
        return check_password_hash(self.password_hash, password)

    def to_dict(self):
        return {
            'id': self.id,
            'username': self.username,
            'email': self.email,
            'is_active': self.is_active,
            'created_at': self.created_at.isoformat() if self.created_at else None,
            'updated_at': self.updated_at.isoformat() if self.updated_at else None
        }

    def __repr__(self):
        return f'<User {self.username}>'

