#!/usr/bin/env python3
import asyncio
import json
import aiosqlite
import os
import fcntl
import logging
from datetime import datetime

DATABASE_PATH = 'votes.db'

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

async def fix_ermakova_problem():
    """Исправляет проблему с Ермаковой - объединяет голоса"""
    
    async with aiosqlite.connect(DATABASE_PATH) as db:
        print("🔍 Анализ проблемы...")
        
        # 1. Проверяем активное голосование
        cursor = await db.execute(
            'SELECT id, variables FROM active_votes WHERE is_active = 1'
        )
        vote = await cursor.fetchone()
        
        if not vote:
            print("❌ Нет активных голосований")
            return
            
        vote_id, variables_json = vote
        print(f"📌 Активное голосование ID: {vote_id}")
        
        # 2. Смотрим варианты в active_votes
        variables = json.loads(variables_json)
        print("\n📋 Варианты в голосовании:")
        for var in variables:
            print(f"  - {var['name']}")
            if 'Ермакова' in var['name']:
                print(f"    ⚠️  ЭТО ЕРМАКОВА: {var['name']}")
        
        # 3. Проверяем голоса в user_votes
        cursor = await db.execute('''
            SELECT option_name, COUNT(*) as votes, 
                   GROUP_CONCAT(user_id) as voters
            FROM user_votes 
            WHERE vote_id = ?
            GROUP BY option_name
            ORDER BY option_name
        ''', (vote_id,))
        
        all_votes = await cursor.fetchall()
        
        print("\n📊 ТЕКУЩИЕ ГОЛОСА:")
        ermakova_votes = []
        for name, votes, voters in all_votes:
            print(f"  {name}: {votes} голосов")
            if 'Ермакова' in name:
                ermakova_votes.append((name, votes, voters))
        
        # 4. Анализируем проблему
        print("\n🔍 ПРОБЛЕМА С ЕРМАКОВОЙ:")
        if ermakova_votes:
            for name, votes, voters in ermakova_votes:
                print(f"  • {name}: {votes} голосов")
                print(f"    Голосовали: {voters}")
        else:
            print("  ❌ Голосов за Ермакову не найдено!")
            
        # 5. Ищем все варианты с Ермаковой в user_votes
        cursor = await db.execute('''
            SELECT DISTINCT option_name 
            FROM user_votes 
            WHERE vote_id = ? AND option_name LIKE '%Ермакова%'
        ''', (vote_id,))
        
        ermakova_names = await cursor.fetchall()
        
        if not ermakova_names:
            print("\n⚠️  Нет записей с 'Ермакова' в user_votes")
            return
            
        print(f"\n📝 Найдено {len(ermakova_names)} вариантов с Ермаковой:")
        for (name,) in ermakova_names:
            print(f"  - {name}")
        
        # 6. Находим правильное имя из active_votes
        correct_name = None
        for var in variables:
            if 'Ермакова' in var['name']:
                correct_name = var['name']
                break
                
        if not correct_name:
            print("❌ Не найден вариант с Ермаковой в active_votes")
            return
            
        print(f"\n✅ Правильное имя из active_votes: {correct_name}")
        
        # 7. Обновляем все голоса
        total_updated = 0
        for (old_name,) in ermakova_names:
            if old_name != correct_name:
                cursor = await db.execute('''
                    SELECT COUNT(*) 
                    FROM user_votes 
                    WHERE vote_id = ? AND option_name = ?
                ''', (vote_id, old_name))
                count = (await cursor.fetchone())[0]
                
                if count > 0:
                    print(f"\n🔄 Обновляю {count} голосов:")
                    print(f"   С: {old_name}")
                    print(f"   На: {correct_name}")
                    
                    # Обновляем
                    await db.execute('''
                        UPDATE user_votes 
                        SET option_name = ? 
                        WHERE vote_id = ? AND option_name = ?
                    ''', (correct_name, vote_id, old_name))
                    
                    total_updated += count
        
        if total_updated > 0:
            await db.commit()
            print(f"\n✅ УСПЕХ! Обновлено {total_updated} голосов")
        else:
            print("\nℹ️  Обновление не требуется - имена уже совпадают")
        
        # 8. Проверяем результат
        cursor = await db.execute('''
            SELECT option_name, COUNT(*) 
            FROM user_votes 
            WHERE vote_id = ? AND option_name LIKE '%Ермакова%'
            GROUP BY option_name
        ''', (vote_id,))
        
        final_results = await cursor.fetchall()
        
        print("\n📊 ФИНАЛЬНАЯ СТАТИСТИКА ПО ЕРМАКОВОЙ:")
        if final_results:
            for name, votes in final_results:
                print(f"  {name}: {votes} голосов")
        else:
            print("  Нет голосов за Ермакову")
        
        # 9. Общая статистика
        cursor = await db.execute('''
            SELECT option_name, COUNT(*) 
            FROM user_votes 
            WHERE vote_id = ?
            GROUP BY option_name 
            ORDER BY COUNT(*) DESC
        ''', (vote_id,))
        
        print("\n📈 ОБЩАЯ СТАТИСТИКА ГОЛОСОВАНИЯ:")
        total_votes = 0
        for name, votes in await cursor.fetchall():
            print(f"  {name}: {votes} голосов")
            total_votes += votes
        
        print(f"\nВсего голосов: {total_votes}")

