# Дополнительные команды администратора и отладки

import json
from datetime import datetime
from .database import Database
from config import TELEGRAM_BOT_TOKEN


class AdminTools:
    """Инструменты для администратора"""
    
    def __init__(self, admin_id: int):
        self.admin_id = admin_id
        self.db = Database()
    
    def get_stats(self) -> str:
        """Получить общую статистику бота"""
        data = self.db.load_data()
        
        total_users = len(data)
        school_completed = sum(1 for u in data.values() if u.get('school_completed', False))
        butterfly_owners = sum(1 for u in data.values() if u.get('is_butterfly_owner', False))
        total_points = sum(u.get('total_points', 0) for u in data.values())
        
        stats = (
            f"📊 **Статистика бота**\n\n"
            f"👥 Всего пользователей: {total_users}\n"
            f"📚 Прошли школу: {school_completed}\n"
            f"🦋 Владельцев Бабочкария: {butterfly_owners}\n"
            f"⭐ Всего очков в системе: {total_points}\n"
        )
        
        return stats
    
    def reset_user_data(self, user_id: int) -> bool:
        """Сбросить данные пользователя (для тестирования)"""
        try:
            data = self.db.load_data()
            user_id_str = str(user_id)
            
            if user_id_str in data:
                del data[user_id_str]
                self.db.save_data(data)
                return True
        except:
            pass
        
        return False
    
    def backup_database(self, filename: str = None) -> bool:
        """Создать резервную копию базы данных"""
        try:
            import shutil
            from datetime import datetime
            
            if filename is None:
                filename = f"backup_users_{datetime.now().strftime('%Y%m%d_%H%M%S')}.json"
            
            backup_path = f"backups/{filename}"
            
            import os
            os.makedirs("backups", exist_ok=True)
            
            shutil.copy(self.db.users_file, backup_path)
            return True
        except:
            return False
    
    def export_leaderboard(self) -> str:
        """Экспортировать лидерборд"""
        ranking = self.db.get_users_ranking()
        teams_ranking = self.db.get_teams_ranking()
        
        text = "🏆 **ЛИДЕРБОРД**\n\n"
        text += "👥 **Топ пользователей:**\n"
        
        for idx, user in enumerate(ranking, 1):
            medal = "🥇" if idx == 1 else "🥈" if idx == 2 else "🥉" if idx == 3 else f"{idx}️⃣"
            text += f"{medal} {user['first_name']} — {user['total_points']} ⭐\n"
        
        text += "\n🏆 **Топ стай:**\n"
        
        for idx, team in enumerate(teams_ranking, 1):
            medal = "🥇" if idx == 1 else "🥈" if idx == 2 else "🥉" if idx == 3 else f"{idx}️⃣"
            text += f"{medal} {team['team_name']} — {team['total_points']} ⭐\n"
        
        return text


class DebugTools:
    """Инструменты отладки"""
    
    def __init__(self):
        self.db = Database()
    
    def validate_database(self) -> list:
        """Проверить целостность базы данных"""
        errors = []
        data = self.db.load_data()
        
        for user_id_str, user in data.items():
            # Проверяем обязательные поля
            if 'telegram_id' not in user:
                errors.append(f"User {user_id_str}: missing telegram_id")
            
            if 'first_name' not in user:
                errors.append(f"User {user_id_str}: missing first_name")
            
            if 'total_points' not in user:
                errors.append(f"User {user_id_str}: missing total_points")
            
            # Проверяем типы данных
            if not isinstance(user.get('total_points', 0), int):
                errors.append(f"User {user_id_str}: total_points is not int")
            
            if not isinstance(user.get('school_completed', False), bool):
                errors.append(f"User {user_id_str}: school_completed is not bool")
        
        return errors
    
    def print_user_data(self, user_id: int):
        """Распечатать данные пользователя для отладки"""
        user = self.db.get_user(user_id)
        if user:
            print(json.dumps(user, indent=2, ensure_ascii=False))
        else:
            print(f"User {user_id} not found")
    
    def clean_up_invalid_data(self):
        """Очистить некорректные данные"""
        data = self.db.load_data()
        
        for user_id_str, user in data.items():
            # Исправляем типы данных
            if 'total_points' in user and not isinstance(user['total_points'], int):
                try:
                    user['total_points'] = int(user['total_points'])
                except:
                    user['total_points'] = 0
            
            if 'school_completed' in user and not isinstance(user['school_completed'], bool):
                user['school_completed'] = bool(user['school_completed'])
        
        self.db.save_data(data)


# Пример использования (для тестирования)
if __name__ == "__main__":
    # Инструменты отладки
    debug = DebugTools()
    
    print("🔍 Проверка целостности базы данных...")
    errors = debug.validate_database()
    
    if errors:
        print(f"❌ Найдено {len(errors)} ошибок:")
        for error in errors:
            print(f"  - {error}")
    else:
        print("✅ База данных в порядке!")
    
    # Получить общую статистику
    print("\n📊 Статистика бота:")
    db = Database()
    data = db.load_data()
    print(f"Всего пользователей: {len(data)}")
