"""
User Models for WFIS Platform
"""

from flask_login import UserMixin
from werkzeug.security import generate_password_hash, check_password_hash
from app import db
from datetime import datetime, timedelta
import uuid


class User(UserMixin, db.Model):
    __tablename__ = 'users'
    
    id = db.Column(db.Integer, primary_key=True)
    uuid = db.Column(db.String(36), unique=True, default=lambda: str(uuid.uuid4()))
    username = db.Column(db.String(64), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)
    password_hash = db.Column(db.String(256), nullable=False)
    
    # Profile
    first_name = db.Column(db.String(64))
    last_name = db.Column(db.String(64))
    company = db.Column(db.String(128))
    role = db.Column(db.String(64), default='analyst')  # analyst, admin, enterprise
    
    # Subscription Fields
    subscription_plan = db.Column(db.String(50), default='free')  # free, monthly, quarterly, biannual, yearly
    subscription_start = db.Column(db.DateTime, default=datetime.utcnow)
    subscription_end = db.Column(db.DateTime, nullable=True)
    subscription_status = db.Column(db.String(20), default='active')  # active, expired, cancelled, trial
    
    # Payment tracking
    last_payment_date = db.Column(db.DateTime, nullable=True)
    payment_method = db.Column(db.String(50), nullable=True)
    transaction_id = db.Column(db.String(100), nullable=True)
    
    # Preferences
    default_ticker = db.Column(db.String(20), default='BTC-USD')
    theme = db.Column(db.String(20), default='dark')
    email_notifications = db.Column(db.Boolean, default=True)
    
    # Compliance & GDPR
    gdpr_consent = db.Column(db.Boolean, default=False)
    research_only_acknowledged = db.Column(db.Boolean, default=False)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    last_login = db.Column(db.DateTime)
    is_active = db.Column(db.Boolean, default=True)
    is_admin = db.Column(db.Boolean, default=False)
    
    # Relationships
    analyses = db.relationship('MarketAnalysis', backref='user', lazy=True)
    watchlists = db.relationship('Watchlist', backref='user', lazy=True)
    api_keys = db.relationship('APIKey', backref='user', lazy=True)
    
    def set_password(self, password):
        self.password_hash = generate_password_hash(password, method='bcrypt')
    
    def check_password(self, password):
        return check_password_hash(self.password_hash, password)
    
    def has_active_subscription(self) -> bool:
        """بررسی فعال بودن اشتراک کاربر"""
        if self.subscription_plan == 'free':
            return True
        if self.subscription_status != 'active':
            return False
        if self.subscription_end and self.subscription_end < datetime.utcnow():
            self.subscription_status = 'expired'
            db.session.commit()
            return False
        return True
    
    def get_subscription_days_left(self) -> int:
        """دریافت تعداد روزهای باقی‌مانده از اشتراک"""
        if not self.subscription_end or self.subscription_status != 'active':
            return 0
        days_left = (self.subscription_end - datetime.utcnow()).days
        return max(0, days_left)
    
    def activate_subscription(self, plan: str, duration_months: int):
        """فعال کردن اشتراک کاربر"""
        self.subscription_plan = plan
        self.subscription_start = datetime.utcnow()
        self.subscription_end = self.subscription_start + timedelta(days=duration_months * 30)
        self.subscription_status = 'active'
        self.is_active = True
        db.session.commit()
    
    def cancel_subscription(self):
        """لغو اشتراک کاربر"""
        self.subscription_status = 'cancelled'
        db.session.commit()
    
    def expire_subscription(self):
        """منقضی کردن اشتراک کاربر"""
        self.subscription_status = 'expired'
        self.is_active = False
        db.session.commit()
    
    def to_dict(self):
        return {
            'uuid': self.uuid,
            'username': self.username,
            'email': self.email,
            'first_name': self.first_name,
            'last_name': self.last_name,
            'company': self.company,
            'role': self.role,
            'subscription_plan': self.subscription_plan,
            'subscription_status': self.subscription_status,
            'subscription_start': self.subscription_start.isoformat() if self.subscription_start else None,
            'subscription_end': self.subscription_end.isoformat() if self.subscription_end else None,
            'days_left': self.get_subscription_days_left(),
            'default_ticker': self.default_ticker,
            'created_at': self.created_at.isoformat() if self.created_at else None,
            'is_active': self.is_active,
            'is_admin': self.is_admin
        }
    
    def __repr__(self):
        return f'<User {self.username}>'


# باقی مدل‌ها به همین صورت باقی می‌مانند...