async def check_direct_sql():
    """Прямая проверка через SQL"""
    import sqlite3
    
    conn = sqlite3.connect(DATABASE_PATH)
    cursor = conn.cursor()
    
    print("\n🔧 ПРЯМОЙ SQL-АНАЛИЗ:")
    print("="*50)
    
    # 1. Все уникальные варианты с Ермаковой
    cursor.execute('''
        SELECT DISTINCT option_name 
        FROM user_votes 
        WHERE option_name LIKE '%Ермакова%'
    ''')
    print("1. Все варианты с 'Ермакова' в user_votes:")
    for row in cursor.fetchall():
        print(f"   '{row[0]}'")
    
    # 2. Количество голосов за каждый вариант
    cursor.execute('''
        SELECT option_name, COUNT(*) 
        FROM user_votes 
        WHERE option_name LIKE '%Ермакова%'
        GROUP BY option_name
    ''')
    print("\n2. Голоса по вариантам:")
    for name, count in cursor.fetchall():
        print(f"   '{name}': {count} голосов")
    
    # 3. Правильное имя из active_votes
    cursor.execute('SELECT variables FROM active_votes WHERE is_active = 1')
    row = cursor.fetchone()
    if row:
        variables = json.loads(row[0])
        print("\n3. Варианты в active_votes:")
        for var in variables:
            if 'Ермакова' in var['name']:
                print(f"   Правильное имя: '{var['name']}'")
                correct_name = var['name']
                
                # 4. Быстрое исправление
                print(f"\n4. Быстрое исправление SQL:")
                cursor.execute(f'''
                    UPDATE user_votes 
                    SET option_name = ? 
                    WHERE option_name LIKE '%Ермакова%' AND option_name != ?
                ''', (correct_name, correct_name))
                
                updated = cursor.rowcount
                conn.commit()
                print(f"   Обновлено записей: {updated}")
    
    conn.close()

if __name__ == '__main__':
    print("🛠️  ИСПРАВЛЕНИЕ ПРОБЛЕМЫ С ЕРМАКОВОЙ")
    print("="*50)
    
    # Запускаем оба анализа
    asyncio.run(fix_ermakova_problem())
    
    print("\n" + "="*50)
    print("Быстрая проверка и исправление...")
    
    # Быстрое прямое исправление
    import sqlite3
    conn = sqlite3.connect(DATABASE_PATH)
    cursor = conn.cursor()
    
    # Получаем правильное имя
    cursor.execute('SELECT variables FROM active_votes WHERE is_active = 1')
    row = cursor.fetchone()
    
    if row:
        variables = json.loads(row[0])
        correct_name = None
        for var in variables:
            if 'Ермакова' in var['name']:
                correct_name = var['name']
                break
        
        if correct_name:
            print(f"\n🎯 Исправляю все варианты Ермаковой на: '{correct_name}'")
            
            # Находим все старые имена
            cursor.execute("SELECT DISTINCT option_name FROM user_votes WHERE option_name LIKE '%Ермакова%'")
            old_names = [row[0] for row in cursor.fetchall()]
            
            for old_name in old_names:
                if old_name != correct_name:
                    cursor.execute(
                        "UPDATE user_votes SET option_name = ? WHERE option_name = ?",
                        (correct_name, old_name)
                    )
                    print(f"   📝 '{old_name}' -> '{correct_name}'")
            
            conn.commit()
            
            # Проверяем результат
            cursor.execute(
                "SELECT option_name, COUNT(*) FROM user_votes WHERE option_name LIKE '%Ермакова%' GROUP BY option_name"
            )
            results = cursor.fetchall()
            
            print("\n✅ РЕЗУЛЬТАТ:")
            for name, count in results:
                print(f"   {name}: {count} голосов")
    
    conn.close()