
"""Gamification utilities for Australian construction marketplace"""

from flask import current_app
from ..extensions import db
from ..models import User, PointActivity, Achievement


def award_points(user_id, activity_type, base_points, description, **kwargs):
    """Award points to user with bonus calculations"""
    try:
        if not is_feature_enabled('gamification_leaderboards'):
            return None
        
        # Calculate bonus multiplier
        bonus_multiplier = 1.0
        bonus_reason = None
        
        # Safety bonus
        if kwargs.get('safety_compliant', False):
            bonus_multiplier += 0.2
            bonus_reason = "Safety compliance bonus"
        
        # High-value job bonus
        job_value = kwargs.get('job_value', 0)
        if job_value > 10000:
            bonus_multiplier += 0.3
            bonus_reason = "High-value project bonus"
        elif job_value > 5000:
            bonus_multiplier += 0.15
            bonus_reason = "Premium project bonus"
        
        # Quality bonus (high ratings)
        rating = kwargs.get('rating', 0)
        if rating >= 4.8:
            bonus_multiplier += 0.25
            bonus_reason = "Excellent quality bonus"
        elif rating >= 4.5:
            bonus_multiplier += 0.1
            bonus_reason = "High quality bonus"
        
        # Calculate final points
        final_points = int(base_points * bonus_multiplier)
        
        # Create point activity
        activity = PointActivity(
            user_id=user_id,
            activity_type=activity_type,
            points_earned=final_points,
            base_points=base_points,
            bonus_multiplier=bonus_multiplier,
            bonus_reason=bonus_reason,
            description=description,
            related_job_id=kwargs.get('job_id'),
            related_contract_id=kwargs.get('contract_id'),
            related_review_id=kwargs.get('review_id')
        )
        
        db.session.add(activity)
        
        # Update user's total points and level
        user = User.query.get(user_id)
        if user:
            user.total_points += final_points
            
            # Update level (500 points per level)
            new_level = (user.total_points // 500) + 1
            if new_level > user.current_level:
                user.current_level = new_level
                # Award level achievement
                award_level_achievement(user_id, new_level)
        
        return activity
        
    except Exception as e:
        current_app.logger.error(f"Gamification error: {str(e)}")
        return None


def check_achievements(user_id):
    """Check and award achievements for user"""
    try:
        if not is_feature_enabled('achievement_badges'):
            return
        
        user = User.query.get(user_id)
        if not user:
            return
        
        # Job completion achievements
        job_achievements = [
            (10, 'Rising Star', 'Completed 10 construction jobs', 250, 'uncommon'),
            (25, 'Skilled Professional', 'Completed 25 construction jobs', 500, 'rare'),
            (50, 'Master Tradesperson', 'Completed 50 construction jobs', 1000, 'epic'),
            (100, 'Century Champion', 'Completed 100+ construction jobs', 2000, 'legendary')
        ]
        
        for jobs_required, name, desc, points, rarity in job_achievements:
            if user.jobs_completed >= jobs_required:
                award_achievement_if_new(user_id, f'jobs_{jobs_required}', name, desc, points, rarity)
        
        # Rating achievements
        if user.average_rating >= 4.8 and user.total_reviews >= 10:
            award_achievement_if_new(user_id, 'high_rating', '5-Star Specialist', 
                                   'Maintained 4.8+ rating over 10+ reviews', 750, 'epic')
        
        # Safety achievements
        safety_score = calculate_user_safety_score(user_id)
        if safety_score >= 95:
            award_achievement_if_new(user_id, 'safety_champion', 'Safety Champion', 
                                   'Maintained 95%+ safety compliance score', 500, 'rare')
        
    except Exception as e:
        current_app.logger.error(f"Achievement check error: {str(e)}")


def award_achievement_if_new(user_id, trigger, name, description, points, rarity):
    """Award achievement if user doesn't already have it"""
    existing = Achievement.query.filter_by(user_id=user_id, trigger_condition=trigger).first()
    
    if not existing:
        achievement = Achievement(
            user_id=user_id,
            achievement_type='milestone',
            badge_name=name,
            description=description,
            points_awarded=points,
            rarity_level=rarity,
            trigger_condition=trigger
        )
        
        db.session.add(achievement)
        
        # Award bonus points
        award_points(user_id, 'achievement_unlocked', points, 
                    f"Unlocked achievement: {name}")


def award_level_achievement(user_id, level):
    """Award achievement for reaching new level"""
    level_rewards = {
        5: ('Level 5 Achiever', 'Reached Level 5', 100, 'common'),
        10: ('Top Performer', 'Reached Level 10', 200, 'uncommon'),
        15: ('Elite Professional', 'Reached Level 15', 300, 'rare'),
        20: ('Master Level', 'Reached Level 20', 500, 'epic'),
        25: ('Legendary Status', 'Reached Level 25', 1000, 'legendary')
    }
    
    if level in level_rewards:
        name, desc, points, rarity = level_rewards[level]
        award_achievement_if_new(user_id, f'level_{level}', name, desc, points, rarity)


def calculate_user_safety_score(user_id):
    """Calculate user's overall safety compliance score"""
    from ..models import WHSAssessment, Job
    
    # Get user's safety assessments
    assessments = WHSAssessment.query.join(Job).filter(
        Job.contractor_id == user_id  # Simplified - should check worker contracts too
    ).all()
    
    if not assessments:
        return 0
    
    total_score = sum(assessment.calculate_compliance_score() for assessment in assessments)
    return total_score / len(assessments)


def is_feature_enabled(feature_name):
    """Check if gamification feature is enabled"""
    return current_app.config['FEATURES'].get(feature_name, False)
