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


class Leaderboard(BaseModel):
    """Gamification leaderboards for construction workers and contractors"""
    __tablename__ = 'leaderboards'
    
    # Leaderboard Period
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
    period_type = db.Column(db.String(20), nullable=False)  # weekly, monthly, seasonal, annual
    period_start = db.Column(db.Date, nullable=False)
    period_end = db.Column(db.Date, nullable=False)
    
    # Performance Metrics
    points_earned = db.Column(db.Integer, default=0, nullable=False)
    rank_position = db.Column(db.Integer, nullable=False)
    jobs_completed = db.Column(db.Integer, default=0, nullable=False)
    avg_rating = db.Column(db.Numeric(3, 2), default=0.0)
    safety_score = db.Column(db.Numeric(5, 2), default=0.0)
    
    # League Classification
    league_tier = db.Column(db.String(20), default='bronze', nullable=False)
    # Tiers: bronze, silver, gold, platinum, diamond
    
    # Relationships
    user = db.relationship('User', backref='leaderboard_entries')
    
    def __repr__(self):
        return f'<Leaderboard {self.user_id} - Rank {self.rank_position} ({self.period_type})>'


class Achievement(BaseModel):
    """Achievement badges for construction marketplace"""
    __tablename__ = 'achievements'
    
    # Achievement Reference
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
    achievement_type = db.Column(db.String(50), nullable=False)
    
    # Achievement Details
    badge_name = db.Column(db.String(100), nullable=False)
    description = db.Column(db.Text, nullable=False)
    icon_url = db.Column(db.String(255))
    
    # Achievement Value
    points_awarded = db.Column(db.Integer, default=0, nullable=False)
    rarity_level = db.Column(db.String(20), default='common', nullable=False)
    # Rarity: common, uncommon, rare, epic, legendary
    
    # Achievement Trigger
    trigger_condition = db.Column(db.String(100), nullable=False)
    trigger_value = db.Column(db.Integer)
    unlocked_at = db.Column(db.DateTime, default=datetime.utcnow, nullable=False)
    
    # Relationships
    user = db.relationship('User', backref='achievements')
    
    def __repr__(self):
        return f'<Achievement {self.badge_name} - {self.user_id}>'


class PointActivity(BaseModel):
    """Point earning activities log for gamification"""
    __tablename__ = 'point_activities'
    
    # Activity Reference
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
    activity_type = db.Column(db.String(50), nullable=False)
    
    # Activity Details
    points_earned = db.Column(db.Integer, nullable=False)
    description = db.Column(db.Text, nullable=False)
    
    # Related Records
    related_job_id = db.Column(db.Integer, db.ForeignKey('jobs.id'))
    related_contract_id = db.Column(db.Integer, db.ForeignKey('contracts.id'))
    related_review_id = db.Column(db.Integer, db.ForeignKey('reviews.id'))
    
    # Activity Multipliers
    base_points = db.Column(db.Integer, nullable=False)
    bonus_multiplier = db.Column(db.Numeric(3, 2), default=1.0, nullable=False)
    bonus_reason = db.Column(db.String(100))
    
    # Relationships
    user = db.relationship('User', backref='point_activities')
    related_job = db.relationship('Job', backref='point_activities')
    related_contract = db.relationship('Contract', backref='point_activities')
    related_review = db.relationship('Review', backref='point_activities')
    
    def __repr__(self):
        return f'<PointActivity {self.activity_type} - {self.points_earned} pts>'
