"""Achievement definitions with examples"""

ACHIEVEMENTS = [
    {
        'id': 'first_job',
        'name': 'First Blood',
        'description': 'Complete your first job',
        'icon': '🎯',
        'points': 100,
        'rarity': 'common',
        'check_function': lambda user: user.jobs_completed >= 1
    },
    {
        'id': 'five_star_worker',
        'name': 'Five Star Worker',
        'description': 'Maintain 5.0 rating for 10 jobs',
        'icon': '⭐',
        'points': 500,
        'rarity': 'rare',
        'check_function': lambda user: user.average_rating and float(user.average_rating) == 5.0 and user.jobs_completed >= 10
    },
    {
        'id': 'speed_demon',
        'name': 'Speed Demon',
        'description': 'Complete 5 jobs in one week',
        'icon': '⚡',
        'points': 300,
        'rarity': 'uncommon',
        'check_function': lambda user: False  # Requires time-based check, implement separately
    },
    {
        'id': 'centurion',
        'name': 'Centurion',
        'description': 'Complete 100 jobs',
        'icon': '💯',
        'points': 1000,
        'rarity': 'epic',
        'check_function': lambda user: user.jobs_completed >= 100
    },
    {
        'id': 'perfectionist',
        'name': 'Perfectionist',
        'description': 'Maintain 5.0 rating for 50 jobs',
        'icon': '🌟',
        'points': 1500,
        'rarity': 'legendary',
        'check_function': lambda user: user.average_rating and float(user.average_rating) == 5.0 and user.jobs_completed >= 50
    },
    {
        'id': 'veteran',
        'name': 'Veteran',
        'description': 'Complete 500 jobs',
        'icon': '🏆',
        'points': 2500,
        'rarity': 'legendary',
        'check_function': lambda user: user.jobs_completed >= 500
    },
    {
        'id': 'safety_first',
        'name': 'Safety First',
        'description': 'Maintain perfect WHS compliance for 6 months',
        'icon': '🦺',
        'points': 250,
        'rarity': 'uncommon',
        'check_function': lambda user: user.public_liability_insurance and user.workers_comp_insurance and user.white_card_number
    },
    {
        'id': 'communicator',
        'name': 'Great Communicator',
        'description': 'Average 4.5+ communication rating over 20 jobs',
        'icon': '💬',
        'points': 200,
        'rarity': 'uncommon',
        'check_function': lambda user: False  # Requires specific rating analysis
    },
    {
        'id': 'reliable',
        'name': 'Rock Solid Reliable',
        'description': 'Average 4.5+ timeliness rating over 25 jobs',
        'icon': '⏰',
        'points': 350,
        'rarity': 'uncommon',
        'check_function': lambda user: False  # Requires specific rating analysis
    },
    {
        'id': 'quality_master',
        'name': 'Quality Master',
        'description': 'Average 4.8+ quality rating over 30 jobs',
        'icon': '🔨',
        'points': 400,
        'rarity': 'rare',
        'check_function': lambda user: False  # Requires specific rating analysis
    },
    {
        'id': 'level_up_5',
        'name': 'Rising Star',
        'description': 'Reach Level 5',
        'icon': '🌠',
        'points': 100,
        'rarity': 'common',
        'check_function': lambda user: (user.current_level or 1) >= 5
    },
    {
        'id': 'level_up_10',
        'name': 'Construction Legend',
        'description': 'Reach Level 10',
        'icon': '👑',
        'points': 500,
        'rarity': 'epic',
        'check_function': lambda user: (user.current_level or 1) >= 10
    },
    {
        'id': 'points_milestone_1000',
        'name': 'Point Collector',
        'description': 'Earn 1,000 points',
        'icon': '💰',
        'points': 150,
        'rarity': 'common',
        'check_function': lambda user: (user.total_points or 0) >= 1000
    },
    {
        'id': 'points_milestone_5000',
        'name': 'Point Master',
        'description': 'Earn 5,000 points',
        'icon': '💎',
        'points': 750,
        'rarity': 'rare',
        'check_function': lambda user: (user.total_points or 0) >= 5000
    },
    {
        'id': 'silver_league',
        'name': 'Silver Climber',
        'description': 'Reach Silver League',
        'icon': '🥈',
        'points': 200,
        'rarity': 'uncommon',
        'check_function': lambda user: user.seasonal_league in ['silver', 'gold', 'platinum', 'diamond']
    },
    {
        'id': 'gold_league',
        'name': 'Gold Standard',
        'description': 'Reach Gold League',
        'icon': '🥇',
        'points': 500,
        'rarity': 'rare',
        'check_function': lambda user: user.seasonal_league in ['gold', 'platinum', 'diamond']
    },
    {
        'id': 'platinum_league',
        'name': 'Platinum Elite',
        'description': 'Reach Platinum League',
        'icon': '🏅',
        'points': 1000,
        'rarity': 'epic',
        'check_function': lambda user: user.seasonal_league in ['platinum', 'diamond']
    },
    {
        'id': 'diamond_league',
        'name': 'Diamond Dynasty',
        'description': 'Reach Diamond League',
        'icon': '💍',
        'points': 2000,
        'rarity': 'legendary',
        'check_function': lambda user: user.seasonal_league == 'diamond'
    }
]

