from db import execute_query
from collections import Counter
import random

def get_historical_prizes_by_channel(prize_column, limit=30):
    """
    ទាញយកប្រវត្តិលេខតាមប៉ុស្តិ៍នីមួយៗ (prize_a, prize_b, prize_c, prize_d) ដាច់ដោយឡែក
    """
    query = f"""
        SELECT {prize_column} FROM lottery_results 
        ORDER BY id DESC LIMIT %s
    """
    rows = execute_query(query, (limit,), fetch_all=True)
    if not rows:
        return []
    return [r[prize_column] for r in rows if r[prize_column] and len(r[prize_column].strip()) >= 5]

def analyze_channel_smart_numbers(prize_column):
    """
    វិភាគទិន្នន័យដាច់ដោយឡែក សម្រាប់តែប៉ុស្តិ៍មួយប៉ុណ្ណោះ (A ឬ B ឬ C ឬ D)
    """
    raw_numbers = get_historical_prizes_by_channel(prize_column, limit=50)
    
    # ប្រសិនបើគ្មានប្រវត្តិក្នុងប៉ុស្តិ៍នោះ បោះលេខ Random បណ្តោះអាសន្ន
    if not raw_numbers:
        rand_2d = f"{random.randint(0, 99):02d}"
        rand_3d = f"{random.randint(0, 999):03d}"
        return rand_2d, rand_3d

    # យកលេខក្នុងប៉ុស្តិ៍នោះមកកាត់ 2D និង 3D
    list_2d = [num.strip()[:2] for num in raw_numbers]
    list_3d = [num.strip()[-3:] for num in raw_numbers]

    # រកលេខដែលចេញញឹកញាប់ជាងគេ ក្នុងប៉ុស្តិ៍មួយហ្នឹង
    most_common_2d = Counter(list_2d).most_common(1)
    most_common_3d = Counter(list_3d).most_common(1)

    smart_2d = most_common_2d[0][0] if most_common_2d else f"{random.randint(0, 99):02d}"
    smart_3d = most_common_3d[0][0] if most_common_3d else f"{random.randint(0, 999):03d}"

    return smart_2d, smart_3d

def run_ai_engine(draw_time):
    """
    រត់ AI វិភាគដាច់ដោយឡែកពីគ្នា A -> A, B -> B, C -> C, D -> D
    """
    predictions = {}
    
    # Mapping ប៉ុស្តិ៍ ទៅ Columns ក្នុង Database
    prizes_map = {
        'A': 'prize_a',
        'B': 'prize_b',
        'C': 'prize_c',
        'D': 'prize_d'
    }

    for prize_label, db_column in prizes_map.items():
        # វិភាគតែ column prize_a សម្រាប់ A, column prize_b សម្រាប់ B ...
        pred_2d, pred_3d = analyze_channel_smart_numbers(db_column)
        predictions[prize_label] = {
            '2d': pred_2d,
            '3d': pred_3d
        }

    return predictions