def get_achievement_by_id(achievement_id: str):
    """Get specific achievement definition by ID"""
    for achievement in ACHIEVEMENTS:
        if achievement['id'] == achievement_id:
            return achievement
    return None

def check_user_achievements(user_id):
    """
    Check which achievements user has earned.
    
    Example usage:
    earned = check_user_achievements(1)
    # Returns: ['first_job', 'five_star_worker']
    """
    from app.models.user import User
    from app.models.rating import UserAchievement
    from app.extensions import db
    import logging
    
    logger = logging.getLogger(__name__)
    
    try:
        user = User.query.get(user_id)
        if not user:
            return []
        
        earned_achievements = []
        
        for achievement in ACHIEVEMENTS:
            try:
                # Check if achievement is already earned
                existing = UserAchievement.query.filter_by(
                    user_id=user_id,
                    achievement_id=achievement['id']
                ).first()
                
                if existing:
                    continue  # Already has this achievement
                
                # Check if user qualifies for this achievement
                if achievement['check_function'](user):
                    # Create user achievement record
                    from datetime import datetime
                    
                    user_achieveme, timezonent = UserAchievement(
                        user_id=user_id,
                        achievement_id=achievement['id'],
                        earned_at=datetime.now(timezone.utc)
                    )
                    db.session.add(user_achievement)
                    
                    # Award points for the achievement
                    from app.utils.gamification import award_points
                    award_points(
                        user_id=user_id,
                        activity_type=f"achievement_{achievement['id']}",
                        points=achievement['points']
                    )
                    
                    earned_achievements.append(achievement['id'])
                    
                    logger.info(f"User {user_id} earned achievement: {achievement['name']} ({achievement['points']} points)")
                    
            except Exception as e:
                logger.error(f"Error checking achievement {achievement['id']} for user {user_id}: {e}")
                continue
        
        if earned_achievements:
            db.session.commit()
        
        return earned_achievements
        
    except Exception as e:
        logger.error(f"Error checking achievements for user {user_id}: {e}")
        db.session.rollback()
        return []

def get_user_achievement_progress(user_id):
    """Get user's progress toward all achievements"""
    from app.models.user import User
    from app.models.rating import UserAchievement
    
    try:
        user = User.query.get(user_id)
        if not user:
            return []
        
        # Get earned achievements
        earned = UserAchievement.query.filter_by(user_id=user_id).all()
        earned_ids = [ua.achievement_id for ua in earned]
        
        progress = []
        
        for achievement in ACHIEVEMENTS:
            is_earned = achievement['id'] in earned_ids
            
            # Calculate progress percentage (simplified)
            if is_earned:
                progress_percent = 100
            else:
                # Basic progress calculation based on achievement type
                if 'jobs_completed' in achievement['description']:
                    target = 1 if achievement['id'] == 'first_job' else (
                        100 if achievement['id'] == 'centurion' else
                        500 if achievement['id'] == 'veteran' else 10
                    )
                    progress_percent = min(100, (user.jobs_completed * 100) // target)
                elif 'Level' in achievement['description']:
                    target = 5 if achievement['id'] == 'level_up_5' else 10
                    progress_percent = min(100, ((user.current_level or 1) * 100) // target)
                elif 'points' in achievement['description'].lower():
                    target = 1000 if achievement['id'] == 'points_milestone_1000' else 5000
                    progress_percent = min(100, ((user.total_points or 0) * 100) // target)
                else:
                    progress_percent = 0
            
            progress.append({
                'achievement': achievement,
                'earned': is_earned,
                'progress_percent': progress_percent,
                'earned_at': None  # Could add earned date if needed
            })
        
        return progress
        
    except Exception as e:
        logger = logging.getLogger(__name__)
        logger.error(f"Error getting achievement progress for user {user_id}: {e}")
        return []

def get_rarity_multiplier(rarity: str) -> float:
    """Get point multiplier based on achievement rarity"""
    multipliers = {
        'common': 1.0,
        'uncommon': 1.2,
        'rare': 1.5,
        'epic': 2.0,
        'legendary': 3.0
    }
    return multipliers.get(rarity, 1.0)

def get_achievements_by_rarity(rarity: str):
    """Get all achievements of a specific rarity"""
    return [achievement for achievement in ACHIEVEMENTS if achievement['rarity'] == rarity]

def get_achievement_stats():
    """Get overall achievement statistics"""
    rarity_counts = {}
    total_points = 0
    
    for achievement in ACHIEVEMENTS:
        rarity = achievement['rarity']
        rarity_counts[rarity] = rarity_counts.get(rarity, 0) + 1
        total_points += achievement['points']
    
    return {
        'total_achievements': len(ACHIEVEMENTS),
        'rarity_distribution': rarity_counts,
        'total_possible_points': total_points,
        'rarity_breakdown': {
            rarity: get_achievements_by_rarity(rarity) 
            for rarity in ['common', 'uncommon', 'rare', 'epic', 'legendary']
        }
    }
